卡尔曼消隐记忆滤波系统(The Kalman Fading Memory Filter System)
UID 2 积分 2725616 威望 1312804 布 龙e币 1412812 刀 注册时间 2009-12-3 最后登录 2024-5-4
卡尔曼消隐记忆滤波系统(The Kalman Fading Memory Filter System)
卡尔曼消隐记忆滤波系统(The Kalman Fading Memory Filter System)
卡尔曼消逝记忆滤波器描述
卡尔曼消逝记忆滤波器是一个连续自适应的状态过程。这意味着,在任何瞬间,被测量的过程(在我们的例子中是价格序列)由噪声位置(价格)和先前对价格的最佳卡尔曼估计组成。当价格开始偏离估计值时,卡尔曼方程中的加权因子被优化改变,以最小化噪声过程,同时给出下一个条形价格的最佳估计。
让xn+1代表n+1时间的真实价格(没有添加噪声的价格)。让 代表在时间n+1的价格系列的估计预测价格,基于到时间n为止(包括时间n)的测量结果。
卡尔曼解决的问题是找到最佳估计值,该估计值能使以下的均方误差(MSE)最小化
卡尔曼方程的一个解决方案产生了最佳的消隐记忆滤波器,以标量形式还原为以下方程:
与g-h和g-h-k卡尔曼滤波器相反,这里我们将不假定在滤波器和噪声+价格时间序列之间会达到一个稳定状态。因此,卡尔曼增益因子k n根据卡尔曼预测价格和价格实际值之间的误差,在每次测量中递归更新。
卡尔曼衰减记忆滤波器是两个固定参数l l和a a的函数。l l(Lammda)是一个介于0和1之间的权重系数,它决定了k n,卡尔曼增益因子,可以随着平均平方误差r n的变化而变化的速度。a a(alpha),0<a a<1,决定了在计算当前平均平方误差r n时,日平方误差err 2的过去值如何变得指数级地小,也就是渐渐消失。l l和a a都必须通过优化确定。
我们现在有了自适应滤波器中的最优方案。这个滤波器的自适应参数k n的变化是最优化的,在估计明天的价格时,白噪声最小。这是否意味着这种技术优于所有其他系统和指标?不是的,这只意味着如果价格序列服从卡尔曼的白色不相关噪声和线性的假设,这将是一个优越的过滤器。不幸的是,我们不知道真实的价格序列是否服从这些假设。.
卡尔曼消逝记忆滤波器系统的定义
有许多方法可以从上面描述的卡尔曼消逝记忆滤波器中构建一个系统。
这里我们将使用与第三章中描述的固定记忆多项式滤波器系统类似的曲线跟踪技术。
卡尔曼消逝记忆滤波器预测是通过递归求解上述方程(1)到(4)构建的。让P F定义为方程(4)中的x* n+1,n,并绘制在价格图表上。一般来说,我们要做的是跟随P F的绘图曲线。当曲线从之前的低点上升了一个百分比,我们就做多。当曲线从之前的高点下降了一个百分点时,我们将做空。此外,我们希望能够跳过价格方向的快速移动的主要变化。因此,如果P F大于两天前的P F的百分比量pctjup,我们将做多。如果P F小于两天前的P F,百分比为pctjdn,我们将做空。
买入规则:
如果PF从做空时记录的PF最低点上升了超过百分点,那么在明天开盘时买入债券期货。
或
如果PF比两天前的PF多出pctjup的百分比量
则在明天开盘时买入债券期货。
卖出规则:
如果在做多时,PF比PF的最高记录下降了超过百分数pctdn,则在明天开盘时卖出债券期货。
或
如果PF比两天前的PF少了pctjdn的百分比,则在明天开盘时卖出债券期货。
使用美债连续期货合约进行前行优化
使用卡尔曼消逝记忆过滤器系统对美国债券进行了前行优化 连续期货合约。
债券期货于1976年开始交易。然而,在本报告中,我们将把研究限制在88年1月1日至今的价格历史。最初的实验发现,五年的测试段对债券期货的走势测试是最好的。
前进程序将被应用如下。从数据的开始,1989年1月1日到1993年12月31日,选择5年的时间,通过对这个每日数据段的优化,找到系统参数值。然后将找到的参数值应用于测试段后一年的样本外数据,在本例中是1994年。然后对1994年的样本外结果进行制表和保存。
接下来,数据测试窗口向前移动一年,从1990年1月1日到1994年12月31日,并找到新的最佳参数值。新的最佳参数被应用于1995年的样本外结果,并将1995年的样本外结果列表。
移动数据测试窗口每次向前走一年,为每个5年的窗口数据段创造最佳值。从这些窗口得出的最佳参数被应用于测试数据窗口以外的年份。最后,所有列表中的一年的样本外结果被合并,形成一个大的样本外结果段。这种计算密集型方法背后的理论是,可用于建模和寻找参数的价格动态会随着时间缓慢变化。假设在事情发生变化和模型崩溃之前,有足够的数据可以预测未来很短的时间。事件和技术需要时间来改变事物,所以假设使用基于前五年的最佳值将足以在未来一年使用。
系统输入参数和定义
Mark=0,Mark=0意味着该头寸在最后一个条形图上没有被标记到市场。Mark=1意味着它是。
Lam = 0.75, = l l , 对卡尔曼增益k n进行加权的折扣系数。
ralf = 0.20, = a a, 更新r n的指数加权系数。
pctup = 1.4, 曲线从先前的低点上升的百分比。
pctdn = 1.0, 曲线从之前的高点下降的百分比。
pctjup = 99, 曲线比2天前增加的百分比。
pctjdn = 99, 曲线比2天前减少的百分比。
为优化运行而检查的参数范围
Lam = 0.69到0.75,步长为0.01
ralf = 0.1到0.5,步长为0.1。
pctup = 0.8到1.6,步长为0.05 值为99时,该参数不能发出买入和卖出。
pctdn = 0.8到1.6,步长为0.05 值为99时,该参数不能发布买入和卖出。
pctjup = 0.2 到 1,步长为 0.02 值为 99 时,该参数不能发布买入和卖出。
pctjdn = 0.2到1,步长为0.02,数值为99时,该参数不能发布买入和卖出。
设置
按照本手册 "如何用数据系列设置一个新的工作区 "一节中的描述设置工作区。该系统被命名为#KalmanFMem,指标被命名为#KalmanFMem Prc和#KalmanFMem %jmp。#KalmanFMem Prc绘制了卡尔曼消逝记忆的估计价格pF,而#KalmanFMem %jmp则绘制了pF的2天跳跃。打开为这个系统和指标设置的工作区。点击菜单栏上的 "插入"。在弹出的菜单中点击分析技术。弹出一个题为 "插入分析技术 "的窗口。确保右侧的 "格式 "复选框被选中。点击 "系统 "选项卡。找到系统#KalmanFMem,点击它以突出显示。
点击 "绘图 "按钮。一个题为 "格式化系统 "的窗口。#KalmanFMem的窗口将弹出。如果你想的话,可以通过点击编辑来改变输入值,或者让它们保持不变。然后点击 "确定",系统的买入和卖出箭头就会显示在图表上。要插入#KalmanFMem指标,请遵循上述步骤,只是在插入分析技术窗口框中点击指标标签,而不是系统标签,并遵循同样的步骤。该指标将显示在图表上。
函数的定义和使用
该函数被命名为$KalmanFMem,这是系统做成的二进制函数形式。该函数在系统买入时等于+1,在系统卖出时等于-1。这个函数可以与其他系统函数的任何组合结合成一个新的系统。例如,如果function1(p1,p2,p3)是函数形式的system1,那么用户可以编写以下简单代码,将$KalmanFMem与function1组合成一个新的系统。
如果$KalmanFMem(gn,delup,deldn,pctjup,pctjdn)=1和function1(p1,p2,p3)=1,则在市场上买入。
如果$KalmanFMem(gn,delup,deldn,pctjup,pctjdn)=-1且function1(p1,p2,p3)=-1则在市场上卖出。
用户可以直接在函数中输入参数的当前值,而不是参数名称,或者用户可以为这个新组合重新优化任何一个参数。
参考文献
1.Morrison, Norman "Introduction to Sequential Smoothing and Prediction", McGraw-Hill Book Company, New York, 1969.
2.Brown,R.C, Hwang, P.Y.C. "Introduction to Random Signals and Applied Kalman Filtering", John Wiley & Sons, New York, 1997.
3.Allen, D.S., Kim, Y.W, Meenakshi, P. "Forecasting With An Adaptive Control Algorithm", Federal Reserve Bank of St. Louis, Research Division Working Papers, #96-009A, 1996.
论坛官方微信、群(期货热点、量化探讨、开户与绑定实盘)
期货论坛 - 版权/免责声明
1.本站发布源码(包括函数、指标、策略等)均属开放源码,用意在于让使用者学习程序化语法撰写,使用者可以任意修改语法內容并调整参数。仅限用于个人学习使用,请勿转载、滥用,严禁私自连接实盘账户交易 。
2.本站发布资讯(包括文章、视频、历史记录、教材、评论、资讯、交易方案等)均系转载自网络主流媒体,内容仅为作者当日个人观点,本网转载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。本网不对该类信息或数据做任何保证。不对您构成任何投资建议,不能依靠信息而取代自身独立判断,不对因使用本篇文章所诉信息或观点等导致的损失承担任何责任。
3.本站发布资源(包括书籍、杂志、文档、软件等)均从互联网搜索而来,仅供个人免费交流学习,不可用作商业用途,本站不对显示的内容承担任何责任。请在下载后24小时内删除。如果喜欢,请购买正版,谢谢合作!
4.龙听期货论坛原创文章属本网版权作品,转载须注明来源“龙听期货论坛”,违者本网将保留追究其相关法律责任的权力。本论坛除发布原创文章外,亦致力于优秀财经文章的交流分享,部分文章推送时若未能及时与原作者取得联系并涉及版权问题时,请及时联系删除。联系方式:http://www.qhlt.cn/thread-262-1-1.html
UID 2 积分 2725616 威望 1312804 布 龙e币 1412812 刀 注册时间 2009-12-3 最后登录 2024-5-4
2 #
发表于 2022-8-3 13:37
|
只看该作者
{System: #KalmanFMem }
input: Mark(0),Lam(0.75),ralf(0.20),pctup(1.4),pctdn(1.00),pctjup(99),pctjdn(99),prc(c);
vars: xhatm(0),xhat(0),pm(0),k(0.5),p(1),q(1),rr(1),err(0),y(c),temp(0),xplus(c);
vars: n(1),ii(0),rrave(0),phi(1),hh(1),oneplus2(1),oneminus2(1);
vars: oneplus(1),oneminus(1),buystop(0),sellstop(0),h_ep(c),l_ep(c),bopos(0);
if currentbar=1 then begin
y=prc;
xhatm=0.99*prc;
xhat=0.99*prc;
pm=1;
p=1;
rrave=(y-xhatm)*(y-xhatm);
xplus=prc;
oneplus=1+(pctup/100);
oneminus=1-(pctdn/100);
h_ep=xplus;
l_ep=xplus;
buystop=l_ep*oneplus;
sellstop=h_ep*oneminus;
oneplus2=1+(pctjup/100);
oneminus2=1-(pctjdn/100);
end else begin
y=prc;
err=y-xhat;
rr=(y-xhatm)*(y-xhatm);
rrave=rrave[1]+ralf*(rr-rrave[1]);
temp=(hh*pm*hh + lam*rrave);
if temp=0 then k=1 else k=pm*hh/temp;
xhat=xhatm +k*(y-hh*xhatm);
p=(1-k*hh)*pm/lam;
xhatm=phi*xhat;
pm=phi*p*phi;
xplus=xhat;
{=================UP DWN %CHG from previous cls local high or low===================}
bopos=bopos[1];
if bopos[1] >= 0 then begin
if xplus > h_ep then begin
h_ep=xplus;
sellstop=h_ep*oneminus;
end;
if xplus <= sellstop then begin
bopos=-1;
l_ep=xplus;
buystop=l_ep*oneplus;
end;
end;{pos[1] if}
if bopos[1]<=0 then begin
if xplus < l_ep then begin
l_ep=xplus;
buystop=l_ep*oneplus;
end;
if xplus >=buystop then begin
bopos=1;
h_ep=xplus;
sellstop=h_ep*oneminus;
end;
end;{pos[1]<=0 if}
if marketposition<=0 then begin
if pctup<>99 then if bopos>0 and bopos[1]<>bopos then buy("B%Kup") {on close} at market;
if pctjup<>99 then if xplus>xplus[2]*oneplus2 then begin
bopos=1;
h_ep=xplus;
sellstop=h_ep*oneminus;
buy ("B2dy%jmp") {on close} at market;
end;
end;
if marketposition>=0 then begin
if pctdn<>99 then if bopos<0 and bopos[1]<>bopos then sell("S%Kdn") {on close} at market;
if pctjdn<>99 then if xplus<xplus[2]*oneminus2 then begin
bopos=-1;
l_ep=xplus;
buystop=l_ep*oneplus;
sell ("S2dy%jmp") {on close} at market;
end; end;
if date=lastcalcdate and mark=1 then begin
if marketposition=-1 then exitshort("SMrkToMkt") on close;
if marketposition=1 then exitlong("LMrkToMrt") on close;
end;
end;{else} 复制代码
UID 2 积分 2725616 威望 1312804 布 龙e币 1412812 刀 注册时间 2009-12-3 最后登录 2024-5-4
3 #
发表于 2022-8-3 13:38
|
只看该作者
UID 2 积分 2725616 威望 1312804 布 龙e币 1412812 刀 注册时间 2009-12-3 最后登录 2024-5-4
4 #
发表于 2022-8-3 13:42
|
只看该作者