3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在聚宽(JoinQuant)量化交易平台中,order_value 函数用于按照指定的价值/保证金进行下单。与股票交易直接对应交易金额不同,期货交易由于存在杠杆机制(保证金制度)和合约乘数,其价值与手数的换算逻辑有其特殊性。
在期货交易中,使用 order_value(security, value, style=None, side='long', pindex=0, close_today=False) 时,参数 value 代表的是期望投入的期货保证金金额。
一张期货合约所对应的保证金计算公式为:
$$\text{单张合约保证金} = \text{最新价} \times \text{合约乘数} \times \text{保证金率}$$
因此,通过 order_value 计算出的**实际下单手数(amount)**公式为:
$$\text{实际下单手数} = \left\lfloor \frac{\text{value}}{\text{最新价} \times \text{合约乘数} \times \text{保证金率}} \right\rfloor$$
注意:由于期货下单必须为整数手,系统计算出手数后会向下取整。如果计算出的手数不足 1 手,订单将无法下成功。
'IF2309.CCFX' 或动态获取的主力合约。注意不可直接对主力连续合约(如 'IF9999.CCFX')或指数(如 'IF8888.CCFX')直接下单。value > 0:表示开仓或加仓对应保证金金额的头寸。value < 0:表示平仓对应保证金金额的头寸。'long':多单操作(默认)。'short':空单操作。set_option('futures_margin_rate', value) 进行自定义设置。以下示例展示了如何在 JoinQuant 中初始化期货账户,并使用 order_value 按保证金价值对沪深 300 股指期货(IF)进行开仓和平仓操作:
import jqdata
def initialize(context):
# 1. 设定基准
set_benchmark('000300.XSHG')
# 2. 开启动态复权模式
set_option('use_real_price', True)
# 3. 初始化子账户类型为期货账户 (type='futures')
init_cash = context.portfolio.starting_cash
set_subportfolios([SubPortfolioConfig(cash=init_cash, type='futures')])
# 4. 设置股指期货保证金比例 (例如设置为 15%)
set_option('futures_margin_rate.IF', 0.15)
# 5. 定时运行函数(以 IF 主力合约作为时间参考标的)
run_daily(market_open, time='every_bar', reference_security='IF9999.CCFX')
def market_open(context):
# 获取当前 IF 股指期货的主力合约代码
dominant_future = get_dominant_future('IF')
# 取得可用资金
available_cash = context.subportfolios[0].available_cash
# 检查当前是否有持仓
long_positions = context.subportfolios[0].long_positions
# 如果没有持仓且有可用资金,按 500,000 元保证金开多仓
if dominant_future not in long_positions and available_cash >= 500000:
# 按保证金价值买入开多仓
order_value(dominant_future, 500000, side='long', pindex=0)
log.info("按保证金 500,000 元开多仓: %s" % dominant_future)
# 平仓示例如下(直接对目标方向传入负价值):
# elif dominant_future in long_positions:
# order_value(dominant_future, -500000, side='long', pindex=0)
在 JoinQuant 的期货交易中,order_value 的的核心在于把传入的 value 视作保证金总额,系统会自动结合当前的最新价、合约乘数与保证金率换算为具体的下单手数。在编写策略时,请务必保证子账户类型设置为 futures,并留意下单手数向下取整带来的资金利用率差异。