更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流。

微软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内置数据集和模型分类如下。

数据准备

QLib的测试数据支持在线、离线两种模式,QLib默认的是启用离线模式,该模式下,所有的回测数据的存储与读取都将在本地进行,而在线模式的数据将会部署在微软的服务器端。我们更推荐大家使用离线模式来进行策略研发,第一是策略数据一次落地即可使用,无需反复传输,无网络时同样可以测试;第二是策略代码完全在本地运行,保证了策略的安全性。

我们以离线模式为例,为大家展示QLib的数据准备过程。QLib包中提供了从雅虎财经获取金融数据的脚本,只需要在控制台调用对应的Python脚本,制定数据的存储路径,就能将数据下载到本地了。

python scripts/get_data.py qlib_data --target_dir ~/.qlib/qlib_data/cn_data --region cn

我们将代码存储在家目录下的qlib_data文件夹内,完成下载后,我们查看对应目录,找到对应的数据位置。

下一步,我们调用QLib库中的相关方法,尝试读取我们刚才下载到本地的数据,并尝试读取CIS300指数的成分股。

import qlib
from qlib.data import D
qlib.init(provider_uri='~/.qlib/qlib_data/cn_data')
instruments = D.instruments(market='csi300')
D.list_instruments(instruments=instruments, start_time='2010-01-01', end_time='2017-12-31', as_list=True)[:20]

workflow配置

在数据落地到本地,并且成功使用QLib库读取到本地数据之后,我们再来看QLib中最重要的一个配置文件,该配置文件叫做workflow。workflow中需要配置数据集地址、策略回测参数、训练模型参数、模型存储地址等,在整个测试过程中的关键配置。我们来看QLib一个完整的workflow配置示例。该示例包含两部分代码,我们分别展示,首先是qlib_init部分。

qlib_init:
   provider_uri: "~/.qlib/qlib_data/cn_data"
   region: cn
   market: &market csi300
   benchmark: &benchmark SH000300
   data_handler_config: &data_handler_config
   start_time: 2008-01-01
   end_time: 2020-08-01
   fit_start_time: 2008-01-01
   fit_end_time: 2014-12-31
   instruments: *market
   port_analysis_config: &port_analysis_config
   strategy:
       class: TopkDropoutStrategy
       module_path: qlib.contrib.strategy.strategy
       kwargs:
           topk: 50
           n_drop: 5
   backtest:
       verbose: False
       limit_threshold: 0.095
       account: 100000000
       benchmark: *benchmark
       deal_price: close
       open_cost: 0.0005
       close_cost: 0.0015
       min_cost: 5

qlib_init部分的关键配置参数包括:回测数据存储路径(provider_uri),即我们刚才下载数据的路径;market:股票池的选股范围是csi300;benchmark:策略比较基准是沪深300指数;start_time、end_time代表策略测试的起始、终止时间,而fit_start_time、fit_end_time代表训练样本的起始、终止时间;strategy:策略的选股规则,我们采用TopkDropoutStrategy,即选中topk的股票,并去掉n_drop数量;backtest是历史回测的参数,包括策略阈值、初始资金、成交价格、手续费等的设置。然后,我们来看第二部分,task部分的配置代码。

task:
   model:
       class: LGBModel
       module_path: qlib.contrib.model.gbdt
       kwargs:
           loss: mse
           colsample_bytree: 0.8879
           learning_rate: 0.0421
           subsample: 0.8789
           lambda_l1: 205.6999
           lambda_l2: 580.9768
           max_depth: 8
           num_leaves: 210
           num_threads: 20
   dataset:
       class: DatasetH
       module_path: qlib.data.dataset
       kwargs:
           handler:
               class: Alpha158
               module_path: qlib.contrib.data.handler
               kwargs: *data_handler_config
           segments:
               train: [2008-01-01, 2014-12-31]
               valid: [2015-01-01, 2016-12-31]
               test: [2017-01-01, 2020-08-01]
   record:
       - class: SignalRecord
       module_path: qlib.workflow.record_temp
       kwargs: {}
       - class: PortAnaRecord
       module_path: qlib.workflow.record_temp
       kwargs:
           config: *port_analysis_config

task部分,包含三个小类别的配置,分别是model(模型相关)、dataset(训练测试集相关)、record(模型存储相关)。在model的配置中,这里我们采用了lgb的模型,并在后续制定了关键的模型参数,比如误差衡量指标、学习率等等;而在dataset的配置中,我们采用了系统内置的Alpha158常用因子,并且将整体数据按时间分成了训练集、验证集和测试集三部分;最后一个record的配置,主要记录了训练过程、训练模型的存储路径,方便后续策略构建完毕的展示与评估。

我们只需要将qlib_init、task两部分代码合并保存到同一个文件下,文件后缀.yaml,例如我们将配置文件保存为test.yaml,再使用QLib库中的qrun函数调用.yaml的配置文件,即可完成整个策略运行过程了。

qrun test.yaml

示例策略

最后,我们为大家运行一个QLib官方提供的示例策略,向大家展示策略运行的完整过程。我们找到示例策略目录examples下,选择lightGBM模型构建的示例策略,并找到该示例策略的workflow,也就是我们在上一小节提到的.yaml文件。

同样的,对于配置好的workflow,采用qrun + workflow,一句话启动策略运算。

qrun /examples/benchmarks/LightGBM/workflow_config_lightgbm_Alpha158.yaml 

运行完成后,策略的关键结果会被记录在workflow指定的存储目录中, 更多的过程信息会被写入主目录下的workflow_by_code.ipynb 中,我们可以用Jupyter运行该文件,查看更丰富的策略报告。

仔细阅读一下workflow_by_code中的代码,可以看到模型建立、执行、预测等全部数据都已经存储完毕,我们只需要按顺序运行代码,即可查看策略的可视化结果。包括策略的回测曲线、分组收益率、每期IC系数、IC月度均值及分布等等。

当然,QLib的功能强大,能玩的策略、数据、输出,远远不止我们上述举例的这些,如果大家对于AI量化投资感兴趣,可以尝试用QLib做轮子,创造自己的AI策略。

想要获取本次分享的完整代码,或是任何关于数据分析、量化投资的问题,欢迎添加技术宅微信:sljsz01,与我交流


往期干货分享推荐阅读

分享一个年化15%以上的无风险套利机会

网格交易系统开发

通过深度学习股价截面数据分析和预测股票价格

Omega System Trading and Development Club内部分享策略Easylanguage源码

一个真实数据集的完整机器学习解决方案(下)

一个真实数据集的完整机器学习解决方案(上)

如何使用交易开拓者(TB)开发数字货币策略

股指期货高频数据机器学习预测

如何使用TradingView(TV)回测数字货币交易策略

如何投资股票型基金?什么时间买?买什么?

【数量技术宅|量化投资策略系列分享】基于指数移动平均的股指期货交易策略

AMA指标原作者Perry Kaufman 100+套交易策略源码分享

【 数量技术宅 | 期权系列分享】期权策略的“独孤九剑”

【数量技术宅|金融数据系列分享】套利策略的价差序列计算,恐怕没有你想的那么简单

【数量技术宅|量化投资策略系列分享】成熟交易者期货持仓跟随策略

如何获取免费的数字货币历史数据

【数量技术宅|量化投资策略系列分享】多周期共振交易策略

【数量技术宅|金融数据分析系列分享】为什么中证500(IC)是最适合长期做多的指数

商品现货数据不好拿?商品季节性难跟踪?一键解决没烦恼的Python爬虫分享

【数量技术宅|金融数据分析系列分享】如何正确抄底商品期货、大宗商品

【数量技术宅|量化投资策略系列分享】股指期货IF分钟波动率统计策略

【数量技术宅 | Python爬虫系列分享】实时监控股市重大公告的Python爬虫

三分钟玩转微软AI量化投资开源库QLib的更多相关文章

  1. 三分钟玩转jQuery.noConflict()

      jQuery是目前使用最广泛的前端框架之一,有大量的第三方库和插件基于它开发.为了避免全局命名空间污染,jQuery提供了jQuery.noConflict()方法解决变量冲突.这个方法,毫无疑问 ...

  2. 量化投资与Python

    目录: 一.量化投资第三方相关模块 NumPy:数组批量计算 Pandas:表计算与数据分析 Matplotlib:图表绘制 二.IPython的介绍 IPython:和Python一样 三.如何使用 ...

  3. 《量化投资:以MATLAB为工具》连载(2)基础篇-N分钟学会MATLAB(中)

    http://www.matlabsky.com/thread-43937-1-1.html   <量化投资:以MATLAB为工具>连载(3)基础篇-N分钟学会MATLAB(下)     ...

  4. 《量化投资:以MATLAB为工具》连载(1)基础篇-N分钟学会MATLAB(上)

    http://blog.sina.com.cn/s/blog_4cf8aad30102uylf.html <量化投资:以MATLAB为工具>连载(1)基础篇-N分钟学会MATLAB(上) ...

  5. Python金融应用编程(数据分析、定价与量化投资)

    近年来,金融领域的量化分析越来越受到理论界与实务界的重视,量化分析的技术也取得了较大的进展,成为备受关注的一个热点领域.所谓金融量化,就是将金融分析理论与计算机编程技术相结合,更为有效的利用现代计算技 ...

  6. 学习 OpenStack 的方法论 - 每天5分钟玩转 OpenStack(150)

    作为 OpenStack 的核心教程,我们已经到了最后总结的部分. OpenStack 目前已经有好几十个模块,本教程讨论的是最最重要的核心模块:Keystone,Nova,Glance,Cinder ...

  7. 十分钟玩转 jQuery、实例大全(参考自博主索宁)

    十分钟玩转 jQuery.实例大全(参考自博主索宁) 一.简介 书写规则 支持链式操作: 在变量前加"$"符号(var $variable = jQuery 对象): 注:此规定并 ...

  8. 每天5分钟 玩转OpenStack 目录列表

    最近在学习 OpenStack 的相关知识,一直苦于 OpenStack 的体系庞大以及复杂程度,学习没有进度,停滞不前.偶然机会在 51CTO 上发现了一个热点的专题关于 OpenStack 的,题 ...

  9. cloud-init 典型应用 - 每天5分钟玩转 OpenStack(174)

    本节介绍几个 cloud-init 的典型应用:设置 hostanme,设置用户初始密码,安装软件. 设置 hostname cloud-init 默认会将 instance 的名字设置为 hostn ...

随机推荐

  1. how to disabled alert function in javascript

    how to disabled alert function in javascript alert 阻塞主线程 default alert; // ƒ alert() { [native code] ...

  2. foreign language learning

    foreign language learning free online learning websites 多邻国 https://www.duolingo.com 忆术家 https://www ...

  3. asm movbe 指令

    movbe MOVBE 目标操作数,源操作数 复制源操作数的数据,交换字节后,移动数据 假如: movbe eax,(float)1000.0 eax == 0x00007A44 movbe eax, ...

  4. qt 注册热键

    原文 将所需的库添加到您的qmake项目(.PRO文件) LIBS += \ -lUser32 2.在代码中包含所需的头文件. #include <windows.h> 在程序开始时注册热 ...

  5. mysql数据库表引入redis解决方案

    缓存方案 缓存方案在我的另外一篇博客里有详细说明,地址:https://www.cnblogs.com/wingfirefly/p/14419728.html 数据结构: 方案1: 1.存储结构采用h ...

  6. Java中print、printf、println的区别

    Java中print.printf.println的区别 区别 print:标准输出,但不换行,不可以空参: println:标准输出,但会自动换行,可以空参,可以看做:println()相当于pri ...

  7. SpringBoot 整合 hibernate 连接 Mysql 数据库

    前一篇搭建了一个简易的 SpringBoot Web 项目,最重要的一步连接数据库执行增删改查命令! 经过了一天的摸爬滚打,终于成功返回数据! 因为原来项目使用的 SpringMVC + Hibern ...

  8. 这一篇TCP总结请收下

    前言 很高兴遇见你~ TCP这些东西,基本每个程序猿都或多或少是掌握的了.虽然感觉在实际开发中没有什么用武之处,但,面试他要问啊 而最近大家伙过完年,也都在准备春招,我也一样.阅读了一些okHttp源 ...

  9. TkMybatis添加对象后返回数据的id

    在实体类的id属性上加上下面的注解 //导入的包import javax.persistence.GeneratedValue; @GeneratedValue(generator = "J ...

  10. SpringBoot2.x整合JavaMail以qq邮箱发送邮件

    本文参考spring官网email接口文档所写. spring-email官方网址:https://docs.spring.io/spring/docs/5.1.8.RELEASE/spring-fr ...