RQAlpha 量化交易策略框架
RQAlpha 是一个功能强大的量化交易策略框架,专为量化投资者和机构设计。它支持多种金融工具的回测,包括股票、期货、期权、可转债、指数和场外基金等。通过 RQAlpha,用户可以快速验证交易策略的有效性,并将其应用于模拟交易或实盘交易。
一、功能特点
- 低门槛:基于 Python,易于上手,适合初学者和专业投资者。
- 高扩展性:支持调用第三方库,用户可以自定义插件和扩展功能。
- 多品种支持:支持中国市场几乎所有场内金融工具。
- 多频率回测:支持日级别、分钟级别和 tick 级别的回测。
- 丰富的数据接口:提供丰富的数据查询接口,支持财务数据、行情数据等。
二、支持的金融工具及功能
股票
日级别回测:基于日线数据进行回测。
分钟级别回测:基于分钟线数据进行回测。
tick 级别回测:基于 tick 数据进行回测。
自动处理 T+1 和分红拆分。
期货
日级别回测:支持主力连续合约和逐日盯市制度。
分钟级别回测:支持分钟线数据。
tick 级别回测:支持 tick 数据。
保证金交易:支持保证金倍率设置。
期权
日级别回测:支持行权操作。
分钟级别回测:支持分钟线数据。
tick 级别回测:支持 tick 数据。
行权滑点:模拟行权时的市场波动。
可转债
日级别回测:支持转股和回售操作。
分钟级别回测:支持分钟线数据。
tick 级别回测:支持 tick 数据。
三、快速上手指南
第一个策略
以下是一个简单的买入并持有策略示例:
def init(context):
context.fired = False
def handle_bar(context, bar_dict):
if not context.fired:
order_target_percent("000001.XSHE", 0.5) # 半仓买入平安银行
context.fired = True
运行该策略时,RQAlpha 会在回测期间展示策略的收益曲线和部分收益及风险指标。
MACD 策略示例
以下是一个基于 MACD 指标的交易策略示例:
import talib
def init(context):
context.stock = "000001.XSHE"
context.SHORTPERIOD = 12
context.LONGPERIOD = 26
context.SMOOTHPERIOD = 9
context.OBSERVATION = 100
def handle_bar(context, bar_dict):
prices = history_bars(context.stock, context.OBSERVATION, '1d', 'close')
macd, macd_signal, _ = talib.MACD(prices, context.SHORTPERIOD, context.LONGPERIOD, context.SMOOTHPERIOD)
if macd[-1] > macd_signal[-1] and macd[-2] < macd_signal[-2]:
order_target_percent(context.stock, 1) # 全仓买入
elif macd[-1] < macd_signal[-1] and macd[-2] > macd_signal[-2]:
order_target_percent(context.stock, 0) # 清仓
四、编写策略
初始化阶段
在 init 函数中,可以进行全局变量的初始化和策略的准备工作:
def init(context):
context.stock = "000001.XSHE" # 设置目标股票
context.SHORTPERIOD = 12
context.LONGPERIOD = 26
context.SMOOTHPERIOD = 9
context.OBSERVATION = 100
行情更新阶段
在 handle_bar 函数中,策略会根据市场行情进行交易决策:
def handle_bar(context, bar_dict):
prices = history_bars(context.stock, context.OBSERVATION, '1d', 'close')
macd, macd_signal, _ = talib.MACD(prices, context.SHORTPERIOD, context.LONGPERIOD, context.SMOOTHPERIOD)
if macd[-1] > macd_signal[-1] and macd[-2] < macd_signal[-2]:
order_target_percent(context.stock, 1) # 全仓买入
elif macd[-1] < macd_signal[-1] and macd[-2] > macd_signal[-2]:
order_target_percent(context.stock, 0) # 清仓
五、运行策略
终端命令运行
使用命令行工具运行策略:
rqalpha run -f macd_000001.py -a stock 100000 -s 20190101 -e 20191231 -bm 000300.XSHG -p
函数入口运行
通过 run_func 函数运行策略:
config = {
"base": {
"accounts": {"STOCK": 100000},
"start_date": "20190101",
"end_date": "20191231",
},
"mod": {
"sys_analyser": {
"plot": True,
"benchmark": "000300.XSHG"
}
}
}
if __name__ == "__main__":
from rqalpha import run_func
run_func(config=config, init=init, handle_bar=handle_bar)
获取结果
运行策略后,可以获取以下结果:
- 收益曲线:展示策略的收益变化。
- 收益和风险指标:如夏普比率、最大回撤等。
- 交易流水:记录所有交易操作。
- 每日账户和持仓数据:展示每日的账户状态和持仓情况。
六、进阶教程
账户和持仓
访问账户和持仓信息:
# 获取当前账户的现金
cash = context.portfolio.accounts["STOCK"].cash
# 获取当前持仓数量
position = context.portfolio.positions["000001.XSHE"].quantity
回测频率
- 日级别回测:每个交易日触发一次
handle_bar。 - 分钟级别回测:每分钟触发一次
handle_bar。 - tick 级别回测:每个 tick 触发一次
handle_tick。
事前风控
设置事前风控参数:
# 关闭验资风控
config = {
"mod": {
"sys_risk": {
"validate_cash": False
}
}
}
模拟撮合
设置撮合模型和滑点:
# 设置撮合模型为当前 bar 收盘价撮合
config = {
"mod": {
"sys_simulation": {
"matching_type": "current_bar",
"slippage_model": "PriceRatioSlippage",
"slippage": 0.001
}
}
}
七、示例策略
多股票 RSI 策略
以下是一个多股票 RSI 策略示例:
import talib
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):
for stock in context.stocks:
prices = history_bars(stock, context.TIME_PERIOD + 1, '1d', 'close')
rsi_data = talib.RSI(prices, timeperiod=context.TIME_PERIOD)[-1]
cur_position = context.portfolio.positions[stock].quantity
target_available_cash = context.portfolio.cash * context.ORDER_PERCENT
if rsi_data > context.HIGH_RSI and cur_position > 0:
order_target_value(stock, 0) # 清仓
elif rsi_data < context.LOW_RSI:
order_value(stock, target_available_cash) # 用部分现金买入
商品期货跨品种配对交易
以下是一个简单的商品期货跨品种配对交易策略示例:
import numpy as np
def init(context):
context.s1 = 'AG1612' # 白银期货
context.s2 = 'AU1612' # 黄金期货
context.window = 60 # 滚动窗口
context.ratio = 15 # 对冲比率
context.entry_score = 2 # 入场临界值
subscribe([context.s1, context.s2]) # 订阅行情
def handle_bar(context, bar_dict):
position_a = context.portfolio.positions[context.s1]
position_b = context.portfolio.positions[context.s2]
price_array_a = history_bars(context.s1, context.window, '1m', 'close')
price_array_b = history_bars(context.s2, context.window, '1m', 'close')
spread_array = price_array_a - context.ratio * price_array_b
std = np.std(spread_array)
mean = np.mean(spread_array)
up_limit = mean + context.entry_score * std
down_limit = mean - context.entry_score * std
price_a = bar_dict[context.s1].close
price_b = bar_dict[context.s2].close
spread = price_a - context.ratio * price_b
if spread <= down_limit and position_a.buy_quantity == 0:
buy_open(context.s1, 1) # 多头开仓
sell_open(context.s2, context.ratio) # 空头开仓
elif spread >= up_limit and position_b.buy_quantity == 0:
sell_open(context.s1, 1) # 空头开仓
buy_open(context.s2, context.ratio) # 多头开仓
elif spread >= mean and position_a.buy_quantity > 0:
sell_close(context.s1, 1) # 多头平仓
buy_close(context.s2, context.ratio) # 空头平仓
elif spread < mean and position_b.buy_quantity > 0:
buy_close(context.s1, 1) # 空头平仓
sell_close(context.s2, context.ratio) # 多头平仓
八、总结
RQAlpha 是一个功能强大且易于使用的量化交易策略框架,支持多种金融工具和回测频率。通过详细的文档和丰富的示例策略,用户可以快速上手并开发自己的量化策略。无论是初学者还是专业投资者,都能在 RQAlpha 中找到适合自己的工具和功能。