欢迎光临散文网 会员登陆 & 注册

量化交易软件:交易策略中的模糊逻辑

2023-07-19 16:10 作者:bili_45793681098  | 我要投稿

交易者经常想知道如何通过机器学习来改善交易系统或创建新的交易系统。尽管有大量出版物发表, 依然未能找到一个不借助计算机辅助计算来建立简单、直观分析模型的方法。模糊逻辑是机器学习世界的一个窗口。结合遗传算法, 它能够扩展创建自学习或易于优化的交易系统的能力。同时, 模糊逻辑是直观的, 因为它在模糊的 (虚化的) 条例中封装了清晰的数值信息, 就像一个人在思考过程中所做的那样。

编辑切换为居中

此处是一个例子。在清晰的逻辑层面, 运动车辆的速度由测量设备判定: 例如, 60 千米/小时。但一个没有测量设备且漫不经心的观察者只能依靠他的经验或认知基础来粗略地估计车辆的速度。例如, 已知车辆可以快速行驶, 而 "快速" 大约定义为 100 千米/小时以上。同样已知, 一辆车也可慢速运动, 即 5-10 千米/小时。最后, 如果相应的车辆以中等速率增加, 则目视评估速度为平均 (约 60 千米/小时)。因此, 可以用四种不同的表达式来表征 60 千米/小时:

  • 平均速度;

  • 速度接近平均水平;

  • 比平均快;

  • 以及最后, 比平均慢。

这就是信息如何被封装在人的意识中, 令他只需掌握当前必要的信息, 例如: "如果车辆行驶速度 不是很快, 我是否有时间穿过马路?"。在做出任何具体的决定之前: "跑过马路或让车先行", 一次性地深入思考所有事情会迫使一个人花费大量的时间和精力。与此同时, 彻底研究当前形势, 而其也许今后永远不会重现, 只会有类似的轮廓。在机器学习中, 这种情况被称为过度拟合。

本文不会深入到模糊逻辑理论。有关此主题的信息可以在互联网和 MQL5 网站 上获得。赫兹量化交易现在立即开始实践, 用理论节选和奇妙的事实来解释。

为了构建模型, 使用标准赫兹量化交易终端软件包中提供的 模糊逻辑 函数库。

成果为现成的是基于模糊逻辑的智能交易系统, 可作为建立定制系统的一个例子。

创建交易系统的原型

赫兹量化交易继续创建 清晰的 交易逻辑, 这将作为进一步研究的基础。然后可以比较两个相同的系统, 其中第二个将运用模糊逻辑。

将使用 3 个不同周期的 RSI 振荡器作为基础:

hnd1 = iRSI(_Symbol,0,9,PRICE_CLOSE); hnd2 = iRSI(_Symbol,0,14,PRICE_CLOSE); hnd3 = iRSI(_Symbol,0,21,PRICE_CLOSE);

赫兹量化交易将信号的清晰条件公式化, 并在函数中定义它们:

double CalculateSignal() { double res =0.5; CopyBuffer(hnd1,0,0,1,arr1); CopyBuffer(hnd2,0,0,1,arr2); CopyBuffer(hnd3,0,0,1,arr3); if(arr1[0]>70 && arr2[0]>70 && arr3[0]>70) res=1.0;                    // 如果所有指标都处于超买区域, 卖出 if(arr1[0]<30 && arr2[0]<30 && arr3[0]<30) res=0.0;                    // 如果所有指标都处于超卖区域, 买入 if(arr1[0]<30 && arr2[0]<30 && arr3[0]>70) res=0.5;                    // 如果 2 个超卖, 1 个超买, 则无信号 if(arr1[0]<30 && arr2[0]>70 && arr3[0]<30) res=0.5; if(arr1[0]>70 && arr2[0]<30 && arr3[0]<30) res=0.5; if(arr1[0]>70 && arr2[0]>70 && arr3[0]<30) res=0.5;                    // 如果 2 个超买, 1 个超卖, 则无信号 if(arr1[0]>70 && arr2[0]<30 && arr3[0]>70) res=0.5; if(arr1[0]<30 && arr2[0]>70 && arr3[0]>70) res=0.5; if(arr1[0]<30 && arr2[0]<30 && (arr3[0]>40 && arr3[0]<60)) res=0.0;    // 如果 2 个超卖, 第 3 个范围在 40 - 60, 则为买入信号 if(arr1[0]<30 && (arr2[0]>40 && arr2[0]<60) && arr3[0]<30) res=0.0; if((arr1[0]>40 && arr1[0]<60) && arr2[0]<30 && arr3[0]<30) res=0.0; if(arr1[0]>70 && arr2[0]>70 && (arr3[0]>40 && arr3[0]<60)) res=1.0;    // 如果 2 个超买, 第 3 个范围在 40 - 60, 则为卖出信号 if(arr1[0]>70 && (arr2[0]>40 && arr2[0]<60) && arr3[0]>70) res=1.0; if((arr1[0]>40 && arr1[0]<60) && arr2[0]>70 && arr3[0]>70) res=1.0; return(res); }


下一步, 赫兹量化交易编写所有其它的服务函数, 针对 EURUSD, 时间帧 М15 和 М5, 从 2017 年初开始测试 (完整的 智能系统代码附于文章末尾):


编辑切换为居中



编辑切换为居中

尽管已经定义了三个指标组合的清晰条件, 这些条件是合乎逻辑且一致的, 但这种方法过于简单和僵化。平均而言, 这个系统在 8 个月的时间内既没亏损也没赚钱。为了赚取收益, 有必要遍历多种条件组合, 并可能添加更多的振荡器。但这里没留下太多的优化控件, 因为条件设置极端精确。

赫兹量化交易尝试运用模糊逻辑来虚化交易系统盈利的条件。

创建一个模糊逻辑模型

首先, 必须包含模糊函数库。准确地说, 使用两种可用的模糊逻辑模型之一 - Mamdani 或 Sugeno。它们之间的区别在于, Sugeno 无需创建模糊项集合形式的输出变量即可输出一个线性模型, 而 Mamdani 提供这个元素。由于这篇文章是为模糊交易者撰写的, 所以将使用 Mamdani。但这并不意味着 Sugeno 模型不适用于某些特定的任务: 依据对模糊逻辑的基本理解, 进行实验始终是可能的且必要的。

#include <Math\Fuzzy\MamdaniFuzzySystem.mqh> CMamdaniFuzzySystem *OurFuzzy=new CMamdaniFuzzySystem();

函数库已包含在内, 声明 Mamdani 类的引用。这就是开始所需的一切。

现在赫兹量化交易来研究构建模糊推理的主要阶段。它在模糊建模系统中占据着中心地位。模糊推理过程是运用模糊逻辑的基本操作, 基于模糊假设获得模糊结论的具体过程或算法。

模糊推理有 7 个阶段。

  • 判断模糊推理系统的结构。

输入和输出的数量, 以及成员函数在设计阶段即已定义。在赫兹量化交易的案例中, 会有 4 个输入, 1 个输出, 每个输入都有 3 个成员函数。

  • 形成模糊推理系统的规则基准。

在开发过程中, 赫兹量化交易基于交易系统的专业判断, 创建模糊推理的自定义规则。

  • 输入变量的模糊化。

在模糊推理系统输入变量的数值, 与语言变量对应项的成员函数的值之间设置对应关系。

  • 聚合

判断模糊推理系统每条规则的条件真实度的过程。

  • 激活

查找构成所有模糊生产规则的核心后果的每个基本命题 (小节) 的真实度的过程。

  • 积累

为每个输出的语言变量查找成员函数的过程。

  • 去模糊化

从输出的语言变量的成员函数过渡为清晰 (数字) 值的过程。输出值将在从 0 到 1 范围内。

应该指出的是, 只有第 1 点和第 2 点需要执行, 其它所有的操作都将由系统完成, 无需干预。若对模糊逻辑操作所有阶段的细微之处感兴趣的人可在 这里 找到更多细节。

判断模糊推理系统的结构

赫兹量化交易继续创建模型。定义三个输入和一个输出的对象, 以及辅助字典对象, 以便于运用逻辑操作:

CFuzzyVariable *firstInput=new CFuzzyVariable("rsi1",0.0,1.0); CFuzzyVariable *secondInput=new CFuzzyVariable("rsi2",0.0,1.0); CFuzzyVariable *thirdInput=new CFuzzyVariable("rsi3",0.0,1.0); CFuzzyVariable *fuzzyOut=new CFuzzyVariable("out",0.0,1.0); CDictionary_Obj_Double *firstTerm=new CDictionary_Obj_Double; CDictionary_Obj_Double *secondTerm=new CDictionary_Obj_Double; CDictionary_Obj_Double *thirdTerm=new CDictionary_Obj_Double; CDictionary_Obj_Double *Output;

三个不同周期的 RSI 将被用作输入。由于 RSI 振荡器始终在 0-100 范围内, 因此必须为其创建一个具有相同维度的变量。但为方便起见, 指标值将被常规化到 0-1 的范围。请记住, 所创建变量的维度必须等于输入向量的维度, 即它必须包含所有的值。输出也设置为从 0 到 1 的范围。

根据模糊逻辑创建的第 1 点, 还需要定义和配置成员函数。这将在 OnInit() 事件处理程序中完成:

firstInput.Terms().Add(new CFuzzyTerm("buy", new CZ_ShapedMembershipFunction(0.0,0.6))); firstInput.Terms().Add(new CFuzzyTerm("neutral", new CNormalMembershipFunction(0.5, 0.2))); firstInput.Terms().Add(new CFuzzyTerm("sell", new CS_ShapedMembershipFunction(0.4,1.0))); OurFuzzy.Input().Add(firstInput);   secondInput.Terms().Add(new CFuzzyTerm("buy", new CZ_ShapedMembershipFunction(0.0,0.6))); secondInput.Terms().Add(new CFuzzyTerm("neutral", new CNormalMembershipFunction(0.5, 0.2))); secondInput.Terms().Add(new CFuzzyTerm("sell", new CS_ShapedMembershipFunction(0.4,1.0))); OurFuzzy.Input().Add(secondInput);   thirdInput.Terms().Add(new CFuzzyTerm("buy", new CZ_ShapedMembershipFunction(0.0,0.6))); thirdInput.Terms().Add(new CFuzzyTerm("neutral", new CNormalMembershipFunction(0.5, 0.2))); thirdInput.Terms().Add(new CFuzzyTerm("sell", new CS_ShapedMembershipFunction(0.4,1.0))); OurFuzzy.Input().Add(thirdInput);   fuzzyOut.Terms().Add(new CFuzzyTerm("buy", new CZ_ShapedMembershipFunction(0.0,0.6))); fuzzyOut.Terms().Add(new CFuzzyTerm("neutral", new CNormalMembershipFunction(Gposition, Gsigma))); fuzzyOut.Terms().Add(new CFuzzyTerm("sell", new CS_ShapedMembershipFunction(0.4,1.0))); OurFuzzy.Output().Add(fuzzyOut);

现在我们看看成员函数是什么样, 以及它的用途是什么。

已经为每个输入 (和一个输出) 变量创建了三个条例: "买入", "中性", "卖出", 每个都有自己的成员函数。换言之, 振荡器值现在可以被划分到 3 个模糊组, 并且可以使用成员函数为每个组分配一定范围的值。用模糊逻辑的语言来说, 已经创建了 4 个条例集, 每个条例集有 3 个条例。为了描绘上述情况, 赫兹量化交易将编写一个简单的脚本, 用于条例及其成员函数的可视化:

//+------------------------------------------------------------------+ //|                                      Our MembershipFunctions.mq5 | //|                                   版权所有 2016, MetaQuotes 软件公司| //|                                             https://www.mql5.com | //+------------------------------------------------------------------+ #include <Math\Fuzzy\membershipfunction.mqh> #include <Graphics\Graphic.mqh> //--- 创建成员函数 CZ_ShapedMembershipFunction func2(0.0, 0.6); CNormalMembershipFunction func1(0.5, 0.2); CS_ShapedMembershipFunction func3(0.4, 1.0); //--- 创建成员函数的包装 double NormalMembershipFunction1(double x) { return(func1.GetValue(x)); } double ZShapedMembershipFunction(double x) { return(func2.GetValue(x)); } double SShapedMembershipFunction(double x) { return(func3.GetValue(x)); } //+------------------------------------------------------------------+ //| 脚本程序启动函数                                                    | //+------------------------------------------------------------------+ void OnStart()  { //--- 创建图形   CGraphic graphic;   if(!graphic.Create(0,"Our MembershipFunctions",0,30,30,780,380))     {      graphic.Attach(0,"Our MembershipFunctions");     }   graphic.HistoryNameWidth(70);   graphic.BackgroundMain("Our MembershipFunctions");   graphic.BackgroundMainSize(16); //--- 创建曲线   graphic.CurveAdd(NormalMembershipFunction1,0.0,1.0,0.01,CURVE_LINES,"[0.5, 0.2]");   graphic.CurveAdd(ZShapedMembershipFunction,0.0,1.0,0.01,CURVE_LINES,"[0.0, 0.6]");   graphic.CurveAdd(SShapedMembershipFunction,0.0,1.0,0.01,CURVE_LINES,"[0.4, 1.0]"); //--- 设置 X 轴属性   graphic.XAxis().AutoScale(false);   graphic.XAxis().Min(0.0);   graphic.XAxis().Max(1.0);   graphic.XAxis().DefaultStep(0.1); //--- 设置 Y 轴属性   graphic.YAxis().AutoScale(false);   graphic.YAxis().Min(0.0);   graphic.YAxis().Max(1.1);   graphic.YAxis().DefaultStep(0.1); //--- 绘图   graphic.CurvePlotAll();   graphic.Update();  }

在图表上运行脚本:


编辑切换为居中

所选的这些成员函数, 是因为它们只有 2 个可优化的输入参数 (这将在稍后的系统测试阶段完成)。它们也很好地描述了这个系统的极值和中心位置。您可以应用模糊函数库中 可用的 任何成员函数。


量化交易软件:交易策略中的模糊逻辑的评论 (共 条)

分享到微博请遵守国家法律