介绍

RQAlpha 从数据获取、算法交易、回测引擎,实盘模拟,实盘交易到数据分析,为程序化交易者提供了全套解决方案。

RQAlpha 具有灵活的配置方式,强大的扩展性,用户可以非常容易地定制专属于自己的程序化交易系统。

特点

易于使用 让您集中于策略的开发,一行简单的命令就可以执行您的策略。
完善的文档 您可以直接访问 RQAlpha 文档 或者 Ricequant 文档 来获取您需要的信息。
活跃的社区 您可以通过访问 Ricequant 社区 获取和询问有关 RQAlpha 的一切问题,有很多优秀的童鞋会解答您的问题。
稳定的环境 每天都有会大量的算法交易在 Ricequant 上运行,无论是 RQAlpha,还是数据,我们能会做到问题秒处理,秒解决。
灵活的配置 您可以使用多种方式来配置和运行策略,只需简单的配置就可以构建适合自己的交易系统。
强大的扩展性 开发者可以基于我们提供的 Mod Hook 接口来进行扩展。

警告

RQAlpha 本身支持不同周期的回测和实盘交易,但是目前只免费开放A股市场日线数据,如果用户需要做分钟回测或者更细级别的回测可以在 Ricequant 上进行,也通过实现数据层接口函数来使用自己的数据。自有数据源对接请参考 扩展事件源

RQAlpha 安装

$ pip install rqalpha

注解

RQAlpha 依赖一些需要 GCC 编译的库,如果您安装遇到问题请访问 安装指南 来寻找详细的安装文档信息。

警告

我们强烈建议您在虚拟环境下安装RQAlpha

虚拟环境的安装,请参考 环境搭建

数据获取

当 RQAlpha 安装完成后,可以通过如下命令获取我们提供的免费A股日线数据。获取数据的详细内容请参考 获取回测数据

$ rqalpha update_bundle

生成样例策略

运行以下命令,将会在指定目录生成一个examples文件夹,其中包含几个有趣的样例策略:

$ rqalpha examples -d ./

运行回测

运行 RQAlpha 需要传递一些参数,可以通过命令 rqalpha help 查看,或者查看文档 获取配置文件 来获取相关信息。

运行如下命令:

$ cd examples
$ rqalpha run -f rsi.py -s 2014-01-01 -e 2016-01-01 -o result.pkl --plot --progress --account stock 100000

等待回测结束后,将显示您的收益率和Risk。

绘制回测结果

如果运行完回测后,还需要再次绘制回测结果,可以运行以下命令:

$ rqalpha plot result.pkl

分析结果

RQAlpha可以输出一个 pickle 文件,里面为一个 dict 。keys 包括

  • summary 回测摘要
  • stock_portfolios 股票帐号的市值
  • future_portfolios 期货帐号的市值
  • total_portfolios 总账号的的市值
  • benchmark_portfolios 基准帐号的市值
  • stock_positions 股票持仓
  • future_positions 期货仓位
  • benchmark_positions 基准仓位
  • trades 交易详情(交割单)
  • plots 调用plot画图时,记录的值
import pickle

result_dict = pickle.load(open("/tmp/alpha.pkl", "rb"))   # 从输出pickle中读取数据

result_dict.keys()
# Out: dict_keys(['stock_portfolios', 'total_portfolios', 'stock_positions',
#                 'benchmark_portfolios', 'plots', 'summary', 'trades', 'benchmark_positions'])

result_dict["summary"]
# Out:
# {'alpha': 0.027,
#  'annualized_returns': 0.025000000000000001,
#  'benchmark': '000001.XSHG',
#  'benchmark_annualized_returns': -0.057285289949864038,
#  'benchmark_total_returns': -0.059871893424000011,
#  'beta': 0.314,
#  'cash': -617.64200000000005,
#  'commission_multiplier': 1,
#  'dividend_receivable': 0.0,
#  'downside_risk': 0.14299999999999999,
#  'end_date': datetime.date(2017, 1, 19),
#  'frequency': '1d',
#  'frozen_cash': 0.0,
#  'information_ratio': 0.45700000000000002,
#  'margin_multiplier': 1,
#  'market_value': 1027242.0,
#  'matching_type': 'CURRENT_BAR_CLOSE',
#  'max_drawdown': 0.087999999999999995,
#  'pnl': 26624.358,
#  'portfolio_value': 1026624.358,
#  'run_type': 'BACKTEST',
#  'sharpe': 0.016,
#  'slippage': 0,
#  'sortino': 0.014,
#  'start_date': datetime.date(2016, 1, 4),
#  'strategy_file': 'rqalpha/examples/simple_macd.py',
#  'strategy_name': 'simple_macd',
#  'strategy_type': 'stock',
#  'total_returns': 0.027,
#  'tracking_error': 0.18099999999999999,
#  'transaction_cost': 27467.462,
#  'volatility': 0.125}

result_dict["total_portfolios"][-5:]
# Out:
#             annualized_returns     cash  daily_pnl  daily_returns  \
# date
# 2017-01-13               0.024 -617.642     1119.0          0.001
# 2017-01-16               0.021 -617.642    -2238.0         -0.002
# 2017-01-17               0.022 -617.642     1119.0          0.001
# 2017-01-18               0.024 -617.642     2238.0          0.002
# 2017-01-19               0.025 -617.642     1119.0          0.001
#             dividend_receivable  frozen_cash  market_value        pnl  \
# date
# 2017-01-13                  0.0          0.0     1025004.0  24386.358
# 2017-01-16                  0.0          0.0     1022766.0  22148.358
# 2017-01-17                  0.0          0.0     1023885.0  23267.358
# 2017-01-18                  0.0          0.0     1026123.0  25505.358
# 2017-01-19                  0.0          0.0     1027242.0  26624.358
#             portfolio_value  total_returns  transaction_cost
# date
# 2017-01-13      1024386.358          0.024         27467.462
# 2017-01-16      1022148.358          0.022         27467.462
# 2017-01-17      1023267.358          0.023         27467.462
# 2017-01-18      1025505.358          0.026         27467.462
# 2017-01-19      1026624.358          0.027         27467.462

result_dict["stock_positions"][-5:]
# Out[6]:
#             average_cost  avg_price  bought_quantity  bought_value  \
# date
# 2017-01-13          9.15       9.15           111900     1023885.0
# 2017-01-16          9.15       9.15           111900     1023885.0
# 2017-01-17          9.15       9.15           111900     1023885.0
# 2017-01-18          9.15       9.15           111900     1023885.0
# 2017-01-19          9.15       9.15           111900     1023885.0
#             market_value order_book_id     pnl  quantity  sellable  \
# date
# 2017-01-13     1025004.0   000001.XSHE  1119.0    111900    111900
# 2017-01-16     1022766.0   000001.XSHE -1119.0    111900    111900
# 2017-01-17     1023885.0   000001.XSHE     0.0    111900    111900
# 2017-01-18     1026123.0   000001.XSHE  2238.0    111900    111900
# 2017-01-19     1027242.0   000001.XSHE  3357.0    111900    111900
#             sold_quantity  sold_value symbol  total_orders  total_trades  \
# date
# 2017-01-13              0         0.0   平安银行             1             1
# 2017-01-16              0         0.0   平安银行             1             1
# 2017-01-17              0         0.0   平安银行             1             1
# 2017-01-18              0         0.0   平安银行             1             1
# 2017-01-19              0         0.0   平安银行             1             1
#             transaction_cost  value_percent
# date
# 2017-01-13           819.108          1.001
# 2017-01-16           819.108          1.001
# 2017-01-17           819.108          1.001
# 2017-01-18           819.108          1.001
# 2017-01-19           819.108          1.001