3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在聚宽(JoinQuant)策略开发中,默认的账户仅支持单一资产类型(通常为股票/基金)。如果策略需要同时交易股票和期货,或者需要进行资金分仓管理,必须在 initialize 初始化函数中使用 set_subportfolios 函数配置多个子账户(SubPortfolio)。
set_subportfolios 函数说明set_subportfolios 用于初始化策略子账户,只能在 initialize 函数中调用。所有子账户的初始资金(cash)之和必须等于总初始资金(context.portfolio.starting_cash)。
set_subportfolios([SubPortfolioConfig(cash, type), ...])
cash: 该子账户分配的初始资金(float)。type: 子账户支持的标的类型,常见选项包括:
'stock': 股票与场内基金账户'futures': 期货账户(包含股指期货与商品期货)'index_futures': 金融期货账户'stock_margin': 融资融券账户以下代码展示了如何将账户初始资金一分为二,分别创建股票子账户(pindex=0)和期货子账户(pindex=1):
import jqdata
def initialize(context):
# 开启动态复权模式
set_option('use_real_price', True)
# 获取总初始资金,并均分为两份
total_cash = context.portfolio.starting_cash
half_cash = total_cash / 2
# 配置 2 个子账户:
# subportfolios[0]: 股票账户
# subportfolios[1]: 期货账户
set_subportfolios([
SubPortfolioConfig(cash=half_cash, type='stock'),
SubPortfolioConfig(cash=half_cash, type='futures')
])
# 设置定时运行函数(期货策略建议指定 reference_security)
run_daily(market_open, time='open', reference_security='IF9999.CCFX')
pindex)在调用下单函数(如 order、order_target、order_value 等)时,需要通过 pindex 参数指定使用哪一个子账户:
def market_open(context):
# 1. 在股票子账户 (pindex=0) 中买入平安银行 100 股
order('000001.XSHE', 100, pindex=0)
# 2. 在期货子账户 (pindex=1) 中开一手沪深300股指期货多单
order('IF2309.CCFX', 1, side='long', pindex=1)
可以通过 context.subportfolios[pindex] 访问特定子账户的资金与持仓:
# 获取股票子账户可用资金
stock_cash = context.subportfolios[0].available_cash
# 获取期货子账户的总资产
futures_value = context.subportfolios[1].total_value
# 获取期货子账户的多头持仓
futures_positions = context.subportfolios[1].long_positions
如果需要在不同子账户之间转移资金,可以使用 transfer_cash 函数:
# 从股票子账户 (pindex=0) 转移 500,000 元到期货子账户 (pindex=1)
transfer_cash(from_pindex=0, to_pindex=1, cash=500000)
SubPortfolioConfig 的 cash 总和必须精确等于 context.portfolio.starting_cash,否则系统会抛出异常。type='stock' 的子账户中对期货标的下单,反之亦然。否则订单会创建失败(返回 None)。subportfolio。