归结起来一句话,我们要开始进入“主动投资”里的AI量化投资系统了。
第一步,需要打造一个可以支撑智能算法的研究的系统。
第二步,如何挖掘因子、构建策略。
第三步,风控。
第四步,实盘。
微软亚洲研究院的Qlib作为基础平台非常合适:
微软亚洲研究院发布了 AI 量化投资开源平台“微矿 Qlib”。Qlib 涵盖了量化投资的全过程,为用户的 AI 算法提供了高性能的底层基础架构,从框架设计上让用户可以更容易地应用 AI 算法来辅助解决量化投资的各个关键问题,比如 Alpha 因子构建、风险预测、市场动态性建模等等。
Qlib 覆盖了量化投资的全过程,从底层构造开始就专为 AI 而生,从数据处理到计算力支撑,再到模型的训练与验证,都为基于 AI 的量化投资提供了全方位的框架支持。用户可以通过 Qlib 平台提供的多个工具模块,更加轻松地管理和使用自己的算法,特别是其 AI 算法。Qlib 的架构如下图所示:
最底层的是基础架构层(Infrastructure)。Qlib 的数据服务模块(Data Server)提供了高性能的数据存储设计,让 AI 算法可以更快地处理更多金融数据。训练模块(Trainer)则为 AI 算法提供了灵活的接口来定义训练模型的过程,让 Auto-ML 等算法成为可能,也为分布式训练提供了接口。而模型管理模块(Model Manager)可以让用户更好地管理繁多的 AI 模型,更快地迭代其 AI 算法。
中间层是量化投资流程(Workflow)。信息抽取模块(Information Extractor)负责从异构数据中提取有效的信息,因为用 AI 进行投资分析数据是关键,尽管金融行业有一定的数据基础,但 AI 模型可以直接使用的高质量数据仍然十分有限,所以这就需要更多精细化处理和信息抽取。之后,预测模型(Forecast Model)会输入抽取的信息,输出可供金融专家参考的未来收益、风险等等预测,然而预测模型需要依靠底层海量数据才能训练出精准、有效的预测模型。而投资组合生成模块(Portfolio Generator)则能根据预测得到 Alpha 信号和风险信号辅助生成投资策略组合。订单执行模块(Order Executor)是投资的最后一步——交易执行,帮助用户判断何时下单也是一门艺术。在量化投资中,几乎不可能有一个模型在全时段都一直保持卓越的表现,所以对市场动态性建模,以及在不同时期适时地调整模型、策略、执行也是一个非常重要的课题。Qlib 中元控制器模块 (Meta Controller) 的设计正是要支持这类问题的研究,实时提供精准的参考信息和方案,辅助用户进行操作。
最上层是交互层(Interface)。其中,分析模块(Analyzer)会根据下层的预测信号、仓位、执行结果做出详细的分析并呈现给用户。
特别的,Qlib内置了时序量价数据、业内常用因子、以及 常见的金融 AI 模型(例如 LightGBM、GRU、GATs 等十几个模型) , 大大降低了 AI 使用的专业门槛 。Qlib内置数据集和模型分类如下。
首先基于conda环境构建python3.9版本环境,基于该环境安装qlib(低于3.9版本有依赖package的等等冲突,所以创建3.9环境)
pip install qlib
pyqlib依赖的包比较大,它的定位不只是一个量化开发包了,而是一个量化平台。
从数据存储,指标计算,量化模型,回测,模型,结果分析等都有完整的覆盖。
查看对应的qlib版本:
import qlib
qlib.__version__
接下来用git仓库克隆数据:(要外接VPN,可以连香港或者US外网)
相关网址:qlib/README.md at main · microsoft/qlib (github.com)
git clone https://github.com/microsoft/qlib.git && cd qlib
pip install . #此处不要链接VPN,大概率会出错,
#后面运行example时候会出错rolling模块错误,要在这里构建好pyqlib,很关键
通过源码安装已经pip install . 成功,可以import qlib,但在qlib.init()找不到qlib.data._libs.rolling:
这其实是因为在我们的工程目录下,只有qlib.data._libs.rolling.pyx,这是cython编译需要的原始文件,执行pip install . 时,首先编译成.c再编译成.so (linux, macos) 或者.pyd (windows),这些文件结果在python site-packages中。以anaconda虚拟环境为例,路径可能为:anaconda/envs/xxxx/lib/python3.9/site-packages/qlib,在这里面可以找到.so或者.pyd文件。
当我们运行工程目录下,examples/tutorials/detailed_workflow.ipynb下,会在工程目录/qlib/data下找(从报错信息中可以看到是在这个文件路径下报错)编译结果,但是没有找到。
这里建议把anaconda/envs/xxxx/lib/python3.9/site-packages/qlib之下的内容整体复制merge到工程目录下的qlib文件夹内容。在哪个目录下报错找不到就复制到该目录下。
构建时出现错误:
需要下载c++生成工具:Microsoft C++ 生成工具 - Visual Studio
Win+R,输入winver查看系统版本,是:
选择 使用C++的桌面开发
勾选win11,2023这个进行下载:
此时在该目录qlib和该环境py39下安装:
pip install cmake
pip install hdf
如果上面情况仍然解决不了问题(电脑崩了后出现该问题),我查到了另外一种方法解决:
如果通过源码安装,已经pip install . 成功(有些情况下会提示安装的不兼容不用过于担心,只要不是造轮子时出现问题即可),可以import qlib,但在qlib.init()找不到qlib.data._libs.rolling:
这其实是因为在我们的工程目录下,(打开文件夹会发现)只有qlib.data._libs.rolling.pyx,这是cython编译需要的原始文件,执行pip install . 时,首先编译成.c再编译成.so (linux, macos) 或者.pyd (windows),这些文件结果在python site-packages中。以anaconda虚拟环境为例,路径可能为:anaconda/envs/xxxx/lib/python3.9/site-packages/qlib,在这里面可以找到.so或者.pyd文件。
当我们运行工程目录下,examples/tutorials/detailed_workflow.ipynb下,会在工程目录/qlib/data下找(从报错信息中可以看到是在这个文件路径下报错)编译结果,但是没有找到。
所以只需要把编译的pyd文件:C:\Users\59980\anaconda3\envs\py39\Lib\site-packages\qlib\data\_libs\expanding.cp39-win_amd64.pyd和C:\Users\59980\anaconda3\envs\py39\Lib\site-packages\qlib\data\_libs\rolling.cp39-win_amd64.pyd复制到我们打开的工程目录里面运行就可以:然后再运行example里面的:
他就会自行拉取day和minute行情,这里可以不用连接外网,下面操作就可以省去了。
##
然后就是拉取数据到本地了:(要外接VPN,可以连香港或者US外网,因为是从yf拉取的)
可以从模块拉取 或者 也可以从源码拉取:(要进入到安装qlib的安装目录里面进行操作)
#使用模块获取
# get 1d data
python -m qlib.run.get_data qlib_data --target_dir ~/.qlib/qlib_data/cn_data --region cn
# get 1min data
python -m qlib.run.get_data qlib_data --target_dir ~/.qlib/qlib_data/cn_data_1min --region cn --interval 1min
# 从源码获取
#我只适用于该模式
# get 1d data
python scripts/get_data.py qlib_data --target_dir ~/.qlib/qlib_data/cn_data --region cn
# get 1min data
python scripts/get_data.py qlib_data --target_dir ~/.qlib/qlib_data/cn_data_1min --region cn --interval 1min
自动更新每日频率数据(来自雅虎财经):
每个交易日自动更新数据到“qlib”目录(Linux)
使用 crontab:crontab -e
设置定时任务:
* * * * 1-5 python <script path> update_data_to_bin --qlib_data_1d_dir <user data dir>
QLib的测试数据支持在线、离线两种模式,QLib默认的是启用离线模式,该模式下,所有的回测数据的存储与读取都将在本地进行,而在线模式的数据将会部署在微软的服务器端。推荐用离线模式来进行策略研发,第一是策略数据一次落地即可使用,无需反复传输,无网络时同样可以测试;第二是策略代码完全在本地运行,保证了策略的安全性。
##
上面下载好后目录文件如下:
下一步,我们调用QLib库中的相关方法,尝试读取我们刚才下载到本地的数据,并尝试读取成分股。
运行实例example里面的workflow_by_code,同时安装好xgboost和LGBoost库(要进行训练),就会得到一些结果:
该源码下运行的是信号交易策略,后面我们写的交易策略一般都会放在该文件夹下:
主要看下backtest这一节,起始时间是2017年1月,结束时间是2020年8月,基于全市场选股,标注的label是第二天的收益率,选择分数高的构建出投资组合,一共3年半,基准是沪深300指数,主要关心两个指标:年化收益和最大回撤。
这里主要有3个结果:基准收益,考虑成本的的超额收益和不考虑成本的的超额收益。具体的值参考上图。
如果不考虑交易成本,年化收益是17.8%,而基准是11.3%;最大回撤相比于基准的37%,模型是最大回撤是5.7%。那么夏普比是得到明显提升的,考虑了成本之后,则年化下降至13.15%。
微软还开发了一个qrun的工具,这个在安装qlib的时候是内置的。只需要定位到相应的代码目录下,然后使用qrun命令去自动化的运行配置好的模型。
qrun examples/workflow_config_lightgbm_configurable_dataset.yaml。
直接运行这个yaml。Qlib所有的参数都可以通过一个yaml文件来配置。无论从学习的角度,还是从代码的角度去应用,我们需要仔细去学习和拆解各个模块,为我们所用。
策略的拆解
一个典型的机器学习驱动的量化模型会分成如下几个主要步骤:
1、首先是基本数据加载,从价量的角度看就是OHLCV等数据。
2、其次是数据标准,计算因子和label。
3、然后把数据分割成训练集和测试集。
4、选择合适的模型,并配置适当的参数。
5、模型训练。
6、利用模型数据样本外数据进行回测,得到回测结果。
7、对回测结果进行可视化。
这里可以回归到项目的文档,文档解释得比较清楚:https://qlib.readthedocs.io/en/latest/
qlib初始化,比较简单,就是指定下载的数据所在的目录即可。Region参数是指中国市场还是美国市场。
#如果没有报错则初始化成功。
import qlib
from qlib.config import REG_CN
# use default data
provider_uri = "~/.qlib/qlib_data/cn_data" # target_dir
qlib.init(provider_uri=provider_uri, region=REG_CN)