AI量化,即AI+量化。
之前我的思路是投资,而后是量化投资,然后是AI赋能量化投资。一切是围绕投资进行,先学会投资,而后可量化的量化,然后量化中可以使用AI的赋能的则进行赋能。
AI+的逻辑会更加“颠覆”一些。
比如传统投资,从投资到量化,自然而然会以技术面量化为主,辅以一些基本面因子等,有点像传统策略的“自动化”。如何调优,完全出自于人工,需要人本身对投资的理解。好像alphago 1.0学习大量的人类棋谱一样。但master直接绕过人类棋谱,而是从0开始去理解市场,战斗力更强。
AI+的逻辑从数据,问题出发,把投资看成是基于大数据的决策问题。传统策略可以借鉴,但不必重从一次传统路线。
01 基于qlib框架的“AI+”的典型架构
初始化:
可转债的策略可以使用REG_US,没有一手100股的约束,也没有涨跌停限制。
import qlib from qlib.constant import REG_CN, REG_US def init_qlib(): provider_uri = "./data/cb_data" # "./data/cn_data" # target_dir qlib.init(provider_uri=provider_uri, region=REG_US)
数据层-加载特征工程:
def load_features(instruments, fields, start_time='2020-01-01', end_time='2022-12-31'): df = D.features(instruments, fields, start_time, end_time, freq='day') return df
可以把所有的可转债在2020-01-01起的序列数据都返回来,而且支持各种表达式的运算。
todo:这里在加载instruments时需要判断,比如到期日<90天。
使用loader来加载,可以对列进行重命名。
def load_by_loader(fields, names, start_time='2020-01-01', end_time='2022-12-31'): data_loader_config = { "feature": (fields, names), # "label": (labels, label_names) } loader = QlibDataLoader(config=data_loader_config) df = loader.load(instruments='all', start_time=start_time, end_time=end_time) return df
索引的排序变成了按日期为一级索引,这个更符合回测的逻辑,回测是按日期来对各个instrument进行回测。
qlib对数据进行了逐层封装,
qlib_loader数据加载,可以传入表达式以及命名。
DataHandlerLP负责加一些预处理器,对数据进行预处理,比如填弃空值,正则化等。
dataset是按时间对数据进行划分,这对于机器学习有两段train、valid特别有用。
def get_qlib_loader(fields, names): loader = QlibDataLoader(config=(fields, names)) return loader def get_handler(instruments, qlib_loader, start_time='2020-01-01', end_time='2022-12-31'): # NOTE: normally, the training & validation time range will be `fit_start_time` , `fit_end_time` # however,all the components are decomposed, so the training & validation time range is unknown when preprocessing. ZScoreNorm(fit_start_time='20170101', fit_end_time='20181231'), dh = DataHandlerLP(instruments=instruments, start_time=start_time, end_time=end_time, infer_processors=[Fillna()], data_loader=qlib_loader) return dh def get_dataset(dh, train_start='2019-01-01', train_end='2020-12-31', valid_start='2021-01-01', valid_end='2022-12-31'): ds = DatasetH(dh, segments={"train": (train_start, train_end), "valid": (valid_start, valid_end)}) return ds def get_ts_dataset(dh, train_start='2019-01-01', train_end='2020-12-31', valid_start='2021-01-01', valid_end='2022-12-31'): ds = TSDatasetH(step_len=10, handler=dh, segments={"train": (train_start, train_end), "valid": (valid_start, valid_end)}) return ds
模型训练及使用,对于AI+而言,前面是数据准备、预处理,这里是模型训练与指标生成,这里是关键——特征工程决定模型效果。
这里fit生成模型,然后使用模型计算pred_score。
回测与绩效评估:这一部分基本上是确定的。
输入pred_score,topK策略进行回测,并对回测结果进行可视化的分析。
小结:
把qlib例子里很多ymal拿掉,变成一个个小模块,复用qlib的能力。
当下的年轻人,成功更难。
用好代码和媒体的杠杆,专注一件小事,做出产品化,做出价值。