3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 JoinQuant(聚宽)量化交易平台中,当策略需要同时操作多种资产(例如股票与期货混合策略、多策略组合等)时,通常需要划分多个子账户(SubPortfolio)。本文将详细讲解如何初始化多仓位,并通过 order_target_value 结合 pindex 参数向指定的子账户下达目标价值订单。
默认情况下,策略仅有一个子账户 subportfolios[0]。如果你需要将资金划分为不同的独立仓位(例如仓位 0 跑股票策略,仓位 1 跑期货策略),可以在 initialize 函数中使用 set_subportfolios 进行初始化。
pindex:表示子账户(subportfolio)的索引序号,从 0 开始。例如:
pindex=0:代表第 1 个子账户pindex=1:代表第 2 个子账户order_target_value 函数用于将指定标的调整到目标总价值(价值 = 最新价 × 数量 × 保证金率 × 乘数)。
order_target_value(security, value, style=None, side='long', pindex=0, close_today=False)
security:标的代码(如 '000001.XSHE' 或 'IF1412.CCFX')。value:目标调整价值。设为 0 代表清仓。side:'long'(多单)或 'short'(空单),默认为 'long'。pindex:指定的子账户序号,默认为 0。如果创建了多个子账户,必须显式传入对应的 pindex 索引。以下示例演示如何创建两个子账户(股票账户与期货账户),并分别在指定的 pindex 下使用 order_target_value 下单:
import jqdata
def initialize(context):
# 1. 设定基准与真实价格模式
set_benchmark('000300.XSHG')
set_option('use_real_price', True)
# 2. 初始化多仓位:将资金平分为 2 份
init_cash = context.portfolio.starting_cash / 2
set_subportfolios([
SubPortfolioConfig(cash=init_cash, type='stock'), # pindex = 0: 股票账户
SubPortfolioConfig(cash=init_cash, type='futures') # pindex = 1: 期货账户
])
# 定时运行
run_daily(trade, time='9:30')
def trade(context):
# 股票标的与期货标的
stock = '000001.XSHE'
future = 'IF2309.CCFX'
# --- 在子账户 0 (股票账户) 下单 ---
# 调整平安银行的股票持仓价值到 100,000 元
order_target_value(stock, 100000, pindex=0)
log.info("已向 pindex=0 (股票账户) 下达目标价值 100,000 元的订单: %s" % stock)
# --- 在子账户 1 (期货账户) 下单 ---
# 调整股指期货多单保证金价值到 50,000 元
order_target_value(future, 50000, side='long', pindex=1)
log.info("已向 pindex=1 (期货账户) 下达多单目标价值 50,000 元的订单: %s" % future)
# --- 平仓示例 ---
# 若要清仓 pindex=0 中的股票:
# order_target_value(stock, 0, pindex=0)
pindex=1 会抛出异常提示仓位不存在。type='stock' 的仓位;type='futures' 或 type='index_futures' 的仓位,否则会导致委托失败。order_target_value 时,若该标的在对应 pindex 存在未完成的挂单,系统会自动取消先前未完成的订单。