百天计划之第25天,关于“智能量化,财富自由与个人成长”。
8月的重点工作是讲清楚qlib智能量化框架的使用,不只是tutorail这样的试用教程,而是真正用于生产环境。
文档和示例有很多未尽事宜,而且框架本身还没有到1.0,还有持续迭代开发中,所以很多具体的用法,需要到代码中去理解。
好在qlib的代码质量还是非常高的,写得非常清晰,读qlib的代码,对于python编程能力也有帮助。
今天重点说说:
基于自定义的A股股票池,自定义指标:均线,动量,MACD等,然后可视化出来。
01 从tushare到mongo
昨天的文章,我们把茅台(600519.sh)的日线数据以及财务指标入库mongo并导入到qlib的库中。今天我们扩展成10支股票(一次到位可以,需要一些时间,作为示例,10支与4000支区别不大)。
选择我自己持有的一支基金——富国天惠(161005)的前十大重仓股:
tips: mongo默认是按照_id字段去重的,而且会把_id相同的直接忽略掉,其余可以正常写入,这一点非常方便。
从tushare批量建数据,还涉及到每天盘后更新。
所以呢,一般会把_id设置成唯一key,这样不用担心数据重复入库。
每次入库前,会判断已经入库的日期,然后以此日期为起点,从tushare读取增量数据,其余逻辑都是一致的。
02 从mongo到qlib
逻辑类似,都有一个一次性建立以及增量更新的问题。
与mongo入库类似,我们通过查询qlib数据中已经存在的最近的日期,以此为起点去mongo读增量数据。
03 读取时间序列并绘图
茅台的收盘价(后复权)
MACD_EXP = '(EMA($close, 12) - EMA($close, 26))/$close - EMA((EMA($close, 12) - EMA($close, 26))/$close, 9)/$close' fields = [MACD_EXP, '$close'] # MACD data_loader_config = { "feature": (fields, ['MACD', '收盘价']), # "label": (labels, label_names) } data_loader = QlibDataLoader(config=data_loader_config) df = data_loader.load(instruments=['600519.SH']) df = df['feature'] print(df) df['收盘价'].plot()
茅台现在"后复权"收盘价达到14700+!
茅台历史上的MACD值序列如下:
qlib数据库的好处就是在原始序列的基础上,计算指标会很方便,而且内置了多进程,缓存系统等功能,能省我们不少数据处理相关的事情。
04 自定义表达式
内置的表达式主要是一些基础的计算函数,我们可以组合出基础的计算功能,而且我们自己自己实现表达式,并注册给系统即可。
class Distance(PairOperator): def _load_internal(self, instrument, start_index, end_index, freq): series_left = self.feature_left.load(instrument, start_index, end_index, freq) series_right = self.feature_right.load(instrument, start_index, end_index, freq) return np.abs(series_left - series_right)
如上是对两个序列,计算“距离”。
对表达式进行注册:
kwargs = {"custom_ops": [Distance]} qlib.init(provider_uri=str(path.resolve()),**kwargs)
注册后就可以如内置的表达式一样正常使用:
fields = [MACD_EXP, '$close', 'Distance($close,$open)']
5日均线:
计算5日动量:
'$close/Ref($close,5)-1'
近期文章: