RiceQuant开源框架RQAlpha阅读笔记

RQAlpha框架代码结构

RQAlpha技术选型

数据存储

bcolz:列式压缩存储,本地磁盘;
ricequant远程数据以七牛云存储,需手动更新到本地;

策略因子

TA-LIB:金融市场数据的技术因子分析

实盘交易

VN.py,开源量化交易程序开发框架,交易API接口(vnpy.api)基本覆盖了国内外所有常规交易品种(股票、期货、期权、外汇、外盘、比特币)。
RQAlpha 对接 vnpy 的扩展 Mod(qalpha-mod-vnpy)。可通过启用该 Mod 来实现期货策略的实盘交易。

报表输出

图表:matplotlib
报表:XlsxWriter

辅助工具

命令行工具:click

回测流程

回测系统流程图

策略运行方式

日回测流程图

数据源

事件机制

事件源

  1. 获取回测时间段内的交易日;
  2. 遍历交易日获取日线/分钟线/tick的行情数据,发布事件到事件总线;
  • EVENT.TICK tick数据更新事件

    • PRE_TICK
    • HANDLE_TICK
    • POST_TICK
  • EVENT.BAR bar数据更新事件
    • PRE_BAR
    • HANDLE_BAR
    • POST_BAR
  • EVENT.BEFORE_TRADING 交易发生前事件
    • PRE_BEFORE_TRADING
    • HANDLE_BEFORE_TRADING
    • POST_BEFORE_TRADING
  • EVENT.AFTER_TRADING 交易成交后事件
    • PRE_AFTER_TRADING
    • HANDLE_AFTER_TRADING
    • POST_AFTER_TRADING
  • EVENT.SETTLEMENT 结算事件
    • PRE_SETTLEMENT
    • HANDLE_SETTLEMENT
    • POST_SETTLEMENT

回测事件驱动模型

RQAlpha 大部分的组件是以 add_listener 的方式进行事件的注册。
以策略执行为例:

  1. 当Bar数据生成时,触发 EVENT.BAR 事件,那么用户的 handle_bar 相关的代码注册了该事件则会立即执行。
  2. 当订单下单时,触发 EVENT.ORDER_PENDING_NEW 事件,前端风控模块注册了该事件,则可以立即对该订单进行审核,如果不满足风控要求,则直接指定执行 order._cancel(reason) 来保证有问题的订单不会进入实际下单环节。
  3. 当订单成交时,触发 EVENT.TRADE 事件,那么系统的账户模块因为注册了该事件,就可以立即计算成交以后的收益和资金变化。

程序化交易中很多操作,都是通过注册事件的方式插入到 RQAlpha 中进行扩展的。

事件分类

  • SystemEvent: 系统事件源

    • POST_SYSTEM_INIT: 系统初始化后触发
    • POST_USER_INIT: 策略的 init 函数执行后触发
    • POST_SYSTEM_RESTORED: 在实盘时,你可能需要在此事件后根据其他信息源对系统状态进行调整
  • MarketEvent: 市场及数据事件源
    • POST_UNIVERSE_CHANGED: 策略证券池发生变化后触发
    • PRE_BEFORE_TRADING: 执行 before_trading 函数前触发
    • BEFORE_TRADING: 该事件会触发策略的 before_trading 函数
    • POST_BEFORE_TRADING: 执行 before_trading 函数后触发
    • PRE_BAR: 执行 handle_bar 函数前触发
    • BAR: 该事件会触发策略的 handle_bar 函数
    • POST_BAR: 执行 handle_bar 函数后触发
    • PRE_TICK: 执行 handle_tick 前触发
    • TICK: 该事件会触发策略的 handle_tick 函数
    • POST_TICK: 执行 handle_tick 后触发
    • PRE_SCHEDULED: 在 scheduler 执行前触发
    • POST_SCHEDULED: 在 scheduler 执行后触发
    • PRE_AFTER_TRADING: 执行 after_trading 函数前触发
    • AFTER_TRADING: 该事件会触发策略的 after_trading 函数
    • POST_AFTER_TRADING: 执行 after_trading 函数后触发
    • PRE_SETTLEMENT: 结算前触发该事件
    • SETTLEMENT: 触发结算事件
    • POST_SETTLEMENT: 结算后触发该事件
  • OrderEvent: 交易事件源
    • ORDER_PENDING_NEW: 创建订单
    • ORDER_CREATION_PASS: 创建订单成功
    • ORDER_CREATION_REJECT: 创建订单失败
    • ORDER_PENDING_CANCEL: 创建撤单
    • ORDER_CANCELLATION_PASS: 撤销订单成功
    • ORDER_CANCELLATION_REJECT: 撤销订单失败
    • ORDER_UNSOLICITED_UPDATE: 订单状态更新
    • TRADE: 成交

撮合机制

在回测时,订单撮合过程在运行结束 `handle_bar函数之后,是以历史实时行情进行的虚拟撮合。

由于是对真实场景的模拟,订单并不会立刻以某个价格成交,而是通过和实时行情的具体价格(结合股息、手续费、滑点、税率等计算)和具体成交量(不超过总成交量的0.25)进行比对,从而断定成交价格和成交时间。

撮合方式

RQAlpha提供的撮合方式有两种:

  1. 当前收盘价。即当前bar发单,以当前bar收盘价作为参考价撮合。
  2. 下一开盘价。即当前bar发单,以下一bar开盘价作为参考价撮合。

对于不同订单类型,成交条件如下:

限价单(LimitOrder)

如果买单价格>=参考价,或卖单价格<=参考价,以参考价加入滑点影响成交(买得更高,卖得更低)。
限价单会一直在订单队列中等待下一个bar数据撮合成交,直到当日收盘。当日收盘后,所有未成交限价单都将被系统自动撤单。

市价单(MarketOrder)

直接以以参考价加入滑点影响成交。成交数量都不超过当前bar成交量的25%。一旦超过,市价单会在部分成交之后被自动撤单;

不满足订单撮合条件的订单,会标记为拒绝,具体情况可能有:

  • portfolio内可用资金不足
  • 下单数量不足一手(股票为100股)
  • 下单价格超过当日涨跌停板限制
  • 当前可卖(可平)仓位不足
  • 股票当日停牌
  • 合约已经退市(到期)或尚未上市

当日收盘后,所有未成交订单都将被系统自动撤单。

注意:如果当时市场处于涨停或跌停这种单边市情况,买单(对应涨停),卖单(对应跌停)是无法成交的。尽管bar数据中可能成交量不为0。判断逻辑:当前bar数据的收盘价等于涨停价,则当前市场处于涨停状态。跌停也是类似处理。

日线级别回测

在一个handelbar内下单,下单时立刻撮合成交(成交价取决于撮合机制以及滑点设置)。
撮合方式遵循“先卖后买,开盘价撮合”原则,即先处理卖出订单,后处理买入订单,卖出订单产生的现金,会参与买入订单的交易。
由于下单是在当天开盘前,订单撮合会与当天开盘价进行比较,如果满足条件,就会撮合成交,如果不满足条件,则继续挂单,等待下一次撮合尝试。

分钟线级别回测

在一个handle_bar内下单,在该handle_bar结束时统一撮合成交(成交价取决于撮合机制以及滑点设置)。
撮合方式遵循“先下单先处理,开盘价撮合”原则,即先下单的订单会先进行撮合尝试。
订单撮合会与下一分钟K线的开盘价进行比较,如果满足条件,就会撮合成交,如果不满足条件,则继续挂单,等待下一次撮合尝试。

注意:在分钟回测以及实盘模拟中handle_bar内发单之后立刻通过cancel_order对该订单进行撤单操作,是一定会撤单成功的。但在日回测中则很可能撤单失败,因为日回测中下单之后立刻撮合成交。

资产组合

资产组合

资产组合详情

回测结果分析指标

年化收益率(Annualized Returns)

表示投资期限为一年的预期收益率。
$$pr = \left (rac{p{end}}{p{start}}
ight)^{\left (250/n
ight)}-1$$
$$p
{end} = 策略最终总资产,p_{start} = 策略初始总资产,n = 回测交易日数量$$

基准年化收益率(Benchmark Returns)

表示参考标准年化收益率。
$$Br = \left ( rac{B{end}}{B{start}}
ight )^{\left (250/n
ight )}-1$$
$$B
{end} = 基准最终值,B_{start} = 基准初始值,n = 回测交易日数量$$
比如,如果回测时间段为2年,总收益率为30%,那么每年的年化收益率就在15附近(不考虑复利)。

阿尔法(Alpha)

CAPM模型表达式中的残余项。表示策略所持有投资组合的收益中和市场整体收益无关的部分,是策略选股能力的度量。当策略所选股票的总体表现优于市场基准组合成分股时,阿尔法取正值;反之取负值。
$$lpha = p_r - r_f - eta(B_r - r_f)$$
$$p_r = 策略年化收益率,r_f = 无风险收益率,B_r = 基准年化收益率$$

Alpha是投资者获得与市场波动无关的回报,一般用来度量投资者的投资技艺。
比如投资者获得了12%的回报,其基准获得了10%的回报,那么Alpha或者价值增值的部分就是2%。

该值越大越好。

贝塔(Beta)

表示投资的系统性风险,反映了策略对大盘变化的敏感性。例如,一个策略的Beta为1.3,则大盘涨1%的时候,策略可能涨1.3%,反之亦然;如果一个策略的Beta为-1.3,说明大盘涨1%的时候,策略可能跌1.3%,反之亦然。

$$eta = rac{Cov(p_n,B_n)}{\sigma_m^2}$$

$$p_n = 策略每日收益率,B_n = 基准每日收益率,\sigma_m^2 = 基准每日收益方差,Cov(p_n,B_n) = 策略和基准每日收益率的协方差$$
该值越小越好。

夏普比率(Sharpe Ratio)

表示每承受一单位总风险,会产生多少的超额报酬,可以同时对策略的收益与风险进行综合考虑。

sharp是衡量策略最重要的一个指标,该指标的计算不仅考虑收益率,还考虑了风险,因此比较具有参考价值,可以理解为经过风险调整后的收益率。

$$SharpRatio = rac{p_r - r_f}{\sigma_p}$$

$$p_r = 策略年化收益率,r_f = 无风险收益率,\sigma_p = 策略收益率波动率$$

收益波动率(Volatility)

用来测量资产的风险性,波动越大代表策略风险越高。

$$\sigmap = \sqrt{rac{250}{n-1}\sum{i=1}^{n}(p_t-\overline{p_t})^2}$$
$$n = 回测交易日数量,p_t = 策略每日收益率,\overline{pt} = 策略每日平均收益率 = rac{1}{n}\sum{i=1}^{n}p_n$$

信息比率(Information Ratio)

衡量单位超额风险带来的超额收益。信息比率越大,说明该策略单位跟踪误差所获得的超额收益越高,

因此,信息比率较大的策略的表现要优于信息比率较低的。

$$InformationRatio = rac{p_r-B_r}{\sigma_t}$$

$$p_r = 策略年化收益率,B_r = 基准年化收益率,\sigma_t = 策略与基准每日收益差值的年化标准差$$

合理的投资目标应该是在承担适度风险下,尽可能追求高信息比率。

最大回撤(Max Drawdown)

策略在整个时间段上亏损最严重的时候相比净值最高值下跌的百分比。描述策略可能出现的最糟糕的情况。

$$MaxDrawDown=max(1-rac {p_x}{p_y})$$
$$p_x=策略当日价值, p_y=当日之前虚拟账户最高价值$$

例如一个账户的净值是100,200,50,300,150,100, 200,那最大的亏损就是从300那个点开始一直亏到100。$MaxDrawDown=1-(100/300)=0.67$
最大回撤是策略评估时非常关键的一个指标,通常与风险承受能力相关。

换手率(Turnover Rate)

换手率也称周转率,指在一定时间内市场中股票转手买卖的频率,是反映股票流通性强弱的指标之一。

换手率描述了策略变化的频率以及持有某只股票平均时间的长短。 

$$TurnOverRate=rac{p_x}{p_y}$$
$$p_x=某一段时期内的成交量,p_y=发行总股数$$

一般而言,交收期越短,换手率越高。

换手率的高低往往意味着这样几种情况:

  1. 股票的换手率越高,意味着该只股票的交投越活跃,人们购买该只股票的意愿越高,属于热门股;反之,股票的换手率越低,则表明该只股票少人关注,属于冷门股。
  2. 换手率高一般意味着股票流通性好。然而值得注意的是,换手率较高的股票,往往也是短线资金追逐的对象,投机性较强,股价起伏较大,风险也相对较大。
  3. 将换手率与股价走势相结合,可以对未来的股价做出一定的预测和判断。某只股票的换手率突然上升,成交量放大,可能意味着有投资者在大量买进,股价可能会随之上扬。如果某只股票持续上涨了一个时期后,换手率又迅速上升,则可能意昧着一些获利者要套现,股价可能会下跌。

例如,某只股票在一个月内成交了2000万股,而该股票的总股本为l亿股,则该股票在这个月的换手率为20%。

转载于:https://www.cnblogs.com/xenglishhper/p/8692716.html

RiceQuant开源框架RQAlpha阅读笔记(转)相关推荐

  1. 开源软件 cadsurf 阅读笔记

    变量 myView 定义在 CadsurfView.h中 ,是一个CGLView 类的指针. 在CCadSurfView中被写入一个CGLView 对象,用new 动态创建.应该是可以把myView当 ...

  2. 米筐开源量化框架 RQalpha 安装使用

    RQalpha 是 Ricequant 开源的量化框架,提供数据获取,算法交易,策略回测,实盘模拟,实盘交易,数据分析等功能.RQalpha 的安装过程并不十分友好,本文讲述如何安装 RQalpha. ...

  3. dgl源码阅读笔记(3)——DeepWalk

    dgl源码阅读笔记(3)--DeepWalk 图神经网络开源库dgl阅读笔记 文章目录 dgl源码阅读笔记(3)--DeepWalk 图神经网络开源库dgl阅读笔记 @[TOC](文章目录) 前言 一 ...

  4. java制作连连看教程,直击优秀开源框架灵魂

    MySQL为何不选择平衡二叉树 既然平衡二叉树解决了普通二叉树的问题,那么mysql为何不选择平衡二叉树作为索引呢? 索引需要存储什么 让我们想一想,如果我们要把索引存起来,那么应该存哪些信息呢,它应 ...

  5. 小米开源框架MACE 源码阅读笔记 1

    转载自 https://www.jianshu.com/p/7061fd67d419 前扯 在前不久的某高峰论坛上,小米开源了其移动端的深度学习框架Mobile AI Compute Engine(M ...

  6. 小米开源框架MACE 源码阅读笔记

    转载自 https://www.jianshu.com/p/7061fd67d419 前扯 在前不久的某高峰论坛上,小米开源了其移动端的深度学习框架Mobile AI Compute Engine(M ...

  7. 【Flink】Flink 源码阅读笔记(15)- Flink SQL 整体执行框架

    1.概述 转载:Flink 源码阅读笔记(15)- Flink SQL 整体执行框架 在数据处理领域,无论是实时数据处理还是离线数据处理,使用 SQL 简化开发将会是未来的整体发展趋势.尽管 SQL ...

  8. CI框架源码阅读笔记4 引导文件CodeIgniter.php

    到了这里,终于进入CI框架的核心了.既然是"引导"文件,那么就是对用户的请求.参数等做相应的导向,让用户请求和数据流按照正确的线路各就各位.例如,用户的请求url: http:// ...

  9. C#开发笔记之01-为什么开源框架会大量的使用protected virtual?

    C#开发笔记概述 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/957 访问. 我们在很多开源框架中会经常看到prote ...

  10. AI学习笔记(九)从零开始训练神经网络、深度学习开源框架

    AI学习笔记之从零开始训练神经网络.深度学习开源框架 从零开始训练神经网络 构建网络的基本框架 启动训练网络并测试数据 深度学习开源框架 深度学习框架 组件--张量 组件--基于张量的各种操作 组件- ...

最新文章

  1. api怎么写_API数据加密框架monkeyapiencrypt
  2. 卫星覆盖分析品质 FOM
  3. TCP层,flags字段标识位含义说明
  4. pandas 计算工具
  5. cl编译C文件的环境变量修改
  6. 在Qt/Embedded 2.3.8中添加MX21Ads键盘处理
  7. 浅析浏览器 Web 视频播放器
  8. 如何快速掌握一门新的技术?
  9. 战舰世界选服务器删除什么文件夹,《战舰世界》常见问题解决方案合集
  10. 人家也是干 IT 的。
  11. 杀戮空间2服务器协议,杀戮空间2服务器设置
  12. 打造百亿量级、亿级日活SDK的十大关键要点
  13. 【解决方法】Win10还原默认打开方式图标
  14. Coverage-based Greybox Fuzzing as Markov Chain
  15. 婚恋交友app源码,你要了解数据结构
  16. VUE--公共组件传值并及时监听到数据更新视图
  17. 搜狗地图:路上的那些事儿(三十九)
  18. stata16 安装教程 资源
  19. 研一汇报第五周(2019.11.17)
  20. C# 封装对第三方接口的调用

热门文章

  1. 换电脑了怎么迁移旧电脑数据?教你一招,轻松搞定!
  2. 如何自己制作身份证扫描件?
  3. 让电脑假装蓝屏的C语言,如何自己手动让电脑假装死机
  4. 计算机显示发送报告,Word文档打不开提示发送错误报告的解决方法
  5. sqlserver2005 安装图解教程以及SQL 2005 SP3补丁安装图文教程
  6. 【稀饭】react native 实战系列教程之项目介绍
  7. OpenWrt固件编译、软件包Ipk的编译详解
  8. 深度时空3D卷积神经网络用于交通预测
  9. 【阿卡乐谱】【日常分享】超级强大的简谱-《茉莉花》
  10. 吉林大学计算机学院控制与应用实验室,2019计算机考研吉林大学国家物联网虚拟仿真实验教学中心简...