问题描述
请问:一个股票、期货混合策略(如:时间段A买入持有若干股票,不持有期货;时间段B卖出股票,买入持有期货),模拟交易可以实现(既能交易股票又能交易期货)吗?
P.S.本人有股票策略的模拟交易,也有期货策略的模拟交易,都正常运行,成功下单。但是,混合策略在模拟交易中只成功买卖了股票,期货交易未能成功下单(回测中是可以实现交易股票和期货的)。
解决方案
核心解答
可以实现。 在JoinQuant(聚宽)平台的模拟交易中,完全可以同时交易股票和期货。
您遇到的“股票成功下单,但期货未能成功下单”的问题,根本原因在于未正确配置多子账户(subportfolios)以及下单时未指定对应的账户索引(pindex)。
问题原因解析
在聚宽平台中,如果不显式配置账户类型,系统默认只初始化一个子账户 subportfolios[0],且其类型(type)默认为 'stock'(仅允许买卖股票与场内基金等)。
- 回测环境:有时对账户类型的校验相对宽松,可能会让您误以为单账户也能混合下单。
- 模拟交易环境:校验非常严格。如果您用类型为
'stock'的账户去下期货订单,系统会直接拒绝(报错或返回None),导致期货下单失败。
解决方案:配置多子账户(Subportfolios)
要实现股票和期货的混合交易,您必须在 initialize 函数中将初始资金分配到两个不同的子账户中:一个用于股票(type='stock'),另一个用于期货(type='futures')。并且在调用下单API时,通过 pindex 参数明确告诉系统使用哪个账户的资金。
1. 初始化多账户配置
在 initialize 函数中使用 set_subportfolios 进行配置:
def initialize(context):
# 获取总初始资金
init_cash = context.portfolio.starting_cash
# 将资金分为两份,分别给股票和期货账户
stock_cash = init_cash * 0.5
futures_cash = init_cash * 0.5
# 设定 subportfolios[0] 为股票账户
# 设定 subportfolios[1] 为期货账户
set_subportfolios([
SubPortfolioConfig(cash=stock_cash, type='stock'),
SubPortfolioConfig(cash=futures_cash, type='futures')
])
# 其他初始化设置...
set_benchmark('000300.XSHG')
set_option('use_real_price', True)
2. 下单时指定 pindex
在您的交易逻辑中,调用 order、order_target 等函数时,必须加上 pindex 参数:
pindex=0代表使用股票账户。pindex=1代表使用期货账户。
def handle_data(context, data):
# --- 股票交易逻辑 ---
stock_code = '000001.XSHE'
# 买入股票,必须指定 pindex=0
order(stock_code, 100, pindex=0)
# --- 期货交易逻辑 ---
# 获取主力合约(注意:不能直接交易'RB9999.XSGE',必须获取具体合约)
future_code = get_dominant_future('RB')
# 买入期货多单,必须指定 pindex=1
order(future_code, 1, side='long', pindex=1)
关键注意事项
- 资金隔离:
subportfolios[0]和subportfolios[1]的资金是隔离的。如果股票账户资金不足,即使期货账户有钱,股票也无法下单。如果需要在运行中动态调配资金,可以使用transfer_cash(from_pindex, to_pindex, cash)函数。 - 期货合约代码:切记不要直接对主力连续合约(如
IF9999.CCFX)下单,必须使用get_dominant_future获取真实的交易合约代码(如IF2309.CCFX)。 - 平今/平昨:期货交易中,如果涉及上期所、中金所、能源中心等,平仓时可能需要注意
close_today参数的设置。
按照上述方法修改您的策略代码,明确区分股票账户和期货账户,您的混合策略就可以在模拟交易中顺利运行了。