程序交易:痛并快乐着

Discussion in 'Philosophy and Strategy' started by itfin, Aug 21, 2007.

  1. 近期公司安排我专门从事权证实盘交易系统的研发工作,实盘测试也进行了1个来月了,经验教训一直没有进行过系统总结,在内部板块开个贴记录一下,方便交流和参考。

    1.策略描述。
    一开始用的是一个基于指数加权最小二乘拟合进行短期预测的策略,在HS300指数现货上测试表现良好,但在权证品种上测试表现很不稳定,交易次数过于频繁,极端情况一天就可能亏50%以上,于是决定放弃,从头思考趋势跟踪的原理。什么是趋势?趋势就是一系列的新高(低).何时可以确认一个趋势?可能没有一个标准答案,但我理解有两个必要条件:一是至少创出两个新高(低),二是破坏了原有趋势,即高(低)于上一趋势的倒数第二个新低(高).我现在的实盘策略,就是按照上面两个必要条件,当确认一个上升趋势时发出买入信号,当确认一个下降趋势时发出卖出信号。由于行情源是交易所的dbf库,刷新频率为4-6秒,可以理解为标准输入是一个5秒bar收盘价的均匀采样。
    可以参看http://210.21.207.162/jhp/order.jhp?date=20070820&t1=94000的趋势判断图示理解策略原理。其中大红点表示上升趋势确认点,发出买入信号;大绿点表示下降趋势确认点,发出卖出信号;小红(绿)点表示上升(下降)趋势中继点;蓝点为趋势选择点,需要等待趋势明确。
    从逻辑上讲这个策略应该是一个基准策略,下一步应该进行各种条件分布的统计,根据条件概率再对基准信号进行过滤或进行参数调整,比如有人谈到对海龟法则的一个改进就是忽略一次成功交易后的下一个交易信号。在回溯测试中也曾经试过参数调整如将2次新高(低)确认趋势改成3次或以上,或者使用自适应策略如一次交易失败后将信号门槛提高,交易成功后再重置回去,结果都不如基准策略理想,所以目前一直还是使用基准策略进行实盘测试。

    2.实盘操作。
    20070723:http://210.21.207.162/jhp/order.jhp?test=0&date=20070723
    跑了一个下午。
    20070724:http://210.21.207.162/jhp/order.jhp?test=0&date=20070724
    跑了完整一天。
    20070725:http://210.21.207.162/jhp/order.jhp?test=0&date=20070725
    收市前跑了20分钟。
    20070726:http://210.21.207.162/jhp/order.jhp?test=0&date=20070726
    下午交易接口出错导致异常终止,从此得到教训每天开盘前都重新启动交易接口部分。
    20070727:http://210.21.207.162/jhp/order.jhp?test=0&date=20070727
    跑了完整一天。
    20070730:http://210.21.207.162/jhp/order.jhp?test=0&date=20070730
    跑了完整一天。但101257看到的行情2.741有些怪,实际成交价为2.657,导致一个异常滑价。目前还不清楚是行情接口的一次错误还是一个真实的价格,从tick成交量看如果是真实价格的话上面好多档盘口都必须被撤单。这种现象后面又遇到几次。
    20070731:http://210.21.207.162/jhp/order.jhp?test=0&date=20070731
    跑了完整一天。
    7月小结:18337.87~19584.66
    20070801:http://210.21.207.162/jhp/order.jhp?test=0&date=20070801
    下午2点多J语言读dbf库的程序出错导致行情中断,结果错过了3.86-4.24的一波急升,非常可惜,其实只要在程序里加入一行异常处理代码即可避免,系统的健壮性还要不断加强。
    20070802:http://210.21.207.162/jhp/order.jhp?test=0&date=20070802
    跑了完整一天。下午临时停牌时恰好被关在里面。自动交易除了市场风险和运作风险外,还要承受中国特色的监管风险。这一天还可以看出模拟交易的微妙问题,038004的模拟交易收益很好:http://210.21.207.162/jhp/order.jhp?test=1&date=20070802&id=1038004,但却是无法实现的,临时停牌时刚好出现一个卖出信号,实盘是无法成交的。
    20070803:http://210.21.207.162/jhp/order.jhp?test=0&date=20070803
    跑了完整一天。由于观察到成交量放大和实盘获利,这一天将本金增加了一万元,获得了一定的超额收益。
    20070806:
    今日开始出差,临行时嘱托一位同事代管。结果跑了一个上午后刚好在11:30发出一个交易信号,报盘出去一直没有成交回报,在长时间轮询交易接口后交易接口出现故障,同事充启后未能解决,但未发现买入委托实际已经成交,结果没有帮我手工平仓,我8月10日回来后才发现并手工平掉,遭到了不必要的额外损失。
    20070809:http://210.21.207.162/jhp/order.jhp?test=0&date=20070809
    同事给跑的一天。由于未发现还有隔夜持仓,实际是用一点资金余额进行的交易,由于交易成本过高导致收益率过低。
    20070810:http://210.21.207.162/jhp/order.jhp?test=0&date=20070810
    跑了完整一天。开盘后首先进行手工平仓,再启动的交易系统。
    20070813:http://210.21.207.162/jhp/order.jhp?test=0&date=20070813
    跑了完整一天。本来程序设计在145700强行平仓,由于时延关系还是参与了尾盘的集合竞价。
    20070814:http://210.21.207.162/jhp/order.jhp?test=0&date=20070814
    跑了完整一天。由于趋势跟踪实际上是做多波动结构,这一天恰好没有一次像样的上涨趋势,结果创下了实盘收益率和胜率的新低。
    20070815:http://210.21.207.162/jhp/order.jhp?test=0&date=20070815
    跑了完整一天。由于前日尾市580997出现一波急升,本来预计今日会带领整个认沽板块一起炒做,出于防范风险的考虑还是选择了深圳沽权,结果没想到是一出独角戏。看着实盘2.4%的收益率和580997模拟盘252%的收益率:http://210.21.207.162/jhp/order.jhp?test=1&date=20070815&id=2580997,唯有苦笑。
    20070816:http://210.21.207.162/tmp/580997-0816-1130.htm(上午),http://210.21.207.162/jhp/order.jhp?test=0&date=20070816(下午)
    这一天克服心理障碍选择580997作为交易标的,上午收益率达到37%本来挺高兴,结果
    出现了与20070806一样的问题,刚好在11:30发出交易信号,在反复轮询中交易接口断掉了,下午发现后马上全部重启,结果耽误的几分钟刚好有一波0.6~0.75的急升,又丢失了近20%的利润。全日实盘收益约50%。
    20070817:http://210.21.207.162/jhp/order.jhp?test=0&date=20070817
    开盘遭遇当头一棒:程序原来采用的是在信号价格加减2%委托的保护性市价单,在开盘的极端行情中刚好被打穿,结果该卖时没有卖掉,我又没有及时止损,0.667买入的最后忍痛在0.5止损,基本上将上日赚的亏掉。重启动交易系统的走势也是基本横盘。两天炒作后又回到了起点。反观如果坚持交易深圳权证的话,应该也有20%多的收益,真是一个玩笑。
    20070820:http://210.21.207.162/jhp/order.jhp?test=0&date=20070820
    跑了完整一天。回到深圳权证,结果开始缩量调整。
    20070821:http://210.21.207.162/jhp/order.jhp?test=0&date=20070821
    由于成交量减小,上一日实盘亏损,本来今日应该停止实盘,等待下一次放量和模拟盘获利后再启动实盘。出于测试考虑仍旧启动了038006的实盘,结果开盘后发现580997异动,又重新初始化后跑580997,目前看来命运又和我开了一个玩笑:).
    收盘论定,好在还没亏,看看最大回撤,仍然感觉后怕。上海权证可能由于有人有行情优势(除了Level2行情外还有一种更快3秒的场内行情),交易滑价比深圳权证高出不少,我也一直不敢参与。今天盘中再次遭遇特停,亦感无奈,而且交易所网站还没有公告发布。后续三个交易日,铁定不参与了。
    20070822:http://210.21.207.162/jhp/order.jhp?test=0&date=20070822
    开盘后的一个卖单委托价格竟然是0,看来确实要对行情做过滤了。上午赶紧把委托方式改为市价,中午刚换上去,下午测试一下。
    市价委托可以了,可是深圳收盘集合竞价不支持市价委托,明早又要手工平仓了。
    20070823:http://210.21.207.162/jhp/order.jhp?test=0&date=20070823
    开盘先等价格回升后再做的手工平仓,之后启动的交易系统。143121发出的一笔对手方最优的市价单居然等了5分钟才成交,看来只有改用五档成交剩余撤销方式的市价单才能保险了。
    20070824:
    今天公司名下的一个测试账号也拿给我用了,拿来跑038003。因为帐上钱少,一开始市价委托单总报可用资金不足,我的数量是按溢价8%算的啊,奇怪,只能再多打些折。两个账号盘都遭遇特停,一个关在里面,一个关在外面,有趣。
    20070827:http://210.21.207.162/jhp/order.jhp?test=0&date=20070827http://210.21.207.162/jhp/order.jhp?test=0&user=LHZQ&date=20070827
    晚上才发现周五加了一个帐户后日终定时备份的程序改错了,导致0824的实盘记录丢失,可惜了。
    20070828:http://210.21.207.162/jhp/order.jhp?test=0&date=20070828http://210.21.207.162/jhp/order.jhp?test=0&user=LHZQ&date=20070828
    才发现金证柜台在下市价委托买单时居然是按涨停价冻结可用资金,只好把委托买单切换回5%溢价的限价单,卖单仍使用市价单。另外今天又发生了11:30报盘出去查回报把交易接口跑瘫的问题,在程序里加了一个忽略11:29:50~11:30:00信号的过滤条件。
    20070829:http://210.21.207.162/jhp/order.jhp?test=0&date=20070829http://210.21.207.162/jhp/order.jhp?test=0&user=LHZQ&date=20070829
    服务器的磁盘空间要满了,7月份的数据明天转移走。
    20070830:http://210.21.207.162/jhp/order.jhp?test=0&date=20070830http://210.21.207.162/jhp/order.jhp?test=0&user=LHZQ&date=20070830
    20070831:http://210.21.207.162/jhp/order.jhp?test=0&date=20070831http://210.21.207.162/jhp/order.jhp?test=0&user=LHZQ&date=20070831
    8月小结:19584.66~28554.049
    20070903:http://210.21.207.162/jhp/order.jhp?test=0&date=20070903http://210.21.207.162/jhp/order.jhp?test=0&user=LHZQ&date=20070903
    20070904:http://210.21.207.162/jhp/order.jhp?test=0&date=20070904http://210.21.207.162/jhp/order.jhp?test=0&user=LHZQ&date=20070904
    由于在现有交易频度下日均交易成本约3%有些过高,领导批准将两个帐号的权证手续费率下调至万分之1.5,但调整我的账号时出现错误,导致8月31日和9月3日的手续费都是按千分之三收的没有返还,今天上午刚刚设好,但多收的近2万元手续费不知何时能退还给我,现在只能将我的测试账户资金重置为2万元再跑了。
    20070905:http://210.21.207.162/jhp/order.jhp?test=0&date=20070905http://210.21.207.162/jhp/order.jhp?test=0&user=LHZQ&date=20070905
    20070906:http://210.21.207.162/jhp/order.jhp?test=0&date=20070906http://210.21.207.162/jhp/order.jhp?test=0&user=LHZQ&date=20070906
    20070907:http://210.21.207.162/jhp/order.jhp?test=0&date=20070907http://210.21.207.162/jhp/order.jhp?test=0&user=LHZQ&date=20070907
    200709010:http://210.21.207.162/jhp/order.jhp?test=0&date=20070910http://210.21.207.162/jhp/order.jhp?test=0&user=LHZQ&date=20070910
    20070911:http://210.21.207.162/jhp/order.jhp?test=0&date=20070911http://210.21.207.162/jhp/order.jhp?test=0&user=LHZQ&date=20070911
    20070912:http://210.21.207.162/jhp/order.jhp?test=0&date=20070912http://210.21.207.162/jhp/order.jhp?test=0&user=LHZQ&date=20070912
    原来系统设计为14:56自动结束交易以避免集合竞价,实践中发现有时尾盘会白白损失1%甚至更多的收益,于是改成14:56以前使用市价卖单,14:56以后使用限价卖单参与集合竞价。
    开盘发现修改时犯了个重名变量的错误马上纠正,还好没有遭遇大的损失。另外今天卖了部分股票导致可用资金增大,账户失去了连续性。
    20070913:http://210.21.207.162/jhp/order.jhp?test=0&date=20070913http://210.21.207.162/jhp/order.jhp?test=0&user=LHZQ&date=20070913
    今天缩量,10万元的单子冲击成本也大了,有时甚至会冲到盘口第四档,看来还是要先降低测试头寸的规模。这两天参与尾盘的集合竞价看来是明智的。
    由于磁盘空间限制,8月10日以前的数据都转移走了,对应链接也失效了。
    20070914:http://210.21.207.162/jhp/order.jhp?test=0&date=20070914http://210.21.207.162/jhp/order.jhp?test=0&user=LHZQ&date=20070914
    今天尾市一笔244手的市价卖单居然打穿了五档,有6手被自动撤单,实在出乎意料,又要修改交易接口了。
    20070917:http://210.21.207.162/jhp/order.jhp?test=0&date=20070917http://210.21.207.162/jhp/order.jhp?test=0&user=LHZQ&date=20070917
    20070918:http://210.21.207.162/jhp/order.jhp?test=0&date=20070918http://210.21.207.162/jhp/order.jhp?test=0&user=LHZQ&date=20070918
    20070919:http://210.21.207.162/jhp/order.jhp?test=0&date=20070919http://210.21.207.162/jhp/order.jhp?test=0&user=LHZQ&date=20070919
    资金放大后的6天除了911赚钱外连续亏损5天,累计亏损1万余元,差不多将2个月来实盘帐户的盈利全部回吐,却为公司创造了1.5万元的手续费,真是郁闷。总结一下几点教训。
    一。过度自信。以为高频实盘交易的结果具备统计稳定性,自恃历史上实盘连续亏损最多两天,在沽权成交萎缩实盘出现亏损时未及时停止操作,一直幻想大盘可能暴跌带动沽权炒作,结果被市场教训了一下。在上海有南航沽权的大量创设,在深圳有广州证监局来查权证炒家的账户,很多炒家都转走资金外出度假了,结果在大盘下跌时沽权板块反倒集体破位。
    二。坚持不足。从历史回溯看038006的平均收益是最高的,但20070918却在038003和038004均能获利的情况下亏损超过5%,结果今天换了昨天放量的038004后又变成了实盘亏损,而其他2个反倒可以获利超过5%。现在看来,越是出现异常亏损的情况下越要坚持,轻率换股很可能是两面挨耳光。
    三。不思进取。在实盘操作短期稳定盈利的情况下大量精力用于盯盘,没有深入钻研策略改进,尤其是交易对象的自适应切换策略,对近期购权的行情也没有可以应对的策略,实际上眼前的奶酪随时可能消失,应该尽快研究其他风格的替代策略。
    明日计划将帐户规模重新下调至2万元,集中精力改进策略。
    20070920:http://210.21.207.162/jhp/order.jhp?test=0&date=20070920http://210.21.207.162/jhp/order.jhp?test=0&user=LHZQ&date=20070920
    20070921:http://210.21.207.162/jhp/order.jhp?test=0&date=20070921http://210.21.207.162/jhp/order.jhp?test=0&user=LHZQ&date=20070921
    0920下调资金量后上午赚了近6个点,又很郁闷,结果下午追加资金后又变成亏钱,0921盘中两次打穿5档,后面一次觉得该反弹没有及时手工平仓,又跌去10%,这几天的主观决策全部失误,教训深刻,下周开始从头再来吧。在高频交易时10万元级的帐户与1万元级的帐户相比冲击成本可能增加0.8个百分点以上,影响是很显著的,除非出现巨量行情,否则再也不能轻易放大资金了。
    20070924:http://210.21.207.162/jhp/order.jhp?test=0&date=20070924http://210.21.207.162/jhp/order.jhp?test=0&user=LHZQ&date=20070924
    今日将主帐户实盘资金重新调整为20000,上午打平,盈利8.3元,中午做了申购新股的操作导致需要重新初始化(本来早晨改了程序避免重启,结果发现有错误),下午亏损近5%,在3只深圳沽权中还是相对最好的。
    20070925:http://210.21.207.162/pub/038006-070925am.htm(主账户上午),http://210.21.207.162/jhp/order.jhp?test=0&date=20070925(主账户下午),http://210.21.207.162/pub/038003-070925am.htm(小账户第一段),http://210.21.207.162/jhp/order.jhp?test=0&user=LHZQ&date=20070925(小账户第二段)
    今日迎来了久违的大阳线。主帐户在038006上盈利35.69%,小帐户在038003上盈利27.69%。
    两个帐户都因为行情数据有误导致系统需要重启。038003在100315的行情是明显的错误,但如何触发了一个卖出信号我还没想通,038006在112400停盘期间行情由2.782跳到2.78引发一个市价卖单被自动撤单。
    准备对价格加一个简单过滤[0.001,1000],并且取消市价卖单,回退到打低5%的限价卖单。
    20070926:http://210.21.207.162/jhp/order.jhp?test=0&user=LHZQ&date=20070926
    今日主帐户开盘3.729买入038006,在第二段停牌期间的10:21和10:31两次读到错误行情产生交易信号,无奈停掉系统,在停牌打开后4.55卖出后再启动系统,没想到马上又停了,买入委托没有成交,全天只成交一笔,收益20.62%,反不如小帐户在038003上的36.42%收益。
    20070927:http://210.21.207.162/jhp/order.jhp?test=0&date=20070927http://210.21.207.162/jhp/order.jhp?test=0&user=LHZQ&date=20070927
    今天总算系统没出问题,主帐户微利1.59%,小帐户亏损19.04%,走势相近结果却相差如此之大,有些奇怪.
    20070928:http://210.21.207.162/jhp/order.jhp?test=0&date=20070928http://210.21.207.162/jhp/order.jhp?test=0&user=LHZQ&date=20070928
    今日主帐户赢利7.73%,小帐户赢利7.84%(盘中出错停了一阵,好在收市前及时发现没错过尾市急升)。
    为节约空间将8月份数据都转移走了。
    20071008:http://210.21.207.162/jhp/order.jhp?test=0&date=20071008http://210.21.207.162/jhp/order.jhp?test=0&user=LHZQ&date=20071008
    20071009:http://210.21.207.162/jhp/order.jhp?test=0&date=20071009http://210.21.207.162/jhp/order.jhp?test=0&user=LHZQ&date=20071009
    20071010:http://210.21.207.162/jhp/order.jhp?test=0&date=20071010http://210.21.207.162/jhp/order.jhp?test=0&user=LHZQ&date=20071010
    20071011:http://210.21.207.162/jhp/order.jhp?test=0&date=20071011http://210.21.207.162/jhp/order.jhp?test=0&user=LHZQ&date=20071011
    20071012:http://210.21.207.162/jhp/order.jhp?test=0&date=20071012http://210.21.207.162/jhp/order.jhp?test=0&user=LHZQ&date=20071012
    20071015:http://210.21.207.162/jhp/order.jhp?test=0&date=20071015http://210.21.207.162/jhp/order.jhp?test=0&user=LHZQ&date=20071015
    20071016:http://210.21.207.162/jhp/order.jhp?test=0&date=20071016http://210.21.207.162/jhp/order.jhp?test=0&user=LHZQ&date=20071016
    20071017:http://210.21.207.162/jhp/order.jhp?test=0&date=20071017http://210.21.207.162/jhp/order.jhp?test=0&user=LHZQ&date=20071017
    今天发现程序一个bug,14:57下的买单要15:00:26集合竞价结束成交,结果14:58的卖单15:00:40才报出去,已经无法成交了.现在修改成14:56:40秒以后不再下新的买单.
    20071018:http://210.21.207.162/jhp/order.jhp?test=0&date=20071018http://210.21.207.162/jhp/order.jhp?test=0&user=LHZQ&date=20071018
    20071019:http://210.21.207.162/jhp/order.jhp?test=0&date=20071019http://210.21.207.162/jhp/order.jhp?test=0&user=LHZQ&date=20071019
    今日主账户亏损14.2%,从高点累计回撤达到27%,均创了记录.考虑到后面可能快速价值回归,先停止主账户在038006上的实盘交易,研究算法改进.
    20071022:http://210.21.207.162/jhp/order.jhp?test=0&date=20071022http://210.21.207.162/jhp/order.jhp?test=0&user=LHZQ&date=20071022
     
  2. 这个帖子好!!!谢谢ITFIN!!
     
  3. 我从BLOOMBERG终端上看,确实还有一种行情,可能是流式的,是真正逐笔成交。另外给一个建议:根据交易流量建立一个统计模型,计算在不同的买卖价位上未来3秒或5秒内各自成交的概率,以及对应的可能成交量分布。
    在你的交易频率以上,交易接口的可靠性就已经成为整个系统中一个举足轻重的环节了。有时甚至需要把业务处理逻辑直接编到接口里去。例如发现一张错单后,交易接口做自动平仓处理,这样就不需要人工来干预,交易过程也就不会中断。
     
  4. 两个必要条件:一是至少创出两个新高(低),二是破坏了原有趋势,即高(低)于上一趋势的倒数第二个新低(高).

    没听明白,请解释一下?趋势判断示意图的大点、小点分不清。
     
  5. 有没有Pick模块,还是basket or random or artificial?
    有没有构建指数,如所有权证、购权、沽权的指数?
    是否考虑了正股和A股指数因素?
    如何考虑权证流通份额及其创设注销?
     
  6. 这种完整重现真实交易的帖子太宝贵了,谢谢itfin
     
  7. 我看过一个Q40的报告,是你写的吧?
     
  8. 权证,尤其是沽权,我非常怀疑系统交易成立的可能性,倒是神经网络很有希望,记住上涨前的指纹,提取模式向量,然后采用匹配的方式寻找下一个机会。
     
  9. 看盘和交易的工具如果一般的话,那权证是中国产品中滑移最大的东西了。我以前做过基于TICK的权证交易,最大的感受就2个,滑移大和不能空。
     
  10. 1。没听说深圳有高速行情,上海的场内行情确实是快一些,而且是非均匀采样,但也不是逐笔成交,刷新频率大约是dbf接口的两倍,速度可能快3秒左右。我刚把行情采集程序写好,但还不能接进原有系统中,因为毛刺太多了,策略肯定要调整。这几天可以积累一些数据做测试。
    2。由于行情数据分辨率太粗,统计可靠性很难保证。我曾经试过用买一卖一均价代替最新价,结果效果很差。大部分成交盘可能都是主动性攻击盘,在盘口里统计不到。
    3。交易接口确实要提高稳健性和增加逻辑处理,主要因为资金量小,另外这部分比较罗嗦,一直没愿意深入搞,现在看来至少要用真正的市价单代替限价单。另外我用的是一台64位的linux,这个平台上金证没有相应接口,委托还要中转2次报出去,也增加了不稳定性。
     
  11. 10分钟图看不清,改成5分钟图如何?http://210.21.207.162/jhp/order.jhp?date=20070820&t0=93000&t1=93500,反正t0和t1两个参数是可调的。
    4.47是新低,4.475到4.48之间有一个新高,4.48到4.485之间是第二个新高,前面下跌的倒数第二个新低(小绿点)在4.47和4.475之间,所以这第二个新高就确认了一个上升趋势,标以大红点,发卖入信号。下跌情况类似。
     
  12. 都没考虑,就是单品种价格走势的单纯趋势跟踪。
     
  13. 不是,我真正开始实盘程式化交易就是这两个月的事。
     
  14. 高频交易确实滑价太高,赔赚可能都是完全出于偶然。下一步也准备研究如何只捕捉那些非常流畅的上涨。
     
  15. 过两天争取试一下上海的高速行情能否有效降低滑价。
     
  16. 佩服!
    提个建议,为啥不多打打策略的主意,不一定测试单纯的走势跟踪,减少交易的次数,盈利可能会降低,但可能更稳定,而且能够容纳的资金也要大的多
     
  17. 谢谢!
    下一步会尝试其他风格的策略。高频交易的好处是会有相对多的样本,安全感会强一些。
     

  18. 是的,另外如果结合了多策略,那么高频交易可以有效地使资金曲线平滑化。
     
  19. 高频交易研究有2种,一个是以"作市商"思路为出发点的,一个是以类似"短线狙击手"那种思路为出发点的,统计交易各时段的波动情况.
     
  20. 每次发出单字后,可以立刻更新“理论净手数”,然后再去主动检查“实际净手数”,发现问题自动多退少补,这样实际上已经把成交回报做好了,也做了其他事情。
    先把纯粹的自动化环节做好,策略上的事情是第2步的,第一事情没有好,其他就很风险。