持续行动1期 39/100,“AI技术应用于量化投资研资”之可转债投资。
截至昨天,我们基本把可转债需要的基础数据,时间序列数据都入库mongo,并且生成qlib格式的数据库,并且整合的可转债的转股价,正股价。
现在我们可以来实现转债里有基础但有用的“双低”策略。
轮动的逻辑,就是永远持有目前“得分”最高的标的。”双低“意味着转债的股性和债性综合得分最高,也就是性价比最好。
01 qlib查询双低值
从qlib数据库里查询 转债价格$close,转股价$chg_price,正股价$stk_close,
转股溢价率:$close/(100/$chg_price*$stk_close)-1,
双低值:$close+ ($close/(100/$chg_price*$stk_close)-1)*100
fields = ['$close','$close+ ($close/(100/$chg_price*$stk_close)-1)*100', '$close/(100/$chg_price*$stk_close)-1'] data_loader_config = { "feature": (fields, ['转债价格', '双低值', '转股溢价率']), # "label": (labels, label_names) } data_loader = QlibDataLoader(config=data_loader_config, ) df = data_loader.load(instruments=instruments, start_time=start_date) df = df['feature'] df.sort_values(by='双低值', ascending=True, inplace=True) pprint(df) return df
查询的数据如下:
与集思录里的数据做下对比,差不多(日期不同,我们的数据是09-05的)
接下来我们需要查询最新的日期里,按“双低”值从小到大排序。
这里带出一个问题,qlib适合做模型训练和回测,比如当前这个数据集,直接把双低值当作pred_score就可以回测了。包括机器学习的模型训练,但作为数据呈现(当数据库使用)就会有诸多不便。
后续可以考虑调研一下其余的金融时间序列数据库。
02 目前看数据需求
一个列表页的查询功能,这些功能可以通过预计算。
主要是需要把正股的信息整合起来,还有涨跌幅度,双低值等。
列表的作用只能查询最新的数据,比如不方便(需要重新计算)“穿越”到历史上某一天。
把mongo基础表的信息整合起来,形成一上完整的列表:
df_basic = mongo_utils.get_db()['bond_basic'].find({'ts_code': {'$in': list(df['instrument'])}}, { 'bond_short_name': 1, 'stk_short_name': 1, '_id': 0, 'maturity_date': 1, 'ts_code':1 }) df_basic = pd.DataFrame(list(df_basic)) df_basic.index = df_basic['ts_code'] df = pd.concat([df, df_basic], axis=1)
结合mongo的basic表和qlib的时间序列表,后续财务数据都可以整合进来。
除了考虑时间序列数据库(暂时不考虑,会引入更多的技术复杂性)。
qlib后续回测有大用途,目前性能还有优化的空间,包括qlib启用缓存等等。
简言之——qlib的数据库作为高性能时间序列数据库的一个替代,是一个很好的选择!
小结:
把qlib当作时间序列数据是一个正确选择。
qlib+mongo足够处理海量的金融时间序列数据。(qlib数据结构就是为此而生的)。之前有朋友问我为何为自己写一个,客观讲很耗时,未必做得比人家好。
后续:(还需要继续优化性能,导入基本面数据,财务指标等,就可以指导可转债的投资了)
qlib格式的可转债数据:正股价,转股价的整合
飞狐,科技公司CTO,用AI技术做量化投资;以投资视角观历史,解时事;专注个人成长与财富自由。