微软的开源量化框架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不是很香么。
总体来说,如开篇所言,是的。
之初打算是以qlib平台为基础,自己做扩展就好。
后来遇到的问题是qlib的回测引擎不支持传统策略,要扩展这块不容易。所以就自己写的。而且它的模型与表达式引擎相对独立,本身就容易拆份。剩下的就是数据下载与存储,而我目前更偏重研究,工程上的东西与高频恰恰不是最重要的。
如果,工作量也可以接受,而且本身也是很好的学习的过程,更加重要的是,这件事要做很久,所以越可控越好。
故而,有了ailabx这个开源项目和星球。
在准备一门量化投资与机器学习的课,我觉得这很有意义。机器学习的高维统计力,可以给金融这么高大上的行业赋能。