【零基础】极星量化扩展二:尾盘清仓

一、前言

  很多童鞋一直有问怎么尾盘清仓,每次我都根据不同的场景给了一些建议,这里索性我就汇总一下这些思路,然后给出具体的实现方法,以后再有人问就发这个给他。

二、思路

  尾盘清仓的两个重点,第一是尾盘怎么判断,第二个是怎么清仓。清仓其实简单,几行代码就搞定了,难就难在了尾盘的判断上,而且不同交易所的交易时间还不一样这就为捋清思路增加了难度。那么这里我们就先捋一捋各种可能存在的情况和时间点。

  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是包含清仓逻辑的代码。

  

 

 

 

 

 

 

  

posted @ 2020-07-20 07:38  布兰姥爷  阅读(837)  评论(0编辑  收藏  举报