优点:
缺点:
$pip install rqalpha
RiceQuant免费提供日级别的股票、常用指数、场内基金和期货数据供回测使用。数据每个月月初更新,可以通过以下命令来下载和更新:$ rqalpha download-bundle
bundle 默认存放在 ~/.rqalpha 下,也可以指定 bundle 的存放位置$ rqalpha download-bundle -d target_bundle_path
如果使用了指定路径来存放 bundle,那么执行程序的时候也同样需要指定对应的 bundle 路径。$ rqalpha run -d target_bundle_path .....
如果申请了免费试用(免费试用15天,试用账户进行了每天 50MB 的配额限制,申请链接)或者付费购买了米筐数据服务,可以使用 RQDatac 在每日盘后即时更新回测数据,更新命令如下:$ rqalpha update-bundle
运行以下命令,将会在指定目录生成一个examples文件夹,其中包含几个有趣的样例策略:$ rqalpha examples -d ./
运行回测
1 2 |
$ cd examples $ rqalpha run -f rsi.py -s 2020-01-01 -e 2021-01-01 -o result.pkl --plot --progress --account stock 100000 |
绘制回测结果:如果运行完回测后,还需要再次绘制回测结果,可以运行以下命令:$ rqalpha plot result.pkl
rqalpha抽离了策略框架的所有技术细节,以API的方式提供给策略研发者用于编写策略,从而避免陷入过多的技术细节。
rqalpha的 API主要分为约定函数、数据查询接口、交易接口等几类。
1. 约定函数: 作为 API 的入口函数,用户必须实现对应的约定函数才可以正确的使用RQAlpha
1 2 3 4 |
* init() : 初始化方法,会在程序启动的时候执行 * handle_bar(): bar数据更新时会自动触发调用 * before_trading(): 会在每天策略交易开始前调用 * after_trading(): 会在每天交易结束后调用 |
示例代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# 在这个方法中编写任何的初始化逻辑。context对象将会在你的算法策略的任何方法之间做传递。 def init(context): # 在context中保存全局变量 context.s1 = "000001.XSHE" # 实时打印日志 logger.info("RunInfo: {}".format(context.run_info)) # before_trading此函数会在每天策略交易开始前被调用,当天只会被调用一次 def before_trading(context): logger.info("开盘前执行before_trading函数") # 你选择的证券的数据更新将会触发此段逻辑,例如日或分钟历史数据切片或者是实时数据切片更新 def handle_bar(context, bar_dict): logger.info("每一个Bar执行") logger.info("打印Bar数据:") logger.info(bar_dict[context.s1]) # after_trading函数会在每天交易结束后被调用,当天只会被调用一次 def after_trading(context): logger.info("收盘后执行after_trading函数") |
2. 数据查询接口
需要获取数据,根据数据来确定我们的仓位逻辑,因此会使用到数据查询的 API接口。
1 2 3 4 5 6 7 8 9 10 11 |
* all_instruments() : 获取所有合约基础信息数据 * instruments() : 获取合约详细数据 * history_bars() : 获取某一合约的历史数据 * current_snapshot() : 获取当前快照数据 * get_future_contracts() : 获取期货可以交易合约列表 * get_trading_dates(): 获取交易日列表 * get_previous_trading_date() : 获取上一日交易日 * get_next_trading_date() : 获取下一个交易日 * get_yield_curve(): 获取收益率曲线 * is_suspended() : 判断某股票当天是否停牌 * is_st_stock() : 判断某股票是否为 *st |
3. 交易接口
rqalpha提供了多种交易接口,以方便不同的使用需求。
1 2 3 4 5 6 7 8 9 10 11 12 |
* order_shares(): 【股票专用】指定股数交易 * order_lots(): 【股票专用】指定手数交易 * order_value(): 【股票专用】指定价值交易 * order_percent():【股票专用】 一定比例下单 * order_target_value(): 【股票专用】按照目标价值下单 * order_target_percent(): 【股票专用】按照目标比例下单 * buy_open(): 【期货专用】买开 * sell_close():【期货专用】 平买仓 * sell_open(): 【期货专用】卖开 * buy_close(): 【期货专用】平卖仓 * cancel_order(): 撤单 * get_open_orders(): 获取未成交订单数据 |
rsi.py示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
from rqalpha.apis import * import talib # 在这个方法中编写任何的初始化逻辑。context对象将会在你的算法策略的任何方法之间做传递。 def init(context): # 选择我们感兴趣的股票 context.s1 = "000001.XSHE" context.s2 = "601988.XSHG" context.s3 = "000068.XSHE" context.stocks = [context.s1, context.s2, context.s3] context.TIME_PERIOD = 14 context.HIGH_RSI = 85 context.LOW_RSI = 30 context.ORDER_PERCENT = 0.3 # 你选择的证券的数据更新将会触发此段逻辑,例如日或分钟历史数据切片或者是实时数据切片更新 def handle_bar(context, bar_dict): # 开始编写你的主要的算法逻辑 # bar_dict[order_book_id] 可以拿到某个证券的bar信息 # context.portfolio 可以拿到现在的投资组合状态信息 # 使用order_shares(id_or_ins, amount)方法进行落单 # TODO: 开始编写你的算法吧! # 对我们选中的股票集合进行loop,运算每一只股票的RSI数值 for stock in context.stocks: # 读取历史数据 prices = history_bars(stock, context.TIME_PERIOD+1, '1d', 'close') # 用Talib计算RSI值 rsi_data = talib.RSI(prices, timeperiod=context.TIME_PERIOD)[-1] cur_position = get_position(stock).quantity # 用剩余现金的30%来购买新的股票 target_available_cash = context.portfolio.cash * context.ORDER_PERCENT # 当RSI大于设置的上限阀值,清仓该股票 if rsi_data > context.HIGH_RSI and cur_position > 0: order_target_value(stock, 0) # 当RSI小于设置的下限阀值,用剩余cash的一定比例补仓该股 if rsi_data < context.LOW_RSI: logger.info("target available cash caled: " + str(target_available_cash)) # 如果剩余的现金不够一手 - 100shares,那么会被ricequant 的order management system reject掉 order_value(stock, target_available_cash) |
rqalpha提供了拓展性较强的Mod Hook接口,这意味着开发者可以比较容易的对接第三方库。
1 2 3 |
$ rqalpha mod list # 查看当前安装的 Mod 列表及状态 $ rqalpha mod enable xxx # 启用 $ rqalpha mod disable xxx # 关闭 |
扩展rqalpha API:如果你想为 rqalpha 创建自己的 API,可以通过 Mod 来注册新的 API。在内建的 mod 中,有一个 FuncatAPIMod,将通达信、同花顺的公式表达能力移植到python中,扩展了 rqalpha的 API
扩展rqalpha实现自有数据的读取:rqalpha不限制本地运行的策略调使用哪些库,因此可以直接在策略中读取文件、访问数据库等,但需要关注如下两个注意事项:
rqalpha采用logbook 作为默认的日志模块,可以通过在 mod 中为 logger添加 handler 实现自定义的日志收集
诸葛说 基于rqalpha文档行情数据 - 五十行代码接入 tushare 行情数据完善了tushare mod接口,增加了对tspro接口的支持,参见rqalpha_mod_tushare
我发文章的几个地方,欢迎大家关注公众号获取最新最全的文章,多多交流。