数据标注与自定义特征计算 | Qlib从入门到精通 # 3

继续昨天的话题,今天要完成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从入门到精通 # 3_第1张图片

这就得到了一个完整的数据集,可以用于机器学习训练了。

系列文章:

Qlib入门到精通系列 #1

ETF数据从tushare下载导入Qlib | Qlib入门到精通 #2

当量化投资遇上机器学习,建立你的智能算法交易事业

你可能感兴趣的:(建立自己的算法交易事业,python)