老新闻2----《我的IB奥运自动模拟交易大赛》--中科院云南天文台李荣旺
作者:zhangweinuaa 日期:2010-07-26
每年年初,盈透公司Interactive Brokers都会举办一场名叫“大学奥运”的活动,即邀请大学生编写程序,用自动化模拟交易的方式进行比赛。这种比赛由于是自动化模拟,所以没有参赛者的随意性和心态的波动性,故仿真性很高,几乎只要注入资金就是真实交易了。以往的两届只允许美国境内的学生参赛,而这次主办方扩大到了全球的范围。
我是在2007年9月底知晓这个比赛的IB Collegiate Trading Olympiad,一个叫唐健的朋友从海洋论坛——国内最顶尖的系统交易论坛——上得到的信息而后告诉我的。当时很犹豫,毕竟这是国际级的比赛,况且我对经济学一窍不通,觉得机会太渺茫了。后来朋友劝我再想想,正好我还是个学生,之前也接触了点IB,既然有这种机会就试试,权当见见世面。虽然决定了参加试试,不过开始不敢立即注册帐户,生怕到时交不出东西(后来看还是多虑了,应该更早注册,注册后会开通paper帐号,就可以早点熟悉IB交易平台)。
由于我是经济学的门外汉,从头系统学显然来不及,那就只好从实用角度出发——直接“分析市场数据、感受市场的呼吸”。IB可以免费下载一年内的历史数据(paper帐号即可下载,所以要早点注册比较好)。有了大量市场数据,当然不能漫无目的看,得有一套方法去学。我是看了波涛先生的旧著《系統交易方法》,里面比较系统的讲述了系统交易方法以及交易的基本准则,详细讲解了怎么设计一个交易策略以及如何改进交易策略为一个“好的策略”。
从《系統交易方法》这本书中,我基本了解到了系统交易方法以及其基本准则。一个交易系统就是一个由相互关联的交易规则构成的完整规则体系,包括投资的一个完整交易周期中的各个决策点:进场点、出场点、再进场点、再出场点以及取消进场点、取消出场点等条件的明确而具体的规定。一个交易系统的设计过程通常如下几个步骤:交易策略的提出、交易对象的筛选、交易策略的系统化、交易系统的统计检验、交易系统的优化、交易系统的外推检验、交易系统的实战检验、交易系统的监测与维护。
既然是系统交易(自动交易),就得找一个Auto Trading System(ATS)自动交易系统。TWS支持的接口语言还是挺多的,JAVA, C, C++, VB等等。我比较熟悉java,所以就选择了它作为开发语言。幸运的是,有个用java开发的ATS开源项目JSystemTrader,省了不少麻烦。 接着自然就是选择几个候选的交易对象,下载尽可能多的市场数据。我选择了YM($5小道指)、ES(小SP500指数)、INDU(道指)、NQ(小纳指期货100)四个,都是美国很活跃参与人数很多的指数期货合约,下载了将近一年的市场历史数据。 然后我就从一个朴素的原型开始分析市场数据,从而改进这个交易原型。 朴素的交易原型如下:如果连续两个1-min-bar一分钟柱线的Close收盘大于Open开盘,则下MKT型市价单进场Entry挂单买入1个交易点;当进场挂单成交后(成交价计为entryFilledPrice),则挂出OCA出场Exit挂单组:一个以lmtPrice=entryFilledPrice+lmtGain为止赚价的LMT型,一个以stpPrice=entryFilledPrice-stpLoss为止损价的STP型。这个出场挂单组含义是:如果亏损超过stpLoss或盈利超过lmtGain,则出场。接下来,就是要通过市场数据确定出lmtGain和stpLoss的理想值,这个需要反复测试。开始我确定了进场就是BUY。但不管怎么调整lmtGain和stpLoss,最好情况也只能勉强盈利,如果算平均盈利且扣除手续费的话就说不上盈利了。说明固定进场为买并不是最理想,特别,如果市场持续下跌的话,那就只有亏损了。考虑到交易对象是期货可以先买再卖,也可以先卖空后买平。所以就尝试了下确定进场为SELL,结果还是一样,面上勉强盈利。也同样的道理,如果市场持续上涨的话,那就没有盈利的可能了。因此,就产生了一个直观的想法——“如果市场持续下跌,就先卖后买;如果市场持续上涨,就先买后卖”,这样岂不就不会亏了。那么如何确定“持续下跌”与“持续上涨”呢?自然需要用某个指标Indicator来判定进场Entry究竟是买还是卖,尝试了几个指标,利用2006年3月到2007年10月间的市场数据经过反复尝试,综合考虑盈利次数、总盈利值、交易次数等等相关的量,最后确定采用TrueTrend为指标,并初步确定了lmtGain和stpLoss的值。这样就通过了交易策略的统计检验。接着还需要进行外推检验以及实战检验。当时已经到了2007年12月底,正好可以用2007年11月和12月份数据作为外推检验数据。效果还算不错。最终确定了lmtGain值为32、stpLoss值为54;TrueTrend以25个历史bar数据为计算依据,当TrueTrend大于等于0,则进场为买,当trueTrend小于0则进场为卖。
就这样,2008年1月7日比赛正式开始。
很不幸,第一天就亏了很多,而且由于程序问题没有成功平仓,只好手动平仓,扣分噢,这也是我一直没做实战检验的后果;第二天赚回来了些;第三天中途停电没交易成(由于是交易美国产品,要到北京时间晚上11:30才开市,所以……)。第四天和第五天都赚了点点。最终,第一周,勉强盈利告终。后面就跌跌撞撞,盈盈亏亏,勉强保持着微赚。后来到1月下旬,就亏得一蹋糊涂。还好,2月上旬赚了些。最终勉强获了个奖。
我的这次比赛中,有很多地方都是需要改进的。首先,我一直都只交易YM一个点,交易价大约在11000到13000,YM一个交易点对应$5,也就是说我投入市场的资金不到7万美元,而IB提供的比赛帐户本金是100万美元,投入比例太小了;另外,由于时间关系,技术指标TrueTrend判断不完善,往往出现较低价买入,较高价卖出的情况。
最后,要特别感谢IB中国代表王伟建先生,对我的咨询提问以最快时间给与了详细实用的回复;感谢唐健告诉我这个活动,并给与我很多帮助。
我是在2007年9月底知晓这个比赛的IB Collegiate Trading Olympiad,一个叫唐健的朋友从海洋论坛——国内最顶尖的系统交易论坛——上得到的信息而后告诉我的。当时很犹豫,毕竟这是国际级的比赛,况且我对经济学一窍不通,觉得机会太渺茫了。后来朋友劝我再想想,正好我还是个学生,之前也接触了点IB,既然有这种机会就试试,权当见见世面。虽然决定了参加试试,不过开始不敢立即注册帐户,生怕到时交不出东西(后来看还是多虑了,应该更早注册,注册后会开通paper帐号,就可以早点熟悉IB交易平台)。
由于我是经济学的门外汉,从头系统学显然来不及,那就只好从实用角度出发——直接“分析市场数据、感受市场的呼吸”。IB可以免费下载一年内的历史数据(paper帐号即可下载,所以要早点注册比较好)。有了大量市场数据,当然不能漫无目的看,得有一套方法去学。我是看了波涛先生的旧著《系統交易方法》,里面比较系统的讲述了系统交易方法以及交易的基本准则,详细讲解了怎么设计一个交易策略以及如何改进交易策略为一个“好的策略”。
从《系統交易方法》这本书中,我基本了解到了系统交易方法以及其基本准则。一个交易系统就是一个由相互关联的交易规则构成的完整规则体系,包括投资的一个完整交易周期中的各个决策点:进场点、出场点、再进场点、再出场点以及取消进场点、取消出场点等条件的明确而具体的规定。一个交易系统的设计过程通常如下几个步骤:交易策略的提出、交易对象的筛选、交易策略的系统化、交易系统的统计检验、交易系统的优化、交易系统的外推检验、交易系统的实战检验、交易系统的监测与维护。
既然是系统交易(自动交易),就得找一个Auto Trading System(ATS)自动交易系统。TWS支持的接口语言还是挺多的,JAVA, C, C++, VB等等。我比较熟悉java,所以就选择了它作为开发语言。幸运的是,有个用java开发的ATS开源项目JSystemTrader,省了不少麻烦。 接着自然就是选择几个候选的交易对象,下载尽可能多的市场数据。我选择了YM($5小道指)、ES(小SP500指数)、INDU(道指)、NQ(小纳指期货100)四个,都是美国很活跃参与人数很多的指数期货合约,下载了将近一年的市场历史数据。 然后我就从一个朴素的原型开始分析市场数据,从而改进这个交易原型。 朴素的交易原型如下:如果连续两个1-min-bar一分钟柱线的Close收盘大于Open开盘,则下MKT型市价单进场Entry挂单买入1个交易点;当进场挂单成交后(成交价计为entryFilledPrice),则挂出OCA出场Exit挂单组:一个以lmtPrice=entryFilledPrice+lmtGain为止赚价的LMT型,一个以stpPrice=entryFilledPrice-stpLoss为止损价的STP型。这个出场挂单组含义是:如果亏损超过stpLoss或盈利超过lmtGain,则出场。接下来,就是要通过市场数据确定出lmtGain和stpLoss的理想值,这个需要反复测试。开始我确定了进场就是BUY。但不管怎么调整lmtGain和stpLoss,最好情况也只能勉强盈利,如果算平均盈利且扣除手续费的话就说不上盈利了。说明固定进场为买并不是最理想,特别,如果市场持续下跌的话,那就只有亏损了。考虑到交易对象是期货可以先买再卖,也可以先卖空后买平。所以就尝试了下确定进场为SELL,结果还是一样,面上勉强盈利。也同样的道理,如果市场持续上涨的话,那就没有盈利的可能了。因此,就产生了一个直观的想法——“如果市场持续下跌,就先卖后买;如果市场持续上涨,就先买后卖”,这样岂不就不会亏了。那么如何确定“持续下跌”与“持续上涨”呢?自然需要用某个指标Indicator来判定进场Entry究竟是买还是卖,尝试了几个指标,利用2006年3月到2007年10月间的市场数据经过反复尝试,综合考虑盈利次数、总盈利值、交易次数等等相关的量,最后确定采用TrueTrend为指标,并初步确定了lmtGain和stpLoss的值。这样就通过了交易策略的统计检验。接着还需要进行外推检验以及实战检验。当时已经到了2007年12月底,正好可以用2007年11月和12月份数据作为外推检验数据。效果还算不错。最终确定了lmtGain值为32、stpLoss值为54;TrueTrend以25个历史bar数据为计算依据,当TrueTrend大于等于0,则进场为买,当trueTrend小于0则进场为卖。
就这样,2008年1月7日比赛正式开始。
很不幸,第一天就亏了很多,而且由于程序问题没有成功平仓,只好手动平仓,扣分噢,这也是我一直没做实战检验的后果;第二天赚回来了些;第三天中途停电没交易成(由于是交易美国产品,要到北京时间晚上11:30才开市,所以……)。第四天和第五天都赚了点点。最终,第一周,勉强盈利告终。后面就跌跌撞撞,盈盈亏亏,勉强保持着微赚。后来到1月下旬,就亏得一蹋糊涂。还好,2月上旬赚了些。最终勉强获了个奖。
我的这次比赛中,有很多地方都是需要改进的。首先,我一直都只交易YM一个点,交易价大约在11000到13000,YM一个交易点对应$5,也就是说我投入市场的资金不到7万美元,而IB提供的比赛帐户本金是100万美元,投入比例太小了;另外,由于时间关系,技术指标TrueTrend判断不完善,往往出现较低价买入,较高价卖出的情况。
最后,要特别感谢IB中国代表王伟建先生,对我的咨询提问以最快时间给与了详细实用的回复;感谢唐健告诉我这个活动,并给与我很多帮助。
评论: 0 | 引用: 0 | 查看次数: 100
发表评论
上一篇
下一篇


文章来自:
Tags: 











