IPython 与 RQAlpha
加载 RQAlpha magic
- In [3]:
- %load_ext rqalpha
- The rqalpha extension is already loaded. To reload it, use:
- %reload_ext rqalpha
查看 RQAlpha magic 帮助
我们可以通过 %%rqalpha
直接在 cell
中运行回测代码。%%rqalpha
后面的参数等价于在 CLI 中后面的 rqalpha run
的参数
- In [2]:
- %%rqalpha -h
- ""
- Usage: ipykernel_launcher.py [OPTIONS]
-
- Start to run a strategy
-
- Options:
- -h, --help Show this message and exit.
- -d, --data-bundle-path PATH
- -f, --strategy-file PATH
- -s, --start-date DATE
- -e, --end-date DATE
- -bm, --benchmark TEXT
- -mm, --margin-multiplier FLOAT
- -a, --account TEXT... set account type with starting cash
- -fq, --frequency [1d|1m|tick]
- -rt, --run-type [b|p]
- --resume
- --source-code TEXT
- -l, --log-level [verbose|debug|info|error|none]
- --disable-user-system-log disable user system log stdout
- --disable-user-log disable user log stdout
- --locale [cn|en]
- --extra-vars TEXT override context vars
- --enable-profiler add line profiler to profile your strategy
- --config TEXT config file path
- -mc, --mod-config TEXT... mod extra config
- --stock-t1 / --no-stock-t1 [sys_accounts] enable/disable stock T+1
- --report PATH [sys_analyser] save report
- -o, --output-file PATH [sys_analyser] output result pickle file
- -p, --plot / --no-plot [sys_analyser] plot result
- --plot-save TEXT [sys_analyser] save plot to file
- --progress [sys_progress]show progress bar
- --no-short-stock / --short-stock
- [sys_risk] enable stock shorting
- --signal [sys_simulation] exclude match engine
- -sp, --slippage FLOAT [sys_simulation] set slippage
- -cm, --commission-multiplier FLOAT
- [sys_simulation] set commission multiplier
- -me, --match-engine [current_bar|next_bar|last|best_own|best_counterparty]
- [Deprecated][sys_simulation] set matching
- type
- -mt, --matching-type [current_bar|next_bar|last|best_own|best_counterparty]
- [sys_simulation] set matching type
使用 %%rqalpha 进行回测
- In [3]:
- %%rqalpha -s 20100101 -e 20170505 -p -bm 000001.XSHG --account stock 100000
-
- def init(context):
- context.stocks = ['000300.XSHG', '000905.XSHG', '000012.XSHG']
-
-
- def handle_bar(context, bar_dict):
- [hs, zz, gz] = context.stocks
- hs_history20 = history_bars(hs, 20, '1d', 'close')
- zz_history20 = history_bars(zz, 20, '1d', 'close')
-
- hsIncrease = hs_history20[-1] - hs_history20[0]
- zzIncrease = zz_history20[-1] - zz_history20[0]
-
- positions = context.portfolio.positions
- [hsQuality, zzQuality, gzQuality] = [positions[hs].quantity, positions[zz].quantity, positions[gz].quantity]
- if hsIncrease < 0 and zzIncrease < 0:
- if hsQuality > 0: order_target_percent(hs, 0)
- if zzQuality > 0: order_target_percent(zz, 0)
- order_target_percent(gz, 1)
- elif hsIncrease < zzIncrease:
- if hsQuality > 0: order_target_percent(hs, 0)
- if gzQuality > 0: order_target_percent(gz, 0)
- order_target_percent(zz, 1)
- else:
- if zzQuality > 0: order_target_percent(zz, 0)
- if gzQuality > 0: order_target_percent(gz, 0)
- order_target_percent(hs, 1)
- #logger.info("positions hs300: " + str(hsQuality) + ", zz500: " + str(zzQuality) + ", gz: " + str(gzQuality))
获取回测报告
运行完回测后,报告会自动存储到 report
变量中。可以直接通过report
变量获取当次回测的结果。
另外 rqalpha 的 mod 的输出会自动存储在 results
变量中。
- In [4]:
- results.keys()
- Out[4]:
- dict_keys(['sys_analyser'])
- In [5]:
- report.keys()
- Out[5]:
- dict_keys(['summary', 'trades', 'portfolio', 'benchmark_portfolio', 'stock_account', 'stock_positions'])
- In [6]:
- report.trades[:5]
- Out[6]:
| commission | exec_id | last_price | last_quantity | order_book_id | order_id | position_effect | side | symbol | tax | trading_datetime | transaction_cost |
---|
datetime | | | | | | | | | | | | |
---|
2010-01-04 15:00:00 | 79.961424 | 1498453688 | 122.34 | 817 | 000012.XSHG | 1498453672 | None | BUY | 国债指数 | 0 | 2010-01-04 15:00:00 | 79.961424 |
---|
2010-01-06 15:00:00 | 79.948352 | 1498453689 | 122.32 | 817 | 000012.XSHG | 1498453673 | None | SELL | 国债指数 | 0 | 2010-01-06 15:00:00 | 79.948352 |
---|
2010-01-06 15:00:00 | 76.444704 | 1498453690 | 4550.28 | 21 | 000905.XSHG | 1498453674 | None | BUY | 中证500(沪) | 0 | 2010-01-06 15:00:00 | 76.444704 |
---|
2010-01-07 15:00:00 | 74.913888 | 1498453691 | 4459.16 | 21 | 000905.XSHG | 1498453675 | None | SELL | 中证500(沪) | 0 | 2010-01-07 15:00:00 | 74.913888 |
---|
2010-01-07 15:00:00 | 78.180552 | 1498453692 | 122.31 | 799 | 000012.XSHG | 1498453676 | None | BUY | 国债指数 | 0 | 2010-01-07 15:00:00 | 78.180552 |
---|
- In [7]:
- report.portfolio[:5]
- Out[7]:
| cash | market_value | static_unit_net_value | total_value | unit_net_value | units |
---|
date | | | | | | |
---|
2010-01-04 | -31.741 | 99951.78 | 1.000 | 99920.039 | 0.999200 | 100000.0 |
---|
2010-01-05 | -31.741 | 99902.76 | 0.999 | 99871.019 | 0.998710 | 100000.0 |
---|
2010-01-06 | 4191.426 | 95555.88 | 0.999 | 99747.306 | 0.997473 | 100000.0 |
---|
2010-01-07 | -44.999 | 97725.69 | 0.997 | 97680.691 | 0.976807 | 100000.0 |
---|
2010-01-08 | -44.999 | 97733.68 | 0.977 | 97688.681 | 0.976887 | 100000.0 |
---|
- In [8]:
- report.stock_positions[:5]
- Out[8]:
| avg_price | last_price | market_value | order_book_id | quantity | symbol |
---|
date | | | | | | |
---|
2010-01-04 | 122.34 | 122.34 | 99951.78 | 000012.XSHG | 817 | 国债指数 |
---|
2010-01-05 | 122.34 | 122.28 | 99902.76 | 000012.XSHG | 817 | 国债指数 |
---|
2010-01-06 | 122.34 | 122.32 | 0.00 | 000012.XSHG | 0 | 国债指数 |
---|
2010-01-06 | 4550.28 | 4550.28 | 95555.88 | 000905.XSHG | 21 | 中证500(沪) |
---|
2010-01-07 | 4550.28 | 4459.16 | 0.00 | 000905.XSHG | 0 | 中证500(沪) |
---|
使用 run_func 运行回测
- In [9]:
- config = {
- "base": {
- "start_date": "2010-01-01",
- "end_date": "2017-05-05",
- "benchmark": "000001.XSHG",
- "accounts": {
- "stock": 100000
- }
- },
- "extra": {
- "log_level": "info",
- },
- "mod": {
- "sys_analyser": {
- "enabled": True,
- "plot": True,
- },
- }
- }
-
-
- from rqalpha.api import *
- from rqalpha import run_func
-
-
- def init(context):
- context.stocks = ['000300.XSHG', '000905.XSHG', '000012.XSHG']
-
-
- def handle_bar(context, bar_dict):
- [hs, zz, gz] = context.stocks
- hs_history20 = history_bars(hs, 20, '1d', 'close')
- zz_history20 = history_bars(zz, 20, '1d', 'close')
-
- hsIncrease = hs_history20[-1] - hs_history20[0]
- zzIncrease = zz_history20[-1] - zz_history20[0]
-
- positions = context.portfolio.positions
- [hsQuality, zzQuality, gzQuality] = [positions[hs].quantity, positions[zz].quantity, positions[gz].quantity]
- if hsIncrease < 0 and zzIncrease < 0:
- if hsQuality > 0: order_target_percent(hs, 0)
- if zzQuality > 0: order_target_percent(zz, 0)
- order_target_percent(gz, 1)
- elif hsIncrease < zzIncrease:
- if hsQuality > 0: order_target_percent(hs, 0)
- if gzQuality > 0: order_target_percent(gz, 0)
- order_target_percent(zz, 1)
- else:
- if zzQuality > 0: order_target_percent(zz, 0)
- if gzQuality > 0: order_target_percent(gz, 0)
- order_target_percent(hs, 1)
-
-
- results = run_func(init=init, handle_bar=handle_bar, config=config)
- In [10]:
- report = results["sys_analyser"]
- In [11]:
- report["trades"][:5]
- Out[11]:
| commission | exec_id | last_price | last_quantity | order_book_id | order_id | position_effect | side | symbol | tax | trading_datetime | transaction_cost |
---|
datetime | | | | | | | | | | | | |
---|
2010-01-04 15:00:00 | 79.961424 | 1498454089 | 122.34 | 817 | 000012.XSHG | 1498454073 | None | BUY | 国债指数 | 0 | 2010-01-04 15:00:00 | 79.961424 |
---|
2010-01-06 15:00:00 | 79.948352 | 1498454090 | 122.32 | 817 | 000012.XSHG | 1498454074 | None | SELL | 国债指数 | 0 | 2010-01-06 15:00:00 | 79.948352 |
---|
2010-01-06 15:00:00 | 76.444704 | 1498454091 | 4550.28 | 21 | 000905.XSHG | 1498454075 | None | BUY | 中证500(沪) | 0 | 2010-01-06 15:00:00 | 76.444704 |
---|
2010-01-07 15:00:00 | 74.913888 | 1498454092 | 4459.16 | 21 | 000905.XSHG | 1498454076 | None | SELL | 中证500(沪) | 0 | 2010-01-07 15:00:00 | 74.913888 |
---|
2010-01-07 15:00:00 | 78.180552 | 1498454093 | 122.31 | 799 | 000012.XSHG | 1498454077 | None | BUY | 国债指数 | 0 | 2010-01-07 15:00:00 | 78.180552 |
---|
- In [ ]:
-