: | : | :期货程序化 | :期货程序化研究 | :期货量化学习 | :期货量化 |
返回列表 发帖

固定记忆的多项式系统(The Fixed Memory Polynomial System)

固定记忆的多项式系统(The Fixed Memory Polynomial System)

固定记忆多项式系统描述

在 "Dennis Meyers短期系统和指标 "软件包中,我使用最小二乘法技术,通过30多个收盘价来拟合一条的直线和一条的二次线,以创建一条曲线,作为市场趋势的代表。当曲线从之前的本地低点向上移动了一定的百分比时,就会认为趋势已经改变为上升,并发出买入信号。当曲线从之前的本地高点向下移动了一定的百分比时,趋势就会被认为是向下行方向变化,并发出卖出信号。在这里,我将使用最小二乘法技术来拟合形式为的三阶多项式,以创建一条曲线,作为市场趋势的更好代表。立体多项式应该对基础趋势的变化做出更快的反应,并比直线和二次线版本更准确地模拟趋势变化。在开发三次多项式的代码时,我扩大了代码的使用范围,使其允许用户使用和测试任何形式的的阶次多项式。在测试中,我发现n=4以上的阶数没有提供额外的优势。然而,读者可能会发现不同的情况,因此可以使用n=6以下的任何顺序。

什么是固定记忆多项式滤波器?


固定记忆多项式滤波是简单的对固定数量的过去数据点进行形式的多项式的最小平方拟合。其中t是离散的时间条。时间可以是日线或一分钟线。假设时间条发生在固定的时间间隔内,所以Tic条不适合于这种分析。最小二乘法是一种数学技术,数据和被拟合的曲线之间的垂直距离的平方最小化。当净平方距离(也称为平方误差之和)最小化时,就会确定一组唯一的多项式的系数。这种类型的误差最小化在数学上是可以解决的,并且在科学和数学中被广泛使用。

对于三次方程,最小二乘法系数由以下矩阵方程的解得到:


其中
p(T)是今天的价格,p(T-1)是昨天的价格,p(1)是T天前的价格。
∑p(t)是t=1到T天的价格之和。
∑p(t)*t是t=1至T天的价格乘以t的总和。
∑t是指从t=1到T天的整数t的总和
∑t^2是指从t=1到T天的整数t的平方的总和,等等。

解决矩阵方程的程序可以在W. Press等人的 "Numerical Recipes "一书中找到,但是这些类型的矩阵方程求解器非常慢,对于这些类型的问题是不稳定的。它们会因为矩阵反转的问题而导致数值错误,并产生错误的结果。

幸运的是,这些类型的问题可以通过一种叫做离散正交1 Legendre多项式方法的方法轻松解决。这个方法在诺曼-莫里森的《序列平滑和预测介绍》一书中有详细的解释,第七章第223页,在本节末尾引用。

这里不做详述(见莫里森参考文献),现在多项式滤波器可以用以下方式表示:

其中n是多项式阶数,T是最小二乘法拟合中使用的数据的总条数,以及



j(t)=归一化的离散Legendre多项式 t=0到T的整数

现在可以求出三次多项式的系数0、1、2、3,我们可以生成对第二天收盘的预测,其公式为


最小二乘法系统的定义

最小二乘法的预测是通过使用过去T天的收盘价和上面的方程式求解每天的最小二乘法系数来建立的。然后根据上面的方程式构建PF(T+1),并在价格图下绘制。一般来说,我们要做的是按照PF的曲线绘制。当曲线从之前的低点上升一个百分点时,我们将做多。当曲线从之前的高点下降了一个百分点时,我们将做空。此外,我们希望能够跳过价格方向上的快速移动的主要变化。

因此,如果PF大于两天前的PF的百分比量pctjpup,我们将做多。如果PF小于两天前的PF,百分比为pctjdn,我们将做空。

买入规则:
如果在做空时,PF比PF的最低记录上升了超过百分数pctup,那么在明天开盘时买入BP期货。
或者
如果PF比两天前的PF多出pctjup的百分比,则在明天开盘时买入BP期货。

卖出规则:
如果在做多时,PF比PF的最高记录下降了超过百分数pctdn,则在明天开盘时卖出BP期货。
或者
如果PF比两天前的PF少了pctjdn的百分比,则在明天开盘时卖出BP期货。

使用英镑连续期货合约的前行优化

使用立方体系统对英镑连续期货合约进行了前行优化。英国石油期货于1975年开始交易。然而,在本报告中,我们将把我们的研究限制在从1989年1月1日到今天的价格历史。最初的实验发现,五年的测试段对BP走势测试是最好的。

步进程序将被应用如下。从数据的开始,1989年1月1日到1993年12月31日,选择一个5年的时间,通过对这个每日数据段的优化,找到系统参数值。然后将找到的参数值应用于测试段后一年的样本外数据,在本例中是1994年。然后对1994年的样本外结果进行制表和保存。

接下来,数据测试窗口向前移动一年,从1990年1月1日到1994年12月31日,并找到新的最佳参数值。新的最佳参数被应用于1995年的样本外结果,并将1995年的样本外结果列表。

移动数据测试窗口每次向前走一年,为每个5年的窗口数据段创造最佳值。从这些窗口得出的最佳参数被应用于测试数据窗口以外的年份。最后,所有列表中的一年的样本外结果被合并,形成一个大的样本外结果段。这种计算密集型方法背后的理论是,可用于建模和寻找参数的价格动态会随着时间缓慢变化。假设在事情发生变化和模型崩溃之前,有足够的数据可以预测未来很短的时间。事件和技术需要时间来改变事物,所以假设使用基于前五年的最佳值将足以在未来一年使用。

在解决5年时间段的最佳参数时,参数被分成了两组。首先,我将pctup和pctdn设置为99,这有效地消除了它们。然后,我先用大步测试N、pctjup和pctjdn,然后用小步测试,因为我确定了良好的参数范围。然后将N、pctjup和pctjdn设置为最佳值,我测试pctup和pctdn的最佳值。

系统输入参数和定义
Mark=0,Mark=0意味着该头寸在最后一个条形图上没有被标记到市场。Mark=1意味着它是。
pw = 3, 多项式的顺序。2=二次型,3=立方型,等等。pw的最大值=6。
N = 40, 最小二乘法pw阶计算中的天数。这等于上述公式中的T。
pctup = 0.4, 曲线从之前的低点上升的百分比。 pctdn = 1.1, 曲线从之前的高点下降的百分比。 pctjup = 0.20, 曲线从2天前上升的百分比。
pctjdn = 1.10, 曲线比2天前减少的百分比。

为优化运行所检查的参数范围
N = 10至60,步长为5,然后是24至48,步长为2
pctup = 0.1至2,步长为0.05,数值为99时,该参数不能发布买卖信息 pctdn = 0.1至2,步长为0.05,数值为99时,该参数不能发布买卖信息 pctjup = 0.1至1.0,步长为0.05。如果数值为99,则该参数不能用于发布购买和销售pctjdn = 0.1至1.0,步长为0.05。如果数值为99,则该参数不能发布买入和卖出信息。

BP 立方系统的前进性能总结 01/04/89-12/31/97


其中
TNPft = 5年优化试验段的总净利润。
%P = 优化测试部分的盈利百分比。
MaxDD = 优化测试部分的最大日内跌幅。
LBgLTd = 优化测试部分的最大亏损交易长线。
SBgLTd = 优化测试段中最大亏损交易的空头。
1YrOpt = 曲线拟合时间段的一年的美元利润,由该时间段的最佳参数产生。这是5年时间段中最后一年的曲线拟合利润。
1YrOOS = 由前一个时间段的最佳参数产生的一年的美元利润或损失。这是该年的样本外利润。
OOS = 样本外的结果。

设置

设置工作区,如手册中的如何设置一个新的工作区与数据系列一节所述。该系统被命名为#FixedMemPoly,指标被命名为#FixedMemPoly。打开为该系统和指标设置的工作区。点击菜单栏上的 "插入"。在弹出的菜单中点击分析技术。

弹出一个题为 "插入分析技术 "的窗口。确保右侧的 "格式 "复选框被选中。点击 "系统 "选项卡。找到系统#FixedMemPoly,点击它以突出显示。点击 "绘图 "按钮。一个题为 "格式化系统 "的窗口。

#FixedMemPoly的窗口将弹出。如果你想的话,可以通过点击编辑来改变输入值,或者让它们保持不变。然后点击确定,系统的买入和卖出箭头就会显示在图表上。

要插入#FixedMemPoly指标,请遵循上述步骤,只是在插入分析技术窗口框中点击指标标签而不是系统标签,并遵循相同的步骤。该指标将显示在图表上。

函数的定义和使用

该函数被命名为$FixMemPoly。这是将系统做成二进制函数的形式。该函数在系统买入时等于+1,在系统卖出时等于-1。这个函数可以与其他系统函数的任何组合结合成一个新的系统。例如,如果function1(p1,p2,p3)是函数形式的system1,那么用户可以写下面的简单代码,将$FixMemPoly与function1组合成一个新的系统。

如果$FixMemPoly(pw,N,pctup,pctdn,pctjup,pctjdn)=1和function1(p1,p2,p3)=1则在市场上买入。
如果$FixMemPoly(pw,N,pctup,pctdn,pctjup,pctjdn)=-1并且function1(p1,p2,p3)=-1则在市场上卖出。

用户可以直接在函数中输入参数的当前值,而不是参数名称,或者用户可以为这个新组合重新优化任何参数。

参考文献
1. Meyers, Dennis. "英镑的立方体",《股票和商品的技术分析》,第16卷:,1998年11月
2. Morrison, Norman "Introduction to Sequential Smoothing and Prediction", McGraw-Hill Book Company, New York, 1969.
3. Press, William H., et al, "Numerical Recipes in C:", Cambridge Press, New York, 1993.

论坛官方微信、群(期货热点、量化探讨、开户与绑定实盘)
 
期货论坛 - 版权/免责声明   1.本站发布源码(包括函数、指标、策略等)均属开放源码,用意在于让使用者学习程序化语法撰写,使用者可以任意修改语法內容并调整参数。仅限用于个人学习使用,请勿转载、滥用,严禁私自连接实盘账户交易
  2.本站发布资讯(包括文章、视频、历史记录、教材、评论、资讯、交易方案等)均系转载自网络主流媒体,内容仅为作者当日个人观点,本网转载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。本网不对该类信息或数据做任何保证。不对您构成任何投资建议,不能依靠信息而取代自身独立判断,不对因使用本篇文章所诉信息或观点等导致的损失承担任何责任。
  3.本站发布资源(包括书籍、杂志、文档、软件等)均从互联网搜索而来,仅供个人免费交流学习,不可用作商业用途,本站不对显示的内容承担任何责任。请在下载后24小时内删除。如果喜欢,请购买正版,谢谢合作!
  4.龙听期货论坛原创文章属本网版权作品,转载须注明来源“龙听期货论坛”,违者本网将保留追究其相关法律责任的权力。本论坛除发布原创文章外,亦致力于优秀财经文章的交流分享,部分文章推送时若未能及时与原作者取得联系并涉及版权问题时,请及时联系删除。联系方式:http://www.qhlt.cn/thread-262-1-1.html
如何访问权限为100/255贴子:/thread-37840-1-1.html;注册后仍无法回复:/thread-23-1-1.html;微信/QQ群:/thread-262-1-1.html;网盘链接失效解决办法:/thread-93307-1-1.html

程式码部分:
  1. {System: #FixedMemPoly}
  2. input: Mark(1),pw(3),N(40),pctup(0.2),pctdn(1.7),pctjup(0.15),pctjdn(0.7),prc(c);
  3. vars: ii(0),temp(0),xplus(c),jj(0),kk(0),LL(0),pwx(1),oneplus(1),oneminus(1),buystop(0),sellstop(0),h_ep(c),l_ep(c),bopos(0),oneplus2(1),oneminus2(1);
  4. array: beta[6](0),x[100](0),lg[6,100](0);

  5. if currentbar=1 then begin
  6. xplus=prc;
  7. temp=0;
  8. LL=N-1;
  9. pwx=pw;
  10. if pwx>6 then pwx=6;
  11. oneplus=1+(pctup/100);
  12. oneminus=1-(pctdn/100);
  13. h_ep=xplus; l_ep=xplus;
  14. buystop=l_ep*oneplus;
  15. sellstop=h_ep*oneminus;
  16. oneplus2=1+(pctjup/100);
  17. oneminus2=1-(pctjdn/100);
  18. for ii=0 to pwx begin
  19. for kk=0 to LL+1 begin
  20. lg[ii,kk]=$legenPoly(ii,kk,LL);
  21. end;
  22. end; {ii}
  23. end else begin
  24. for ii=0 to LL begin jj=LL-ii;
  25. x[jj]=prc[ii];
  26. end;
  27. for ii=0 to pwx begin
  28. beta[ii]=0;
  29. for kk=0 to LL begin
  30. beta[ii]=beta[ii]+x[kk]*lg[ii,kk];
  31. end;
  32. end; {ii}
  33. xplus=prc;
  34. temp=0;
  35. for ii=0 to pwx begin
  36. temp=temp+beta[ii]*lg[ii,LL+1];
  37. end;
  38. xplus=temp;
  39. {=================UP DWN %CHG from previous cls local high or low===================}
  40. bopos=bopos[1];
  41. if bopos[1] >= 0 then begin
  42. if xplus > h_ep then begin
  43. h_ep=xplus;
  44. sellstop=h_ep*oneminus;
  45. end;
  46. if xplus <= sellstop and prc<xplus[1] then begin
  47. bopos=-1;
  48. l_ep=xplus;
  49. buystop=l_ep*oneplus;
  50. end;
  51. end;{pos[1] if}
  52. if bopos[1]<=0 then begin
  53. if xplus < l_ep then begin
  54. l_ep=xplus;
  55. buystop=l_ep*oneplus;
  56. end;
  57. if xplus >=buystop and prc>xplus[1] then begin
  58. bopos=1;
  59. h_ep=xplus;
  60. sellstop=h_ep*oneminus;
  61. end;
  62. end;{pos[1]<=0 if}
  63. {end;}{ pctup=99}
  64. if marketposition<=0 then begin
  65. if pctup<>99 then if bopos>0 and bopos[1]<>bopos then buy("B%LSup") at market;
  66. if pctjup<>99 then if xplus>xplus[2]*oneplus2 then begin
  67. bopos=1;
  68. h_ep=xplus;
  69. sellstop=h_ep*oneminus;
  70. buy ("B2dy%jmp") at the market;
  71. end;
  72. end;
  73. if marketposition>=0 then begin
  74. if pctdn<>99 then if bopos<0 and bopos[1]<>bopos then sell("S%LSdn") at market;
  75. if pctjdn<>99 then if xplus<xplus[2]*oneminus2 then begin
  76. bopos=-1;
  77. l_ep=xplus;
  78. buystop=l_ep*oneplus;
  79. sell ("S2dy%jmp") at market;
  80. end;
  81. end;
  82. if date=lastcalcdate and mark=1 then begin
  83. if marketposition=-1 then exitshort("SMrkToMkt") on close;
  84. if marketposition=1 then exitlong("LMrkToMrt") on close;
  85. end;
  86. end; {else}
复制代码
如何访问权限为100/255贴子:/thread-37840-1-1.html;注册后仍无法回复:/thread-23-1-1.html;微信/QQ群:/thread-262-1-1.html;网盘链接失效解决办法:/thread-93307-1-1.html

TOP

运行效果图:
如何访问权限为100/255贴子:/thread-37840-1-1.html;注册后仍无法回复:/thread-23-1-1.html;微信/QQ群:/thread-262-1-1.html;网盘链接失效解决办法:/thread-93307-1-1.html

TOP

原版PDF文档:【翻译有不准确的地方可以参考原文档!】












如何访问权限为100/255贴子:/thread-37840-1-1.html;注册后仍无法回复:/thread-23-1-1.html;微信/QQ群:/thread-262-1-1.html;网盘链接失效解决办法:/thread-93307-1-1.html

TOP

返回列表