【零基础】极星量化扩展二:尾盘清仓
一、前言
很多童鞋一直有问怎么尾盘清仓,每次我都根据不同的场景给了一些建议,这里索性我就汇总一下这些思路,然后给出具体的实现方法,以后再有人问就发这个给他。
二、思路
尾盘清仓的两个重点,第一是尾盘怎么判断,第二个是怎么清仓。清仓其实简单,几行代码就搞定了,难就难在了尾盘的判断上,而且不同交易所的交易时间还不一样这就为捋清思路增加了难度。那么这里我们就先捋一捋各种可能存在的情况和时间点。
1)盘中休息清仓:针对的是有中午休息制度的交易所,比如内盘的几家基本都是在中午11点30到下午13点30休息,下午15点到晚上9点也休息
2)交易日结束清仓:针对的是非24小时连续交易的品种,比如几乎全部内盘品种和部分外盘品种
3)每周结束清仓:即使是24小时连续交易的交易所,周末还是要休息的,所以周五的晚上或者周六的凌晨可以做清仓。持仓不过周末是很多外盘老哥的多年心得。
汇总一下的话,那其实就是两种情况:
1)交易日指定时刻清仓
2)每周最后交易日收盘前清仓
那么现在的问题就变成:
1)如何知道今天是否是交易日、是否是本周最后交易日
2)如何知道当前交易日、当前交易所几点开始交易,几点休息,几点收盘
另外我们还要考虑因为假期导致的交易日或交易周提前结束。
仔细翻看了极星量化每一个函数后,发现有五个似乎有用的函数。
这几个函数能够得到的信息有:某个品种的交易时段个数,然后根据时段index获取时段的开始和结束时间。但这些信息依然找不到交易周的最后一日,周末的判断我们可以通过一些公共函数来做,但交易所假期就不好处理了。
所以还是得辅助一点人工,使用代码来自动生成常规的交易日历和交易时间段,然后再根据交易所的通知来特设假期和清仓时间。
三、实现
实现要按交易所来分别做,内盘大家都一样但是外盘几十家交易所每家情况可能都不一样,不同地域假期还不同,搞全套可能就太麻烦了,所以我这里就只做内盘一家交易所郑商所作为示例,其他的原理相同大家自由发挥。
1、生成通用交易日历
本来想从网上找一个现成的,有个提供API查询的网站似乎停止服务了,于是只能自己做了。
1)生成全年的日期信息
参考:https://www.cnblogs.com/andy9468/p/10710142.html
需要安装arrow,很简单,找到你极星量化的安装目录,比如我的是“C:\Users\25309\AppData\Roaming\equant_pkg”
接着找到Miniconda\Scripts,下面有个pip.exe,我们就是用这个来安装arrow。现在完整的路径应该是“C:\Users\25309\AppData\Roaming\equant_pkg\Miniconda\Scripts\”
打开CMD,先进入路径“C:\Users\25309\AppData\Roaming\equant_pkg\Miniconda\Scripts\”,然后输入指令pip.exe install arrow即可
具体代码在放在最后,参考前面说的链接我们获取了2020年全年所有日期。
2)识别出指定日期是周几
全球大部分交易所周末都是不交易的,但是外盘会有点复杂,比如有些交易所周六凌晨还有交易,因为这个时间对他们来说可能还是晚上。所以我们不能直接一刀切说周末全都不交易了,干脆将所有日期是周几都识别出来。
3)将全年日期和周几记录到文件
我们将日期和对应的周几数写入文件,CSV格式方便后面编辑和使用。
最后我们得到了下面这样的文件,需要注意这个文件在我电脑上的路径是“C:\Users\25309\AppData\Roaming\equant_pkg\equant\src\CZCE.csv”,各人根据实际情况找找看
4)将公共假期标记出来
除了周末我们还经常要放假的,比如过年国庆啥的,这个就只能自己上网搜了。
除了国家假期,交易所也可能会发布不交易的通知,比如2020年因为新冠疫情原因导致好几个月暂停夜盘交易。
这里我们先将公共假期,铁定不会交易的日期标注出来。至此我们已经有了一个“标准”的交易日历,下面是考虑如何根据实际需要来应用它。
2、在交易日历中标记清仓时间
郑商所交易时间是:9:00-10:15 10:30-11:30 13:30-15:00 21:00-23:00
我们这里不可能考虑到所有情况,所以就实现一种情况“每日收盘前清仓”,这里假设是提前10分钟开始清仓,每间隔一分钟判断持仓情况并考虑是否重新挂单。
大部分情况下我们认为晚上23点为一天的收盘时间(虽然实际上并不是),但有些情况下是没有夜盘的,比如节假日前以及新冠疫情期间,同时周末是没有交易的,所以我们先把每日22:50开始清仓的时间写入交易日历,比如下面这样。
接着由于假期前没有夜盘所以清仓时间要改为14:50。
然后处理特殊情况,比如新冠疫情导致很长时间没有夜盘(郑商所5月6日起恢复夜盘)。
最后考虑到节假日和周末不交易但是我们量化可能不关闭,那么可以将节假日和周末的时间备注删除。
这样我们就得到了2020年完整的交易日历,并标注了每日具体的清仓时间,下面就是在代码中根据这个时间来执行清仓操作了。
如果你是要周末清仓或者节假日前清仓,那么只需要将这个表不清仓日期对应的时间删除即可。如果交易所发布了新的公告修改了交易时间,那么对应修改表中的时间即可。
3、代码中执行清仓操作
执行清仓操作也有一点小技巧,因为我们策略的触发周期是不固定的,比如有些童鞋可能是5分钟,有些是10分钟,还有以一个小时为触发周期的。假如某日的清仓时间为22:50,若你的触发周期为5分钟,那么22:50-23:00你策略最多只触发两次,如果触发周期为10,那么你可能只能触发一次,如果是1小时的周期,那么一次也触发不了。这样的话对于较大触发周期的策略可能就会错过清仓时机。
所以我们在策略原来的触发周期之上再叠加一个触发周期,比如可以设置为定时1分钟触发一次,这个触发周期专门用来处理清仓操作。
1)设置一个定时触发并在代码中区分清仓操作和普通策略
2)获取当前日期并查询清仓时间
3)构建清仓逻辑
要实现清仓的逻辑闭环还是要写不少代码的,另外写到这里我才发现,文件中标注上清仓的开始时间和结束时间比较好,现在这样的做法时间上有点误差。
四、总结
由于时间有点赶,写了个半成品,算是把意思写出来了,但是并不完善不能直接使用,大家可以参考这个代码自己改个完善一点的。完整代码如下:
https://share.weiyun.com/bfF5Xade
其中t1是生成基础交易日历的,t2是包含清仓逻辑的代码。