欢迎来到天天文库
浏览记录
ID:20279569
大小:144.05 KB
页数:5页
时间:2018-10-11
《《程序化交易实战》连载7策略编写陷阱—未来函数》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、《程序化交易实战》连载7:策略编写陷阱一未来函1.未来函数⑴.概念介绍未来函数是指引用未来数据的函数,在策略中的表现形式也就是引用未来时刻的信息作为判断条件,对现在时刻下达开平仓指令。换句话说,函数利用了现在还不知道的信息,产生交易信号。这在历史后验中是完全可以实现的,因为在程序化交易的历史后验中,我们从一开始就拥有所有的历史数据。而且,Bar驱动策略是基于Bar信息开发的策略,如果不加以注意,很容易在编写策略时出错,引用未来的信息。但是在实盘交易中,行情是按吋间顺序到达,在“现在”这个时间点上,我们只能拥有这个时问点以
2、前的信息,也就是过去的数据,不可能获取这个吋间点之后的信息,即未来的行情。因此,我们必须确保在历史后验屮也遵循这一规则,发出的每一个交易信号都是基于该时点以前的信息,而并不包含该时点之后的信息,以避免这种“偷窥未来”的错误。与偷价格类似,未来函数也一样会为我们带来一条完美的后验曲线和漂亮的后验数据,但是在实盘使用这个策略之后,它会立即现出原形,丧失盈利能力。下而我们分别举儿个未来函数的例子,并分析其发生的原因。⑵.原因解析与偷价格类似,未来函数的表现形式也有很多,但归根结底,原因只有一个:我们使用了未来j能知道的信息作为
3、现在的判断条件或者开仓条件。这并非是我们根据现在的信息有效地预测丫未来,而是通过bar后验的机制,偷看到Y未来的信息,并且加以利用。我们也通过几个例子来仔细分析一下未来函数出现的原因。①.案例一Line1:ifBar.Ccunt>Pos.LastExitBar:Lire2:ifPos^MerketPcsition==0:Line3:ifClose.l;>LMA[1]andClose:0]>Open'.O]:Lire4:trade.T_Buy(strSecuCode,Strategy/nfo.Lets,Cpen^C;)上血
4、这段代码是Q语言编写的一段幵仓条件:如果上一根bar的收盘价高于长期均线,且当前K线收阳,也就是说这根bar的收盘价大丁•这根bar的幵盘价,则以这根bar的开盘价做多。这就是一个典型的未来函数。问题在于,下单价格是当前K线的幵盘价Open[O]。所以“现在”这一时间点就是当前K线开盘的一瞬问,而判断条件中使用了当前K线的收盘价Close[0],也就是“未来”的信息。这相当于我们知道了这根K线收阳之后,通过吋光机冉冋到开盘的那个吋间点进行下单,这样当然可以盈利。上图就是这个策略的后验曲线,股指年化收益率达到500%,而且
5、收益曲线极其平滑,儿乎没有冋撤。但非常遗憾,这在实盘交易中敁然是不可能实现的。因为我们在开盘吋是无法知道收盘价是多少的;而等到收盘以后,里然我们已经知道了收盘价是多少,却再也无法以开盘价成交。Lire1:*持有多仓时,如果价稔已经上涨0.54,那么当T介格从最蒿吾回撤3.S的吋候平仓—Line2:ifBar.Ccunt>Pos.LastEntr/Bar:Line3:ifPos.MarketPosition==1:Lire4:ifHighAfterEntry-Pcs.LasTEntP/Price>Pos.LastErtry
6、Price*0.5/100.0:Line5:ifClose[0]<=High[0]-0.3Line6:tradG.TSGll{strSecuCocezStratGgylrfo.Lots,High[0)-0.8;2500?,000习
7、这是用Q语言编写的一个多头止盈的模块,当头寸价格上涨超过0.5%时,一旦从最高点回撤0.8个点即止盈平仓。这段代码屮也存在未来函数。在历史后验中,由于使用的是bar驱动的后验机制,在这根bar执行主程序的时候,我们就已经知道0pen[0],High[0],Low[0]和Close[0]的最终值
8、。但是在实盘中,只有Open[0]是在这根bar开盘的时候就固定下来的,而High[0],Low[0]和Close[0]在这根bar结束之前,都是不停变动的。只有在bar结束之后,才成为固定的值,并且当新的bar到来之后立即变成High[l],Low[l]和Close[l]。上面这段代码相当于在这根bar还没有结束的吋候,就已经使用了这根bar结束之盾才能知道的信息作为判断条件,那么卜而K线图中所宥的平仓点位都接近每根bar的高点也就不足为奇了。然血,一旦我们实盘使用这个策略,程序会这样运行:在前而几个条件都满足的情况下
9、,在bar内第一次出现比0.8个点更大的冋落时,就会触发Close[0]〈High[0]-0.8的条件,策略会立即平掉多仓。所以在实盘中是不可能出现每次平仓都在当根bar的最高点附近这种情况的。③.案例三Line1:UpperBand幵多Lire2:ifBar.Ccun:>Pos.LastExitBar:Lire3:
此文档下载收益归作者所有