文章 "强化学习中的随机决策森林" - 页 3

 
FxTrader562:

感谢您分享这篇非常有用的文章。

我试图在代码中添加更多指标,但我不是程序员专家,也没有使用成员函数的良好经验,因此我不知道如何在 OnInit() 函数中添加更多指标和规则。代码只包含 RSI 指标,并从中创建买入和卖出规则。能否提供更多指标的示例代码,如移动平均线或 MACD 或随机指标或 SAR,以便在代码中使用?

特别是,我想知道如何在与当前价格比较的同时创建规则并添加到进入条件中。当前代码的主要问题是,有时它会长时间持有亏损的交易,而快速关闭盈利的交易,因此,如果能提供这方面的建议,我将不胜感激。我认为需要对退出逻辑进行更多过滤。

另外,我还有一个问题,请您回答:

OPT 文件是否会持续更新,以便在长时间后通过微调策略本身来改进进入和退出?

还是说 EA 只是使用策略测试器来 优化 EA 值,并像普通优化 EA 一样使用最近盈利的相同进入和退出值?

我的意思是,像其他神经网络 EA 一样,它是否会在交易过程中微调交易进入和退出的整体策略?

您好。请等待下一篇文章。在下一篇文章中,我将研究其他指标以及各种代理的工作。而且没有模糊逻辑。

 
Maxim Dmitrievsky:

您好。请等待下一篇文章。在那里,我将研究其他指标以及各种代理的工作。而且不使用模糊逻辑。

谢谢您的快速回复......我会等的。

如果您不介意的话,请告诉我您打算什么时候发表下一篇包含指标实施代码的文章......

 
FxTrader562:

谢谢您的快速回复......我会再等等。

如果您不介意的话,请告诉我您打算什么时候发布下一篇包含指标执行代码的文章......

我认为俄文版需要 1-2 周时间,然后他们会进行翻译

 

不过,即使文章是俄文版的,也可以在普通 MT5 中下载和使用,对吗?

顺便说一下,我有一些改进奖励功能 逻辑的建议。但如果您觉得我的建议有用,请考虑在下一个版本中实施这些建议。

我希望奖励函数能根据 2 个因素的奖励总和来奖励代理:

1.Net profit( Orderprofit()+OrderCommission()+OrderSwap()):某个订单平仓的净利润(NP)奖励(RW1)将由奖励系数(RF1)决定,奖励系数的值大于 1,因此交易利润越大,奖励越多,亏损越大,负奖励越多。

RW1=NP*MathPow(RF1,2); 例如,RF1 的值可以是 1.1 或 1.2 或更多。

我的意思是,特定平仓订单的 RW1 应该是净利润(正或负利润)与奖励系数(RF1)平方的乘积。

2.连续盈利或亏损的次数(NCount):另一个奖励(RW2)应根据奖励因子(RF2)和连续亏损或盈利次数(NCount)计算的连续盈利或亏损给予。

在给予奖励之前,EA 应检查该特定符号的最后订单盈利或亏损情况,如果考虑到订单佣金和订单交换是净亏损,则将给予更多的负奖励;如果订单盈利平仓,则将给予更多的正奖励。

RW2=MathPow(NCount,RF2); RF2 值可以是 1.1 或 1.2 或更多。

例如,如果当前关闭的订单是正数,而之前的订单是负数,那么 NCount=1-1=0 和 RW2 将为零。或者,如果当前成交订单为正数,而之前的订单为正数,那么 NCount=1+1=2 因此 RW2=(2)^(1.2) 考虑到 RF2=1.2 的值,RW2=(2)^(1.2)

现在,某个订单平仓的净奖励(RW)应为 RW=RW1+RW2

如果您能在下一版 EA 中实现该代码,那就再好不过了;如果您能告诉我在哪里添加该代码,那我就自己试试看。

我认为最棒的是,如果我们能将 RF1 和 RF2 声明为全局变量,供 EA 优化使用,这样它就能在前向测试 EA 时找出 RF1 和 RF2 的最佳组合。

 

马克西姆-德米特里耶夫斯基,你好、

很抱歉提出这么多问题......因为我发现这篇文章在研究和实施 mql5 的机器学习时非常有用....,当然,我还在等待您的下一篇文章。

我的问题是,如何训练代理制定策略,使利润最大化,而不是盈利交易的数量最大化?

我研究了 updateReward() 和 updatePolicy() 代码,在我看来,它似乎只优化了盈利交易的数量,而忽略了每笔交易的利润,也忽略了账户余额是否在增长。

因此,能否请您说明一下如何将盈利金额整合到奖励函数中,是否有办法做到这一点?

我试着实现了上面提出的我自己的代码,但可能不起作用(虽然没有编码错误),或者我不知道如何实现。也可能是我没有完全理解 updateReward() 和 updatePolicy() 函数的具体功能。如果您能多解释一下这两个函数内部的代码,以及 RDFPolicyMatrix 如何存储、存储了哪些内容、这些值在下一次交易条目中如何使用,我将非常感激您的宝贵贡献。

不胜感激。

 

我可以看到 EA 在优化后立即获得最佳结果,但随着代理的自我训练,结果一天比一天差。因此,我想知道是否有可能在每次亏损后从代码中启动优化器。我的意思是,EA 不需要在每次亏损后都更新奖励,而是应该根据过去几天直到今天的数据进行自我优化。

如果作者或其他人知道如何实现这一点,请与我们分享。

 
Maxim Dmitrievsky:
它更多的不是树,而是在同一数据上训练多个森林,是的,确实如此。因为构建过程是随机的,结果可能会有所不同。让我感到惊讶的是,森林的集合会带来明显的改善,即在相同数据上训练多个森林,然后取平均值。(您也可以进行不同的设置。如果有突变,效果应该会更好,但我还没达到那个程度。

感谢您的文章,信息量很大,值得借鉴(至少对我来说)。

据我所知,这篇文章以模糊逻辑为例。并没有禁止直接获取 ts 的值(我已经实现了这一点,我没有注意到在效率上有什么特别的不同 - 森林完全可以替代模糊逻辑)。这可以看作是奖励对象的另一种方式。在我看来(我无法用程序确认),增加优化成员函数 的数量不会带来收益,因为现在森林已经堵塞了模糊逻辑。我试着平均森林(包括文章中的模糊)的结果,结果有所改善,在 AlgLIB 的神经网络之后,我对几年来值的学习速度感到惊讶。为了设置明显的差异,我使用了第二种森林创建形式,明确指出使用不同数量的指标(嗯,玩弄指标的组成甚至没有讨论):

CDForest::DFBuildRandomDecisionForestX1(RDFpolisyMatrix,numberOfsamples,iNeuronEntra,iNeuronSal,number_of_trees,7,regularization,RDFinfo,RDF[0],RDF_report);
CDForest::DFBuildRandomDecisionForestX1(RDFpolisyMatrix,numberOfsamples,iNeuronEntra,iNeuronSal,number_of_trees,5,regularization,RDFinfo,RDF[0],RDF_report);

您能告诉我还可以尝试哪些奖励形式吗?我对创建具有不同奖励形式的森林合集很感兴趣,顺便问一下,合集是叫平均值吗? 还是一种组合结果的特殊公式? 我不认为 AlgLIB 有森林合集?

这可能对某些人有用,当有多个森林时,将数据存储在一堆文件中很不方便,所以我决定这样做:

StructToHiden strHider;
   strHider.iNeuronEntra=iNeuronEntra;
   strHider.iNeuronSal=iNeuronSal;
   strHider.iTrees=number_of_trees;
   DataTekOpt=TimeLocal();
   strHider.DataTekOpt=DataTekOpt;
   
   int filehnd=FileOpen(NameFile+"_fuzzy.txt",FILE_WRITE|FILE_BIN|FILE_COMMON);
      strHider.iBufsize=RDFfuzzy.m_bufsize;
      FileWriteStruct(filehnd, strHider);//记录文件头
      FileWriteArray(filehnd,RDFfuzzy.m_trees); //树形记录
      FileClose(filehnd);


int filehnd=FileOpen(NameFile+"_fuzzy.txt",FILE_READ|FILE_BIN|FILE_COMMON);
      FileReadStruct(filehnd,strHider);//读取文件头
      RDFfuzzy.m_nvars=strHider.iNeuronEntra;
      RDFfuzzy.m_nclasses=strHider.iNeuronSal;
      RDFfuzzy.m_ntrees=strHider.iTrees;
      RDFfuzzy.m_bufsize=strHider.iBufsize;
      DataTekOpt=strHider.DataTekOpt;
      FileReadArray(filehnd,RDFfuzzy.m_trees);//阅读树
      FileClose(filehnd);
结构由任何结构描述,因为它的长度是固定的,所以把它和森林都存储在一个文件中(结构必然在开头)。一个森林--一个文件。

再次感谢这篇文章,多亏了它,我才开始认真研究 AlgLIB。
 
mov:

感谢您的文章,内容翔实,在应用中也有很多值得借鉴的地方(至少对我来说是这样)。

据我所知,文章以模糊逻辑为例。并没有禁止直接获取 ts 值(我已经实现了它,但我没有注意到在效率上有什么特别的不同 - 森林完全可以替代模糊逻辑)。这可以看作是奖励对象的另一种方式。在我看来(我无法用程序确认),增加优化成员函数 的数量不会带来收益,因为现在森林已经堵塞了模糊逻辑。我试着平均森林(包括文章中的模糊)的结果,结果有所改善,在 AlgLIB 的神经网络之后,我对几年来值的学习速度感到惊讶。为了设置明显的差异,我使用了第二种森林创建形式,明确指出使用不同数量的指标(嗯,玩弄指标的组成甚至没有讨论):

您能告诉我还可以尝试哪些奖励形式吗?我对创建具有不同奖励形式的森林合集很感兴趣,顺便问一下,合集是叫平均值吗? 还是一种组合结果的特殊公式? 我不认为 AlgLIB 有森林合集?

这可能对某些人有用,当有多个脚手架时,将数据存储在一堆文件中很不方便,所以我决定这样做:

结构可以用任何结构来描述,因为它的长度是固定的,所以可以把它和森林都存储在文件中(结构必然在开头)。一个森林--一个文件。

再次感谢这篇文章,多亏了它,我才开始认真研究 AlgLIB。

是的,以模糊逻辑为例。我自己已经放弃了,因为经过各种实验后发现,以这种形式使用它意义不大。

你可以尝试用当前的夏普比率或交易的 R^2 来奖励。或者,您也可以完全不评估交易结果,而是评估市场状况--如果您买入,而趋势已经持续增长了一段时间,那么这个信号就是合适的。诸如此类。

我说的合奏是指简单的平均结果,没错。但对于每一片森林,你都可以设置自己的预测因子和/或目标。

我打算再写一篇文章,以类的形式介绍代理的集合和更多优点。我可能很快就会完成。

还有一个重要的问题本文没有涉及,那就是对训练样本和测试样本的森林分类误差(oob)进行估算,这一点也将在本文中介绍。

感谢您提供的代码示例,还有一个通过序列化保存的选项

 
Maxim Dmitrievsky:+ 再加上一些福利,以课程的形式。我可能很快就会完成。

如果可能的话,请将历史训练功能作为一个例子,例如,在启动智能交易系统(模拟交易)时,不使用策略测试器。我自己也试着这么做,但我可以看出我的手是歪的,它是有效的,但在训练效率上远远不如在策略测试器中进行的训练。

 
mov:

如果可能的话,请举例说明通过历史记录进行训练的功能,例如,在不使用策略测试器 的情况下启动智能交易系统(模拟交易)。我自己也试着这么做,但我可以看出我的手是歪的,它是有效的,但在训练效率上远远不如在策略测试器中的训练。

是的,虚拟测试仪也在计划之中,但现在我们需要完善其他方面,例如,自动选择和减少预测因子是目前最重要的,这样模型就不会根据历史数据进行过多的重新训练。