你好,我是月晖。
从9月底我开通ChatGPT会员给自己编程起,就在回测一个投资策略。大体而言,是受张翼轸老师每周在他公众号里更新的“四资产轮动模型”启发,先选择几种不同资产,比如A股、美股、黄金,再基于动量效应,定期切换到前一段时间表现最好的资产,在不同品类间轮动。
起初做得很笨拙,只是让AI给我写下载数据的代码,我到电脑终端里执行后,再把下载好的数据传给AI,让它写代码去算数画图。很快有了两方面进步:一是从最早使用AKShare和新浪财经数据,改为使用Wind Alice Market数据,因为从Wind下载的数据更准。二是后来用上有了Claude Code,我的技术力量进一步提升,可以展开更加复杂多样的回测。
这种东西的回测,我理解分为两边。
前半部分测试主要是针对策略本身,比如既然是取过去x个交易日里资产的表现,那就要让x取不同的值,更换不同时间窗口,看是否表现类似,从而检验稳健性,确保不是过拟合。又比如尝试加入或者更换资产类别,比如从沪深300改成标普500,从纳斯达克ETF改为日经ETF。
后半部分考察的是策略执行中可能会遇到的问题。首先是对实际交易中可能存在的手续费、滑点这些误差也做了估计,看看加入这些磨损后,策略长期收益率会降低多少。其次是A股买ETF一次必须买一手,也就是100份、数百元,所以每次买入金额必然不可能和账户余额严丝合缝,总会剩下一点小钱,我有测试了这种磨损会带来多少长期损耗。
两方面都测盘,我还让AI给我建言献策,看看还有什么没考虑到的。所有这些准备工作都弄完,我就划转资金,准备买入。
按这个策略的规则,应该是每周五收盘前买进。这看起来只是很普通的一句话,我一度也认为没有问题,岂料会在这个看似正常的地方被绊住。
下午2:50,我打开纳指ETF的交易界面,输入购买量,设置限价单。出于习惯,我设置的价格比市价稍微低一点点。没想到,设完限价单之后,纳指又上涨了一些,此时已经有2:55左右,我意识到若按自己设置的原价,3点收盘前恐怕买不进去。于是我决定撤单,重新挂一个稍微高点的价格。
以往只要交易没有达成,我点击撤单都会立刻撤回,可用资金旋即回到我的账户里。没想到,这次我点击撤单,APP弹出提示,但可用资金却丝毫没有回来。再一看软件显示界面。我的单子还在上面挂着,根本就没撤回。
我以为是bug,又按了几次,退出App重进后重新尝试,结果一无所获。一直到3点整收盘,可用资金依然被那笔根本没能成交的买入耽搁在那里。由于我的策略每次买入都是全仓买,此刻我只能干瞪眼,什么都干不了。
就这样,策略运行的第一天,就给我来了个买入未遂,荒谬的很。
收盘之后上网查,我才知道A股在下午临近收盘的最后3分钟里,可以挂单,也可以达成交易,唯独不能撤单。
这3分钟也就是14:57到15:00,和A股上午开盘之前9:20~9:25那个区间一样,都在集合竞价,在此期间,如果挂单,只有两种可能:成交,或者悬在那里等竞价结束。
像我今天这个单子,就属于我买但没人卖,挂在那里,等到收盘一直没人卖便自动作废。收盘之后等一段时间,资金倒是能退给我,现在可用资金又恢复到了初始状态,只不过想要达成买入,却是只能等下周一了。
所幸后续我又找Claude Code写代码回测,发现这个策略并不特别依赖必须在周五下午收盘前执行。
一方面,把交易时间改到周五上午,长期来看能够提升这个策略的收益。今后我可能会改成上午交易,或者午休时整理数据、下午开盘时操作,别紧赶着收盘前这一小会。
另一方面,随机测试在策略执行中如果有5%、10%乃至20%的交易日,把周五该做的交易拖到下周一,长期年化也就是减少零点几个百分点到一个百分点的水平。
今天买入未遂,那就等到下周一再买吧。
策略回测搞了一堆,基本的交易规则倒是没有记清楚,这确实是我的失误。还好也没有什么损失,只是有点不爽而已。
发表回复