原创文章第621篇,专注“AI量化投资、世界运行的规律、个人成长与财富自由"。
这篇研报,已经在星球同步,代码(明天周五)提交。
原研报是自己改进了gplearn,我使用deap框架来做:
1、整理41支期货的主连合约数据:
2、函数算子实现:
算子分为几类:
一元非滑动类,这类最简单,直接使用np的函数就可以了,代码在expr_unary.py里。
然后一元滑动类的函数很多——主要都是时间序列滑动窗口(rolling)的统计类,比如均值,中位数,偏度,峰度,最大,最小值,排序等等。
import numpy as np import pandas as pd from .expr_utils import calc_by_symbol, calc_by_date @calc_by_symbol def ts_delay(se: pd.Series, periods=5): # 滞后N天的序列 return se.shift(periods=periods) @calc_by_symbol def ts_delta(se: pd.Series, periods=20): # 当前序列与滞后N天之差 se_result = se - se.shift(periods=periods) return se_result @calc_by_symbol def ts_mean(se: pd.Series, d): return se.rolling(window=d).mean() @calc_by_symbol def ts_median(se: pd.Series, d): return se.rolling(window=d).median() @calc_by_symbol def ts_pct_change(se: pd.Series, N): return se / se.shift(N) - 1 @calc_by_symbol def ts_max(se: pd.Series, periods=5): return se.rolling(window=periods).max() @calc_by_symbol def ts_min(se: pd.Series, periods=5): return se.rolling(window=periods).min() @calc_by_symbol def ts_maxmin(X, d): return (X - ts_min(X, d)) / (ts_max(X, d) - ts_min(X, d)) @calc_by_symbol def ts_sum(se: pd.Series, N): ret = se.rolling(N).sum() return ret @calc_by_symbol def ts_std(se, periods=5): return se.rolling(window=periods).std() @calc_by_symbol def ts_skew(X, d): return X.rolling(window=d).skew() @calc_by_symbol def ts_kurt(X, d): return X.rolling(window=d).kurt() @calc_by_symbol def ts_argmin(se: pd.Series, periods=5): return se.rolling(periods, min_periods=2).apply(lambda x: x.argmin()) @calc_by_symbol def ts_argmax(se: pd.Series, periods=5): return se.rolling(periods, min_periods=2).apply(lambda x: x.argmax()) @calc_by_symbol def ts_argmaxmin(X, d): return ts_argmax(X, d) - ts_argmin(X, d) @calc_by_symbol def ts_rank(se: pd.Series, periods=9): ret = se.rolling(window=periods).rank(pct=True) return ret # @calc_by_symbol # def ts_product(se: pd.Series, d): # return se.rolling(window=d).apply(np.product) # #
迭代结果:
写了个notebook在这里:
最终挖掘出来的因子如下图示(大家可以自行增减算子函数):
01 每日策略
今天我们来配置一个经典的策略——创业板布林带策略:
我们实现两个指标:布林带上下轨,使用内置的函数bbands_up(close,20), bbands_down(close,20)即可。
然后交易信号分别为:bbands_up>close, close<bbands_down。
已经发布到服务器:
03 Deap因子挖掘——单因子分析
Alpha5的因子表达式为ts_dema(ts_median(ts_cov(open, volume,21),21),15),它同样可以归属为量价相关性类因子。
它描述了开盘价与成交量的相关性中枢的移动平均水平。
按研报的计算,是得不到相应的结果的:
没有单调性
IC值是负向的,但IC不显著:
而且,你换个时间区间,得出的结果差异性会很大,比如你从20100101来始算,或者结束时间算到当下最新,结果都会不一样。
——金融量化,并不是一门严格的科学。
历史文章: