@(W1量化投资)[量化投资]
RiceQuant开源框架RQAlpha阅读笔记
bcolz:列式压缩存储,本地磁盘;
ricequant远程数据以七牛云存储,需手动更新到本地;
TA-LIB:金融市场数据的技术因子分析
VN.py,开源量化交易程序开发框架,交易API接口(vnpy.api)基本覆盖了国内外所有常规交易品种(股票、期货、期权、外汇、外盘、比特币)。
RQAlpha 对接 vnpy 的扩展 Mod(qalpha-mod-vnpy)。可通过启用该 Mod 来实现期货策略的实盘交易。
图表:matplotlib
报表:XlsxWriter
命令行工具:click
tick数据更新事件
bar数据更新事件
交易发生前事件
交易成交后事件
结算事件
RQAlpha 大部分的组件是以 add_listener
的方式进行事件的注册。
以策略执行为例:
EVENT.BAR
事件,那么用户的 handle_bar
相关的代码注册了该事件则会立即执行。EVENT.ORDER_PENDING_NEW
事件,前端风控模块注册了该事件,则可以立即对该订单进行审核,如果不满足风控要求,则直接指定执行 order._cancel(reason)
来保证有问题的订单不会进入实际下单环节。EVENT.TRADE
事件,那么系统的账户模块因为注册了该事件,就可以立即计算成交以后的收益和资金变化。程序化交易中很多操作,都是通过注册事件的方式插入到 RQAlpha 中进行扩展的。
init
函数执行后触发before_trading
函数前触发before_trading
函数before_trading
函数后触发handle_bar
函数前触发handle_bar
函数handle_bar
函数后触发handle_tick
前触发handle_tick
函数handle_tick
后触发scheduler
执行前触发scheduler
执行后触发after_trading
函数前触发after_trading
函数after_trading
函数后触发在回测时,订单撮合过程在运行结束 `handle_bar函数之后,是以历史实时行情进行的虚拟撮合。
由于是对真实场景的模拟,订单并不会立刻以某个价格成交,而是通过和实时行情的具体价格(结合股息、手续费、滑点、税率等计算)和具体成交量(不超过总成交量的0.25)进行比对,从而断定成交价格和成交时间。
RQAlpha提供的撮合方式有两种:
对于不同订单类型,成交条件如下:
如果买单价格>=参考价,或卖单价格<=参考价,以参考价加入滑点影响成交(买得更高,卖得更低)。
限价单会一直在订单队列中等待下一个bar数据撮合成交,直到当日收盘。当日收盘后,所有未成交限价单都将被系统自动撤单。
直接以以参考价加入滑点影响成交。成交数量都不超过当前bar成交量的25%。一旦超过,市价单会在部分成交之后被自动撤单;
不满足订单撮合条件的订单,会标记为拒绝,具体情况可能有:
当日收盘后,所有未成交订单都将被系统自动撤单。
注意:如果当时市场处于涨停或跌停这种单边市情况,买单(对应涨停),卖单(对应跌停)是无法成交的。尽管bar数据中可能成交量不为0。判断逻辑:当前bar数据的收盘价等于涨停价,则当前市场处于涨停状态。跌停也是类似处理。
在一个handelbar
内下单,下单时立刻撮合成交(成交价取决于撮合机制以及滑点设置)。
撮合方式遵循“先卖后买,开盘价撮合”原则,即先处理卖出订单,后处理买入订单,卖出订单产生的现金,会参与买入订单的交易。
由于下单是在当天开盘前,订单撮合会与当天开盘价进行比较,如果满足条件,就会撮合成交,如果不满足条件,则继续挂单,等待下一次撮合尝试。
在一个handle_bar
内下单,在该handle_bar
结束时统一撮合成交(成交价取决于撮合机制以及滑点设置)。
撮合方式遵循“先下单先处理,开盘价撮合”原则,即先下单的订单会先进行撮合尝试。
订单撮合会与下一分钟K线的开盘价进行比较,如果满足条件,就会撮合成交,如果不满足条件,则继续挂单,等待下一次撮合尝试。
注意:在分钟回测以及实盘模拟中handle_bar内发单之后立刻通过cancel_order对该订单进行撤单操作,是一定会撤单成功的。但在日回测中则很可能撤单失败,因为日回测中下单之后立刻撮合成交。
表示投资期限为一年的预期收益率。
$$pr = \left (rac{p{end}}{p{start}}
ight)^{\left (250/n
ight)}-1$$
$$p{end} = 策略最终总资产,p_{start} = 策略初始总资产,n = 回测交易日数量$$
表示参考标准年化收益率。
$$Br = \left ( rac{B{end}}{B{start}}
ight )^{\left (250/n
ight )}-1$$
$$B{end} = 基准最终值,B_{start} = 基准初始值,n = 回测交易日数量$$
比如,如果回测时间段为2年,总收益率为30%,那么每年的年化收益率就在15附近(不考虑复利)。
CAPM模型表达式中的残余项。表示策略所持有投资组合的收益中和市场整体收益无关的部分,是策略选股能力的度量。
当策略所选股票的总体表现优于市场基准组合成分股时,阿尔法取正值;反之取负值。
$$lpha = p_r - r_f - eta(B_r - r_f)$$
$$p_r = 策略年化收益率,r_f = 无风险收益率,B_r = 基准年化收益率$$
Alpha是投资者获得与市场波动无关的回报,一般用来度量投资者的投资技艺。
比如投资者获得了12%的回报,其基准获得了10%的回报,那么Alpha或者价值增值的部分就是2%。
该值越大越好。
表示投资的系统性风险,反映了策略对大盘变化的敏感性。例如,一个策略的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) = 策略和基准每日收益率的协方差$$
该值越小越好。
表示每承受一单位总风险,会产生多少的超额报酬,可以同时对策略的收益与风险进行综合考虑。
sharp是衡量策略最重要的一个指标,该指标的计算不仅考虑收益率,还考虑了风险,因此比较具有参考价值,可以理解为经过风险调整后的收益率。
$$SharpRatio = rac{p_r - r_f}{\sigma_p}$$
$$p_r = 策略年化收益率,r_f = 无风险收益率,\sigma_p = 策略收益率波动率$$
用来测量资产的风险性,波动越大代表策略风险越高。
$$\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$$
衡量单位超额风险带来的超额收益。信息比率越大,说明该策略单位跟踪误差所获得的超额收益越高,
因此,信息比率较大的策略的表现要优于信息比率较低的。
$$InformationRatio = rac{p_r-B_r}{\sigma_t}$$
$$p_r = 策略年化收益率,B_r = 基准年化收益率,\sigma_t = 策略与基准每日收益差值的年化标准差$$
合理的投资目标应该是在承担适度风险下,尽可能追求高信息比率。
策略在整个时间段上亏损最严重的时候相比净值最高值下跌的百分比。描述策略可能出现的最糟糕的情况。
$$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$
最大回撤是策略评估时非常关键的一个指标,通常与风险承受能力相关。
换手率也称周转率,指在一定时间内市场中股票转手买卖的频率
,是反映股票流通性强弱
的指标之一。
换手率描述了策略变化的频率以及持有某只股票平均时间的长短。
$$TurnOverRate=rac{p_x}{p_y}$$
$$p_x=某一段时期内的成交量,p_y=发行总股数$$
一般而言,交收期越短,换手率越高。
换手率的高低往往意味着这样几种情况:
例如,某只股票在一个月内成交了2000万股,而该股票的总股本为l亿股,则该股票在这个月的换手率为20%。
联系客服