QT_Test

Return to Repositories

本测试旨在重现一套比较简单且完备的量化框架

该框架基于现代投资组合理论,并应用主流的机器学习算法(SVM)进行分析

旨在初步形成一个量化投资的思路,辅助构建科学合理的投资策略

Anticipate Process

Preparation

Input

Main Program

Output

Dependencies

测试使用的Python版本:3.6.8

测试使用的Anaconda版本:1.9.6

Installation or Upgrade for Tushare

Import Tushare

tushare版本需大于1.2.10

Set Token

完成调取tushare数据凭证的设置,通常只需要设置一次

Initialize Pro API

Main Data API

Package

Time Handle

MySql Handle

Data Handle

设计过程

数据采集预处理后建模

模型评估和仓位管理

模拟交易测试及回测

详细示例

获取数据并存储

股票行情

数据获取

默认获取从预设时间(我们定义为年第个交易日)到最邻近交易日,股票池所有交易日的行情数据

注意更改 Init_StockALL_Sp.py 中的股票池

如果对于股票代码,所属板块,上市状态,上市日期等情况不甚了解,可以优先查询股票的 基本信息

存储至MySQL

部分示例

注意

对于使用 main_pro.py 正式回测时,我们选择的股票池必须是前述 Init_StockALL_Sp.py 中股票的子集,且为了后续构建资产组合中 不至于过少,规定股票池的度不小于

由于我们在分析不同问题时,从 Init_StockALL_Sp.py 中获取标的的数量较为庞大(比如超过 只股票),但在回测中标的股票数不可能过于庞大(算力限制,一段时间内主成分也不会过多),比如我们在 main_pro.py 中的股票池标的数就选为最小的 ,在 stock_info 表中会优先精简上述的 stock_all 表,既相当于从自己获取的数据库中,抓取回测所需股票池中的标的行情数据,这样会在一定程度上提高查询速度,示例不再赘述

指数行情

数据获取

默认获取从预设时间(我们定义为 年第 个交易日)到最邻近交易日,参考指数所有交易日的行情数据

注意更改 stock_index_pro.py 中的基准指数

指数名称赋予简称交易所/Tushare编码
上证指数SH000001.SH
深圳成指SZ399001.SZ
上证50SH50000016.SH
沪深300HS300000300.SH or 399300.SZ
中证500ZZ500000905.SH or 399905.SZ
中小板指ZX399005.SZ
创业板CY399006.SZ

因为股票池中后续进行回测的股票两市均有,且市值相对较重,所以选择沪深 300 指数较为合理

存储至MySQL

部分示例

利用SVM建模

单个SVM结果

从获取数据的特征,基于 SVM 做分类问题,来对于涨跌判断进行建模

运行结果

SVM模型评价

有了单个 SVM 结果后,就可以通过遍历股票池中的标的,并对比 SVM 训练时,测试区间中的真实情况给予评价

机器学习常用评价指标公式如下

部分效果如下

再遍历所有回测区间内的交易日,来给出全部的预测情况及评价指标

这里需要注意,在一些其他应用场景(比如医疗,身份识别)中,需要 分值足够接近 ,否则模型毫无意义

并且在其他条件一定时, 增大肯定不是坏事

但在投资领域,胜率并不能完全反应到收益,比如 的胜率也存在每次都赚了小钱,但在错误预判时却造成巨额亏损的情况,相反低胜率也存在每次收益较大而使得总收益期望大于 的情形

仓位管理

当然对于每一小段时间,我们还是需要从指标层面选择较强的标的来构建投资组合,这样在相同的收益率下,我们将承担更小的风险

区分于其他市场(美股等),A 股市场没有有效的认沽机制,或者说做空条件过于严苛和高贵,所以我们不能将特征向量中的负值在策略中成为空头开仓,而是必须将其舍去(重置为 ),并将特征向量中的正值线性归一化(理论上这一步会极大地降低收益),由于我们需要挖掘期望收益为正的策略,归一化可以增加我们的资金使用效率

现代投资组合理论的主要实现如下

对于某一交易日的仓位管理,可以将较长一段时间(回测时选取了 ,所以记得在第一步尽量剔除次新股)的 return list 传入上述代码来得到

Portfolio.py 中,可以返回最小和次小两套特征值和特征向量,分别对应在投资可行域中最小风险组合,以及最佳收益组合(风险稍稍提高,收益明显提高),如下图所示

在正式的回测中,我们选取最佳收益组合来作为投资的仓位管理依据

回测

回测准备

回测过程

在已有的训练、建模、预测后,我们进行模拟交易,投资组合变换的频率默认为 个交易日

根据回测区间第一个交易日的行情,进行一次 投资组合建仓(手续费

由于最小的交易单位是 股,我们会向下取 的倍数为第 支标的持仓股数

并按照如下公式更新资产信息

随后制定平仓(,如果在一个投资组合内,某标的被策略卖出,则会全部卖出,不涉及部分卖出的情况)的择时策略,当持仓非空时,依次进行如下步骤:

  1. 推进至回测区间内的下一交易日,对于 2-5 发生的情形,按照如下公式更新相关资产情况

  2. 当单一持仓标的收益率超过 时,止盈平仓该标的(GOODSELL)

    未有符合条件的执行或者全部执行完后下一步

  3. 当单一持仓标的亏损率超过 时,止损平仓该标的(BADSELL)

    未有符合条件的执行或者全部执行完后下一步

  4. 当建仓后第 个交易日只拥有货币资金,则返回投资组合建仓板块

    当建仓后第 个交易日还存在未平仓的标的

    • 如果回测周期没结束,进行全部平仓处理(OVERTIMESELL),跳出平仓板块,返回投资组合建仓板块
    • 如果回测周期全部结束,则进行最后一次资金跟新,并输出回测结果

    未有符合条件的执行则下一步

  5. 当单一持仓标的的 SVM 预测下个交易日为 (下跌时),预判平仓该标的(PredictSELL)

    未有符合条件的执行或者全部执行完后下一步

  6. 执行资金情况更新

  7. 返回第一步

回测过程的简要流程图

输出评价

回测完成后,会对所有的回测情况进行评估,选取了 个经典评价量化策略的指标,分别是

这样既可以对回测效果有很好的刻画,又会在一定程度上杜绝过拟合的情形

收益率

这是我们最关心的,相当于是回测区间内的收益效率衡量

对于第 交易日的账户权益或者指数,收益率计算公式如下

最大回撤率

指在回测区间内内任一历史时点往后推,资产(指数)走到最低点时的收益率回撤幅度的最大值

最大回撤用来描述实行投资组合建仓后(指数)可能出现的最糟糕的情况

最大回撤是一个重要的风险指标,对于对冲基金和数量化策略交易,该指标比波动率还重要

为第 天的资产(指数), 则是 后面某一天的资产指数

则该资产(指数)在第 交易日以及整体的最大回撤率计算如下

夏普率及风险

夏普率代表投资组合(指数)对于波动风险的微分,既单位风险所获得的超额回报率(相当于无风险利率)

该比率越高,策略承担单位风险得到的超额回报率越高,公式为

其中, 为区间收益率, 是区间无风险收益率, 为区间波动率

注意,在主流的策略效果对比时,还是需要统一到年化来比较

信息比率及跟踪误差

跟踪误差:投资组合与基准指数收益率差值的波动风险

主动投资组合策略可能会拥有较大的跟踪误差

被动复制指数策略通常拥有较小的跟踪误差

信息比率:代表投资组合与基准指数收益率差值对于跟踪误差的微分

既单位跟踪误差所获得的超额回报率(相对于基准指数)

该比率越高,策略承担单位跟踪误差得到的超额回报率越高,公式为

其中, 为区间收益率, 为区间基准收益率(如 HS300 Idx), 为策略与基准每日收益率差值的区间标准差

同样,在主流的策略效果对比时,还是需要统一到年化来比较

回测结果

回测完成后,会返部部分前述的评价指标及运行时间(一个自然月的回测约需要

我们发现,投资组合的收益曲线背离大盘,在期末的收益率达到 ,明显跑赢市场的

并且策略拥有较小的最大回撤率,以及较大的夏普率,甚至还降低了风险

我们发现跟踪误差略大于策略风险,说明我们的策略还是一个偏主动的策略

资产信息

资金变动情况

接下来再看这套投资组合的账单详情:

与纯市场方向相比,还是有适量的操作

并且事实上,止盈和止损次数均多于最小风险的投资组合(未展示)

从操作和收益来看也印证了 “高风险高收益” 的道理

仍持仓标的

当然,还会返回回测时间到期时,已经建仓但还没有平仓的标的,在其他分析中不能遗漏

Return,Withdrawal的可视化

程序还会返回回测过程中的收益率和(取负)回撤率曲线

我们发现策略的收益率曲线整体在沪深 300 指数以上,说明我们的策略整体收益情况超过基准指数

并且整体的回测幅度也相对较小,说明我们的策略较为稳定,在大盘回撤时,没有出现更糟糕的情况(对于在 A 股市场经历过实盘交易的投资者来说,这一点显得尤为重要)

至此,数据采集及建模模型评估与仓位管理构建投资组合与回测验证策略 的流程已经全部结束

Return to Codes

Return to Repositories