qlib平台很香,但我还是造了轮子...

微软的开源量化框架qlib是个不错的项目。代码质量好,工程能力强。

但直接是机器学习导向,后面使用了大量的ymal,导致在学习阶段,定制阶段有些困难。

而且qlib的回测引擎偏弱,不太符合传统的回测系统的习惯,之前已经用自主研发的替代了,这两天直接把数据管理与表达式引擎也拆分出来,所以不用有qlib的依赖了。

但对于qlib还是会持续关注它的进展,它的model zoo里有大量而且还在持续更新的前沿的机器学习模型都很值得关注。

我增强了qlib的表达式引擎。

feature_name = [
    ('PairSlope($high, $close,18)','RSRS'),
    ('$close / Ref($close,20) -1 ','20日动量'),
    ('$20日动量>=0.08','to_buy_momentum'),
    ('$20日动量<0.0', 'to_sell_momentum'),
    ('$RSRS>=0.08', 'to_buy_RSRS'),
    ('$RSRS<0.0', 'to_sell_RSRS'),
    ('Ref($close,-1)/$close -1', 'label'),
]
df = D.load(codes=['000300.SH', '000905.SH', '399006.SZ'],
                        feature_name=feature_name)

比如20日动量指标是表达式生成的,后面的字段可以直接使用$20日动量来引用,qlib是从本地加载feature,所以它是做不到的。

我把qlib的dataframe的双索引简化了,使用instument,date作为索引,从显示上看是简洁不少,但使用的使用,总要判断index的level,而且loc还无法直接使用,造成麻烦,就使用date作为index就好,而且laebl与feature都是数据标注,不必作区分。

新增一个机器学习的策略。

class StrategyMachineLearning(Strategy):
    def __init__(self, name, params={}):
        algo_list = [
            #SelectBySignal(signal_buy=params['signal_buy'],signal_sell=params['signal_sell']),
            SelectTopK(K=params['K'], col=params['sort_by']),
            WeightEqually()
        ]
        super(StrategyMachineLearning, self).__init__(name,algo_list=algo_list)
        self._init_model(params)


    def _init_model(self, params):
        df = params['df']
        from engine.model.gbdt import LGBModel
        m = LGBModel()
        m.fit(df)
        results = m.predict()
        df['pred_score'] = results

 此策略多一个初始化,即如果模型没有训练过,则需要先训练模型,而后使用模型对数据进行预测,生在pred_score这一列,用于策略回测。

这一部分就是机器学习策略的核心,后续交给sklearn、集成学习、pytorch这样的框架来完成。

下一步搞搞集成学习:

qlib平台很香,但我还是造了轮子..._第1张图片

有人问我,为何重复造轮子?qlib不是很香么。

总体来说,如开篇所言,是的。

之初打算是以qlib平台为基础,自己做扩展就好。

后来遇到的问题是qlib的回测引擎不支持传统策略,要扩展这块不容易。所以就自己写的。而且它的模型与表达式引擎相对独立,本身就容易拆份。剩下的就是数据下载与存储,而我目前更偏重研究,工程上的东西与高频恰恰不是最重要的。

如果,工作量也可以接受,而且本身也是很好的学习的过程,更加重要的是,这件事要做很久,所以越可控越好。

故而,有了ailabx这个开源项目和星球。

在准备一门量化投资与机器学习的课,我觉得这很有意义。机器学习的高维统计力,可以给金融这么高大上的行业赋能。

你可能感兴趣的:(建立自己的算法交易事业,机器学习,人工智能)