【BruceAshbey的回答(10票)】:
谢邀。这个事情上只能靠自己,你要很清楚知道数据的状态。
举例来说:
股票收盘价是下午3点才有的,但是开盘价上午9点半就可以了。
所以你的策略如果是盘中的不可以用收盘价信息但是可以用开盘价信息。
同样类似的财务报告信息,你知道国内的财务报告是披露日的收盘以后公布的
所以当财务披露时间是2014-8-3日的时候,你就知道在2014-8-3日是不能用的,要在2014-8-4才能用这个信息。更进一步,财务数据又分调整数据和非调整数据,调整数据时下一期才公布的,所以比如你现在虽然能看到2014年的中报,但是看不到2014年中报的调整数据。
这些东西如何避免只能靠你自己对数据的理解,积累相应的知识,然后避免。
如果我们看的再细一点,在行情里面也是很有多未来数据的,比如说你看到交易所14:00:00的行情
等你收到已经是14:00:01了,那么对你来说也可能是未来数据,类似的情况也很多。还有诸如数据更正之类的事情,过了很久你已经很难分辨出真正的数据时间了。所以如果要真正的避免未来数据,把细节抠的很细也是一个刻舟求剑的情况,完全没有必要。
这里就牵涉到另外一个层面的东西了,对你的策略的理解,需要估计你用的数据对你的策略收益率会有多少影响,这个就完全是经验上面的东西了。
同样的还有一步很重要的就是样本外的模拟测试,这个模拟测试不是指样本外测试,而是模拟的每天更新你的策略再跑一段时间,看看效果到底怎么样。
从策略研发--样本外测试--模拟测试--小资金实战--大资金实战
再加不断的调整,这些过程和步骤是不能少的。
【杨影枫的回答(7票)】:
谢邀
我这里举例说明好了,给大家讲讲一些在K线结构下常见的用到未来函数的错误例子。
策略1:
在K线上,在最高价卖出,在最低价买入。
错误隐蔽性:★
错误解释:显然在K线内每一时刻,我都无法判断该时刻是在最低价/最高价,所以我们也就无法进行策略1。
策略2:
在当前K线上,如果最低价大于上一K线的最低价,那么在最高价突破上一K线的最高价时买入,反之则卖空。
错误隐蔽性:★★
错误解释:原因与策略1类似,但具有一定的隐蔽性,我们似乎在逻辑上有了确定的买入点,但实际上我们无法确定最高点/最低点出现的先后顺序,所以这个买入点是假的,并无法在真实交易中确定。
策略3:
在当前K线上,如果最高价突破前一最高价,同时K线成交量大于上一K线成交量时买入。
错误隐蔽性:★★
错误解释:成交量也是会随着时间变化的数值,所以在K线结构上我们无法确定在突破一瞬间成交量的比较情况。
总结1:在K线结构的量化交易时,一旦用到在最高/最低/某突破点位做交易时一定要特别注意,比较安全的选择是用当前收盘价或下一K线开盘价价格进行交易。
策略4:
采用ZIGZAG指标,在折线的低点买入,在顶点卖出。
错误隐蔽性:★★★
错误解释:ZIGZAG是延迟类指标,只有在行情走出一定时间/幅度后才可以确定是否是顶点/低点,所以单纯使用指标而不理解指标的算法会导致使用未来函数的可能性。
策略4:
如果当前价格大于MA60(60K线均线),那么在最高价突破前20根K线最高价时买入。
错误隐蔽性:★★★
错误解释:MA60计算时,已经用到了当前K线成交价,所以如果此时还用最高价突破时价格买入就用到了未来函数。
总结2:在用到指标时一定要清楚其算法,明白其使用了哪些变量,才能避免使用到未来函数。
策略5:
在做tick级别策略时,假设我的策略是以当前tick的最新成交价成交。
错误隐蔽性:★★★★★
错误解释:判断成交不仅仅是价格问题,同时也要考虑挂单的排队先后。好比抢小米手机,我在12点下单抢和我最后能成功抢到是两个概念。
总结3:在涉及到逐笔数据时,价格从单纯的最新价变化为了bid/ask价格,同时还引入了排队问题,复杂度大大增加。同时在真实交易中由于报单速度问题,使得成交与否变得更加难以确定。
【知乎用户的回答(2票)】:
谢邀
不是有个方法叫Rolling Window么?就是滚动时间窗,比如基于1-30得出31,然后基于2-31得出32,然后继续滚动滚动……
以前我用SAS搞回测时,先删未来数据,或者说先把能用的数据取出来放到一个临时表中,然后只能基于这些数据得出这一时期的结论(比如即期收益率),最终再把一个个结论整合到一张统计表上分析。这样从根本上杜绝了使用未来数据,就是效率低。不过我不搞高频,因此一般速度还行。
此外,有些行情软件提供“逐k线模式”,这样使用内置回测时k线是一根根刷出来,而非直接全出来,因此更加准确。不过这对程序本身的计算逻辑有一定要求,有时需要自行修改dll。
其实我已经好几个月没碰过回测了,感觉那是用来测试机械交易系统的玩意儿,毕竟搞机械交易系统的人都不知道有没有效,因此回测回测,兼优化参数。
【知乎用户的回答(3票)】:
关键还是回测框架的问题,把历史数据当成数据流,保证发出交易信号前用到的数据都已知
通常,初步测试会为了速度,采用简化的测试方法,这时候很容易用到未来数据
同时兼顾回测效率和质量(主要是未来数据的避免)的框架是很麻烦的
如果没有很好的经验和团队,还是直接使用市场上的软件或者API吧
【知乎用户的回答(1票)】:
谢邀。坦白讲这个答案对不起邀请。《海龟交易法则》已经讲得很清楚,我就不班门弄斧了。而且回测总是难免过度拟合,回测优异的系统还得经模拟交易和后续一系列应急预案,所以并没有在这上面作深入的学习。
【袁梓谦的回答(1票)】:
泻药,其实每个问这种问题的人自己心理都有答案了。
一般来说策略都是不断完善的,所谓的完善,其实就是觉得收益率不够,修改的过程中,其实从开始思路就错了,开始胡乱添加一些无用指标,其中一些属于过度拟合,另一些就是完完全全的未来指标了。
怎么有效避免肯定要看自己对你自己开发的策略的信任程度,你总觉得收益不够,然后在特定的行情试图添加一些未来指标使得回测收益很高,而实际运行完全一塌糊涂,看似可以说服你自己。这类的人就很容易陷入未来指标里。
新手往往会被未来指标误导,而老手还摆脱不了未来指标就是自己心态的问题了。
【何子垠的回答(1票)】:
谢邀。
不过很抱歉,关于数据过度优化的问题,我不是专业的,无法给出合理的解决方法。
看过前面几位朋友的解答,有给出具体方法的,有的给出理念上的想法。我只是想说,大道至简,程序越复杂,用的指标越多,未来信息出现的机会就越大,避免不了,优化只是减少回测与实际交易的差距,但本源未变,结果也变不了太多。
指标不是不能用,是尽量少用,因为绝大部分指标都是价格均线的变形,分类细化,都是同源的,用多了,重复不说,还互相制约。不妨试试只用KD,MACD,VOL配合K线形态判断走势,或者只靠均线系统和量能配合判断,如果练成了,那一切就简单了。K线形态是最不好用计算机语言描述的,但确实走势最直观的体现,是后市判断的依据。
我看过很多朋友的程序,自己也找人写过了,成绩参差不齐,从年化30%到几倍的都有,市场环境出现变化,相应指标参数就要做调整,调整后又会出现问题。后来我就在想,为什么要用程序,程序化能为我们带来什么好处,把这个问题想清楚了,问题也就解决了。
我的理解,不用把程序化交易说的如此高大上,只是用计算机代替人工判断,省事省力而已。计算机程序也并不是人工智能,只是把历史经验套在现实走势中,看看一样不一样,一样就做,不一样就等,想让程序做出超出人类经验水平的成绩,不是不能,只是现在还不行,有的程序化做过一年几倍的成绩,但再过几年还能不能保证就不知道了。
举一个例子,国际象棋人与机器对决,最后还是人赢了,可那台机器——深蓝,是台超级计算机,你能保证你的算法能有深蓝那样的精密严谨吗?
现在大部分人认为程序交易就是量化交易,而量化交易就是高频交易,这是概念性的误区。程序交易只是辅助交易员判断,或者做些简单重复的模型交易,当然收益率不会太高,但风险低且稳定。而想用程序博得高收益,这是钻牛角尖了,不会有太好的成绩。
我现在的状态,几套程序辅助,年化收益在30-50%间,但大部分资金还是人工手动交易。
【无穷大的回答(0票)】:
谢邀。
个人经验,程序跑到到某一刻时确认用到的所有原始数据都是在这之前就已知的,这样就能确保不会用到未来信息。
另外,如果结果出奇得好就非常值得怀疑了,自己陷入思维定势查不出就找别人double check
【slevinlee的回答(0票)】:
如果题主的问题是如何避免回测程序不小心写入未来函数
这种问题是程序化入门的初级问题~
主要是个人对自己写的程序理解不够~
连价格信号出现时间先后都不清楚的话
建议认真学习下面这篇文章比较好~
看下面回答还有人写个未来函数目的是用来自己骗自己的
服了...
画个完美信号图是用来撸管的么?
【梁力锴的回答(0票)】:
1.真金白银放进去. 出一次问题,一辈子记得
2.仿真,多数情况下只需要脑子里模拟一些恶(e)劣(xin)的走势或事件,看看和模型是否一致.
3.把一些中间变量输出来,类似debug,看是否和自己的思路一致.
【葛枰的回答(0票)】:
说到未来数据人人都是避之不及,先抛开问题,你明确的知道为什么不能用未来数据么?比如在一定周期的低点介入,介入后在一定周期的高点卖出,这本身是个废话,但你能否用操作的手段达到这种目标,比如资金管理,比如做好风控,也许达不到最高最低,但可以接近。但有些未来数据的使用却是致命的,比如用z字转向函数编写的涉及交易点的指标,以及过滤回填指标,这些画画图形自我理解可以,但是以此为信号操作却会出问题。
所以我认为,某些未来数据如果能够用可操作的办法接近,配以较大的滑点,可以使用,前提是你对操作方法以及未来指标使用后对你系统的风险有全面的评测。如果没有这些基础,那未来数据就是致命的。
【钱盛林的回答(0票)】:
这个跟你使用的工具有很大关系,好的平台会让你无法使用未来数据,如果没有这个功能那就只有自己注意了,目前国内流行的tb和mc都是可以使用未来数据,有的是故意有的是无意,用tick回放行情就能识别是否用未来,这个多数情况还是只能靠自己小心,多写点代码就差不多了
【阮泽雨的回答(0票)】:
上面的已经介绍了很多,补充一点就是尽量使用固定的价格交易,比如最高价、最低价和开盘、收盘价等~
【Victor的回答(0票)】:
其实你用了未来函数去测试可以,但写交易逻辑的时候自己就知道了吧。
【Wongjason的回答(0票)】:
谢邀。如果回测结果很好很牛b,基本上就是不小心用了未来函数。too good to be true
联系客服