继续昨天的话题,今天要完成Qlib的数据标注与自定义指标计算。
数据标注
我们已经加载的OHLCV数据,并进行了时间序列相关分析。
下一步要从价量数据里进一步计算特征,传统技术分析指标,如均线、MACD,RSI,布林带都是衍生指标,也是特征之一。
传统量化系统,需要自己写指标公式或者借助Talib这样的工具包。这对于传统技术分析,指标比较少,通常就2-3个是比较容易实现和管理的。但对于机器学习,我们可以同步计算上百个特征,那么如果有这种方式就难以管理了。
Qlib内置了表达式引擎,可以通过'$high-$low',这样的表达式来计算衍生指标。更复杂的指标,比如计算MACD:
MACD_EXP = '(EMA($close, 12) - EMA($close, 26))/$close - EMA((EMA($close, 12) - EMA($close, 26))/$close, 9)/$close'
$close是取dataframe里已有的字段,EMA是表达式引擎内置的函数。Qlib的表达式引擎里预置了很多常用的,时间序列计算的有效函数。
from qlib.data.dataset.loader import QlibDataLoader
MACD_EXP = '(EMA($close, 12) - EMA($close, 26))/$close - EMA((EMA($close, 12) - EMA($close, 26))/$close, 9)/$close'
fields = [MACD_EXP,'$close'] # MACD
names = ['MACD','收盘价']
labels = ['Ref($close, -2)/Ref($close, -1) - 1'] # label
label_names = ['LABEL']
data_loader_config = {
"feature": (fields, names),
"label": (labels, label_names)
}
data_loader = QlibDataLoader(config=data_loader_config)
df = data_loader.load(instruments='all', start_time='2010-01-01', end_time='2017-12-31')
print(df)
QlibDataloader比D.features更高层的API,用法类似,定义fields就是原始字段及衍生的表达式,而且可以定义labels。
Label是机器学习的标签,Ref($close,-2)是T+2的收盘价,这里使用的label是T+2天的收益率,也就是未来2天的收益率——这是考虑A股市场T+1的机制,在T+1天买入,T+2天卖出。
内置指标体系与自定义指标计算
Qlib内置了两个指标体系。
import qlib
from qlib.contrib.data.handler import Alpha158
data_handler_config = {
"start_time": "2016-01-01",
"end_time": "2020-08-01",
"fit_start_time": "2016-01-01",
"fit_end_time": "2018-12-31",
"instruments": "csi300",
}
h = Alpha158(**data_handler_config)
# get all the columns of the data
print(h.get_cols())
# fetch all the labels
print(h.fetch(col_set="label"))
# fetch all the features
print(h.fetch(col_set="feature"))
Alpha158,和Alpha360。
158和360分别是指标的数量。
它们使用一个类来实现,都继承了DataHandlerLP,需要实现两个函数,一个是定义feature,另一个是label。
class Alpha360(DataHandlerLP):
def get_label_config(self):
return (["Ref($close, -2)/Ref($close, -1) - 1"], ["LABEL0"])
def get_feature_config(self):
pass
在学习之初,不建议使用两个库,我们简单了解一下它的实现就好了。
我们做主动投资,还是从最简单的动量策略入手,走通整个循环。
如下是Qlib支持的运算符号。
OpsList = [
Ref,
Max,
Min,
Sum,
Mean,
Std,
Var,
Skew,
Kurt,
Med,
Mad,
Slope,
Rsquare,
Resi,
Rank,
Quantile,
Count,
EMA,
WMA,
Corr,
Cov,
Delta,
Abs,
Sign,
Log,
Power,
Add,
Sub,
Mul,
Div,
Greater,
Less,
And,
Or,
Not,
Gt,
Ge,
Lt,
Le,
Eq,
Ne,
Mask,
IdxMax,
IdxMin,
If,
]
过去5天的动量$close/Ref($close,5) – 1
非常方便的就把相应的特征指标计算出来,把数据做好标注。
这就得到了一个完整的数据集,可以用于机器学习训练了。
系列文章:
Qlib入门到精通系列 #1
ETF数据从tushare下载导入Qlib | Qlib入门到精通 #2
当量化投资遇上机器学习,建立你的智能算法交易事业