跳转到内容

期货:保证金、换月与限仓

期货以保证金交易,实际仓位由保证金率而非名义金额决定:

名义仓位=保证金保证金率.\text{名义仓位} = \frac{\text{保证金}}{\text{保证金率}}.

保证金率的变动直接强制调整杠杆:

  • 交易所可在市场剧烈波动时临时提高保证金率(如 2020 年负油价前后)——已建仓的头寸被迫补保证金或减仓;
  • 回测必须模拟保证金变动:固定保证金率的回测在"保证金上调"事件中会给出错误的资金曲线;
  • 资金占用还影响可分散度:保证金占用高的策略,同样资金下能持有的头寸更少,见回测引擎设计。

期货合约不断到期,流动性集中在主力合约。移仓的三个问题:

  1. 换月日判定:主力合约按当时的成交量/持仓量规则切换,不能事后固定(见行情数据的拼接问题);
  2. 移仓成本:换月日的价差与冲击成本——移仓是真实的交易,不是免费拼接;
  3. 移仓节奏:一次性移仓 vs 分批移仓,后者降低冲击但增加不确定性。

回测中移仓要按真实交易处理:换月日的成交计入成本模型。

  • 交易所对单一客户/品种的持仓上限(限仓)直接约束策略容量:大资金的趋势策略在单一品种上的仓位有天花板;
  • 交割月前保证金逐步提高、限仓收紧——实盘策略必须在交割月前移仓;
  • 回测中模拟限仓:超过限仓的信号无法执行。
  • 夜盘时段(21:00–次日凌晨)覆盖外盘主要交易时间——隔夜跳空风险显著小于纯日盘品种;
  • 但夜盘流动性差于日盘,价差与冲击成本更高;
  • 夜盘的存在改变了"隔夜收益"的分布:有夜盘品种的隔夜风险集中在凌晨收盘到日盘开盘之间。
margin-check.py
import numpy as np
def position_size(margin: float, margin_rate: float, contract_mult: float,
price: float) -> int:
"""保证金 → 可开仓合约数(受保证金率约束)"""
notional = margin / margin_rate
return int(notional / (contract_mult * price))
def forced_deleveraging(margin: float, margin_rate_old: float,
margin_rate_new: float, positions: int) -> int:
"""保证金率上调 → 强制减仓后的可保留头寸"""
return int(positions * margin_rate_old / margin_rate_new)
  • 保证金率作为参数,模拟临时上调事件;
  • 移仓按真实交易计成本,换月日按当时成交量规则判定;
  • 容量按限仓制度设定,交割月前强制移仓。
  • 交易所临时提高保证金会强制降杠杆,回测必须模拟
  • 主力合约切换日的成交量分布决定换月判定
  • 国内商品期货的夜盘时段改变隔夜风险的分布