原理:
查阅了一些资料,看了大家的策略,又总结和归纳了一些,大概分为,选股、进场时机、持仓平衡、现金管理、出场时机、风险管理,一些工具组件。下面直接上demo代码简单写。
模板代码:
说明:分钟回测,组合初始100万现金,交易手续默认的,无卖空,benchmark为默认,进场策略输出了股票列表,出场策略也是返回要卖出的股票列表……
1.传奇的小市值策略(市值最小的100只股票做为每天的备选列表),这个因子表现的最好,为什么用了这个吸引眼球的选股因子呢,主要是为避免模板的demo曲线表现太差,高手勿笑;
2.以大家熟悉的5日均线上传10日均线进场,并保持20日线为进场条件;
3.出场为低于20日线的99%为强制出场(近两年,20日线基本作为了行业标配了,反正有点用) ;
4.持仓策略:在市值不便的情况下平均持仓,每日临近收盘进行再平衡,理想情况保持每只持仓占比相等
5.现金管理:本来想再收盘前现金买进“银华日利”,但由于默认市价交易滑点太大,就省略了(要限价交易才可能有利润,但是这里也发现尾盘表现非常不好,就注释掉了)
6.风险管理:略了,流传一个大盘跌过3%的强制止损风险策略,小市值也可以增加二八轮动的择时,没有加上,有兴趣可以自己弄着玩,加这个模块里;
7.交易方式:为了避免过大的成家量超过25%的error,这里都下的限价单,但是后续模块化吧,另控制了单只持仓不超过10%~(模块写起来比较复杂,还要新建dict进行撤单再下单等计算,后续成熟了,再拿出来分享)
8.工具:
trans、历史数据强制转化成真正的DataFrame(效率问题,做了.T的来回变换),问licco说,其实2016年5月2X后就不需要了
n日内随机交易的收益率概率(例子中未用到)
多个list里取交集,懒得每次都写了,干脆写了个小函数
标的上市自然日的函数,避免次新股对收益干扰太大,要真像炒次新股,要好好研究一下,个人做过尝试发现,高风险高利润,大盘择时比较关键,干脆这里做了过滤比如一定要上市超过60个自然日
是否涨跌停区间,一定要可交易,人家都封版了,交易量有,关咱策略毛事,所以也进行了过滤
因为分钟回测,所以选择了14:50作为买入时间点,而出场选择每15分钟采样计算一次(性能压力和必要性的问题),14:59(后来发现深圳市场应该14点56,要不57开始深圳会集合竞价了,但是例子里没有调整,所以还是error一大堆,见笑了)
接下来就是代码啦,可读性还是很强的,大家可以运行起来试试。
import pandas as pd
import numpy as np
import time
import math
import itertools
# 数据准备
def init_variables (context):
context.init = 0
context.days = 0
context.barcount = 0
context.choosenum = 300</