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


    一、前言

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

    二、思路

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

      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:Users25309AppDataRoamingequant_pkg”

      接着找到MinicondaScripts,下面有个pip.exe,我们就是用这个来安装arrow。现在完整的路径应该是“C:Users25309AppDataRoamingequant_pkgMinicondaScripts”

      打开CMD,先进入路径“C:Users25309AppDataRoamingequant_pkgMinicondaScripts”,然后输入指令pip.exe install arrow即可

      

      具体代码在放在最后,参考前面说的链接我们获取了2020年全年所有日期。

      

      2)识别出指定日期是周几

      全球大部分交易所周末都是不交易的,但是外盘会有点复杂,比如有些交易所周六凌晨还有交易,因为这个时间对他们来说可能还是晚上。所以我们不能直接一刀切说周末全都不交易了,干脆将所有日期是周几都识别出来。

      3)将全年日期和周几记录到文件

      我们将日期和对应的周几数写入文件,CSV格式方便后面编辑和使用。

      

      最后我们得到了下面这样的文件,需要注意这个文件在我电脑上的路径是“C:Users25309AppDataRoamingequant_pkgequantsrcCZCE.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是包含清仓逻辑的代码。

      

      

  • 相关阅读:
    钉钉内网穿透一键启动cmd脚本
    vscode的开发配置文件
    'scope' is defined but never used解决方法
    微信小程序使用echarts不跟随父元素滑动
    小程序图片开发工具能显示真机调试和体验版不显示
    Web端在线实时聊天,基于WebSocket(前后端分离)
    在vue项目中使用scss,以及vscode适配scss语法(解决使用scss语法编辑器报错)
    自动按需引入组件用不了(Vant)
    npm ERR! Unexpected end of JSON input while parsing near '...'解决方法
    div和img垂直居中的方法
  • 原文地址:https://www.cnblogs.com/cation/p/13300309.html
Copyright © 2020-2023  润新知