合约价格 × 合约乘数。
保证金只覆盖其中一部分。以台湾标准股票期货约13.5%的保证金比例计算,账户实际承受的名义敞口约为保证金的7.4倍。价格只需要反向波动几个百分点,账户权益就可能接近维持保证金红线。
所以,选择股票期货不能从“看好哪只股票”开始。应该从合约结构开始。
成交量、未平仓合约量、合约乘数、最小变动单位、保证金、到期日、转仓规则、结算方式、除权息调整机制,任何一个参数缺失,回测结果都可能失真。交易终端里显示的代码只是入口,不是完整的交易对象。
流动性先于观点:成交量和未平仓量不是装饰数据
股票期货最先要检查的是流动性。
这里至少需要观察两个变量:
- 成交量:某一交易日内实际成交的合约数量。
- 未平仓合约量:交易结束后仍然存在的多空持仓总量。
成交量回答的是“今天能不能成交”。未平仓量回答的是“这个合约是否存在持续的持仓基础”。
两者不能互相替代。
某个合约当天成交量较高,可能只是单日事件驱动。若未平仓量长期接近零,说明持仓并不稳定。相反,未平仓量较高但当天成交量很低,意味着市场上有持仓,却不一定能在当前价位完成退出。
盘口深度比单日成交量更接近真实成本
很多交易者只看成交量排名。这不够。
量化策略真正需要的是:
1. 下单时是否有连续报价。
2. 买一和卖一之间的价差是否稳定。
3. 一笔正常规模的订单会吃掉几档盘口。
4. 开盘、收盘和财报时段的价差是否异常扩大。
5. 平仓时是否必须跨越多个价位。
6. 夜盘或非主交易时段是否存在报价断层。
股票期货的成交量通常低于对应的股票现货。个别冷门合约可能整天没有成交。此时,模型里的“按收盘价成交”没有执行意义。策略可以产生信号,但无法完成平仓。
滑点也不是固定比例。
如果订单数量为 \(Q\),盘口第 \(i\) 档可成交数量为 \(q_i\),价格为 \(p_i\),实际成交均价应近似表示为:
\[
P_{\text{exec}}=\frac{\sum_i p_i q_i}{\sum_i q_i}
\]
当 \(Q\) 小于第一档数量时,滑点可能接近买卖价差的一半。当 \(Q\) 超过第一档数量,实际成本由多档盘口共同决定。回测若直接使用收盘价,等于默认市场拥有无限深度。这是错误假设。
交易信号解决“是否进入”。流动性决定“是否能退出”。后者通常更贵。
未平仓量用于筛选合约,不用于预测方向
未平仓量不是上涨或下跌信号的替代品。
它能说明合约是否有足够的持仓基础,不能单独说明多方或空方占优。因为每一张未平仓合约同时对应一个多头和一个空头。数据本身没有提供方向归属。
更合理的筛选方式是把成交量和未平仓量放进执行模型:
| 检查项目 | 可接受状态 | 风险状态 |
|---|---|---|
| 日成交量 | 多数交易日持续存在 | 偶发放量,其余时间接近零 |
| 未平仓量 | 连续多个交易日保持一定规模 | 长期极低或快速归零 |
| 买卖价差 | 价差稳定,波动可建模 | 价差频繁跳变 |
| 盘口深度 | 足以覆盖计划下单量 | 一档数量远低于订单规模 |
| 平仓路径 | 正常时段可完成 | 需要等待对手盘 |
| 交易成本 | 手续费、税费、滑点可估计 | 滑点取决于单笔偶然成交 |
没有统一的“冷门合约成交量阈值”。不同标的、交易所和时段的分布差异很大。因此,不应机械地写成“日成交量超过某个固定数字就安全”。
更稳妥的做法是使用策略自身的订单规模计算流动性压力:
\[
L=\frac{\text{计划订单数量}}{\text{过去一段时间的平均可成交数量}}
\]
当 \(L\) 接近或超过1时,订单已经可能显著影响成交价格。这里的分母不能只使用全天成交量,还需要结合实际执行时段、盘口深度和订单类型。
回测里至少加入三种成交假设
同一套策略,采用不同成交假设,结果可能完全不同。股票期货回测建议至少测试以下情形:
- 按买一或卖一成交,模拟立即成交。
- 按中间价加固定滑点成交,模拟一般执行。
- 按盘口逐档吃单成交,模拟较大规模订单。
如果策略只有在收盘价成交的情况下盈利,而加入一个很小的价差和滑点后就失去优势,问题不在市场,而在模型。
成交量过滤也不能只看入场。退出风险通常更高。开仓时可以等待,平仓时可能没有等待空间。止损订单尤其如此,因为风险扩大时,盘口往往同时恶化。
合约规格决定实际敞口:乘数和跳动值必须拆开看
股票期货不是一张“按股票价格波动”的纸面合约。它是一个带有固定乘数的标准化合约。
名义价值为:
\[
V=P\times M
\]
其中:
- \(P\) 是期货价格。
- \(M\) 是合约乘数。
- \(V\) 是一手合约对应的名义价值。
台湾期货交易所的标准股票期货,一手通常代表2,000股;小型股票期货一手代表100股。芝商所个股期货的常见合约乘数也是100股。
同样的标的价格,合约乘数不同,资金占用和盈亏变化完全不同。
假设某股票期货价格为100元:
- 乘数为2,000股时,一手名义价值为200,000元。
- 乘数为100股时,一手名义价值为10,000元。
价格每变动1元,前者每手盈亏变化2,000元,后者每手盈亏变化100元。
价格看起来相同。风险单位不同。
最小变动价位决定盈亏颗粒度
除了乘数,还要检查最小变动价位。
单跳盈亏为:
\[
\]
芝商所个股期货的最小变动价位可为0.01点,对应每张合约1美元盈亏。这个单位看似很小,但在高频策略、短周期套利和大规模组合中会持续累积。
如果策略平均持仓时间很短,目标收益只有几个最小变动单位,那么手续费、买卖价差和跳动误差会占据主要部分。此时,预测模型的准确率不是第一问题,成交成本才是。
交易系统需要把以下参数显式存储,而不是写死在代码里:
contract_multiplier
tick_size
tick_value
initial_margin
maintenance_margin
expiry_date
settlement_type不同交易所的字段名称可能不同,但逻辑不能省略。合约代码相同或相近,不代表规格相同。小型合约、标准合约、不同到期月份,都可能拥有不同的乘数和保证金参数。
不能用股票数量代替合约数量
股票现货组合通常以股数表达。股票期货组合必须至少同时记录:
- 合约张数。
- 合约乘数。
- 期货价格。
- 名义价值。
- 初始保证金。
- 维持保证金。
- 单跳盈亏。
若只记录“持有10手”,风险计算没有完成。10手标准合约和10手小型合约,不是同一个仓位。
组合对标的价格的近似敏感度可以写成:
\[
\text{Delta}_{\text{futures}}\approx N\times M
\]
其中 \(N\) 是合约数量,\(M\) 是乘数。
如果同时持有股票现货和股票期货,还需要统一单位。例如:
\[
\text{净敞口}=
\text{现货股数}
+
\text{期货张数}\times\text{合约乘数}
\]
空头期货应使用负号。不能把股票市值和期货保证金直接相加后,误判组合规模。保证金是资金占用,不是名义敞口。
合约乘数变化会破坏历史回测的连续性
合约规格发生调整时,历史数据不能简单拼接。
如果乘数、最小变动单位或结算规则发生变化,连续价格序列仍然可能看起来平滑,但盈亏序列已经不连续。尤其是基于点数计算收益的策略,必须在合约元数据层面处理调整。
推荐将价格数据和合约规则分离:
| 数据层 | 内容 |
|---|---|
| 行情层 | 时间、开高低收、成交量、未平仓量 |
| 合约层 | 乘数、最小跳动、到期日、保证金 |
| 交易层 | 开仓、平仓、成交价、手续费、税费 |
| 结算层 | 每日盯市、现金调整、到期结算 |
这比在一个表格里塞入所有字段更容易审计。也更适合滚动合约和多市场组合。
保证金不是最大损失:先计算维持线,再决定仓位
股票期货采用保证金交易。保证金比例低于100%,意味着名义价值高于实际占用资金。
台湾标准股票期货的保证金比例约为13.5%,对应约7.4倍的名义杠杆。这个倍数不是收益承诺,只是敞口与保证金之间的比例关系。
假设:
- 名义价值为 \(V\)。
- 初始保证金比例为 \(m_i\)。
- 维持保证金比例为 \(m_m\)。
- 持仓数量为 \(N\)。
初始保证金近似为:
\[
M_i=N\times V\times m_i
\]
维持保证金近似为:
\[
M_m=N\times V\times m_m
\]
账户权益低于维持保证金后,可能触发追缴通知。若在规定期限内不能补足,持仓可能被强制平仓。具体比例、补缴期限和券商执行细节,需要以交易所及开户机构规则为准。
追缴机制具有离散性
很多回测把保证金当作连续变量。真实交易不是这样。
账户权益随着每日结算和价格变动更新。触发追缴后,处理可能发生在特定时点。强平价格也不一定等于模型计算出的阈值价格,因为实际成交还会受到盘口、跳空和流动性的影响。
账户权益可以近似表示为:
\[
E_t=E_0+\sum_{k=1}^{t}\text{PnL}_k-\text{Fees}_t
\]
其中每日盈亏按结算价格或实际成交价格计算。若发生现金调整、股利调整或合约转仓,还需要加入对应现金流。
仓位设计不应只用“可用资金 ÷ 保证金”计算。那只是最大张数,不是合理张数。
更可执行的约束至少包括:
1. 单笔交易亏损不超过账户权益的固定比例。
2. 极端日波动下,账户仍高于维持保证金。
3. 预估滑点扩大数倍时,仍能完成退出。
4. 同一标的及高度相关标的的总敞口受到限制。
5. 留出追缴资金,不把全部现金配置为初始保证金。
用压力测试替代静态杠杆判断
静态杠杆只回答“现在占用多少保证金”。压力测试回答“价格反向变化时,账户还能运行多久”。
可以设置多组价格冲击:
- 单日反向变动1%。
- 单日反向变动3%。
- 连续多个交易日反向变动。
- 价格跳空,止损无法按理论价格成交。
- 价差扩大,平仓成本增加。
- 相关标的同时向不利方向移动。
压力测试的输出不应只有收益率,还应包括:
- 最低账户权益。
- 最大保证金占用。
- 触发追缴的时间。
- 强平前可承受的价格变化。
- 强平后的剩余现金。
- 滑点扩大后的实际损失。
如果模型没有记录这些变量,风险管理仍然停留在描述层面。
7.4倍杠杆意味着误差也被放大。信号误差、滑点误差、保证金误差都会进入同一条损益曲线。
到期日不是日历字段:转仓会改变交易价格和成本
股票期货具有固定到期日,不能像现货股票一样无限期持有。
个股期货常见季度到期月份为3月、6月、9月和12月。不同交易所的到期规则、最后交易日和转仓安排可能不同。交易者需要在合约生命周期内处理持仓,而不是等系统自动完成。
转仓通常包含两个动作:
1. 平掉临近到期合约。
2. 建立更远到期合约。
这两个动作不一定在同一价格完成,也不一定同时成交。转仓成本包括:
- 两个合约的买卖价差。
- 临近合约和远期合约之间的价差。
- 手续费与交易税费。
- 转仓时的盘口冲击。
- 到期前流动性变化。
- 信号在转仓期间的暴露风险。
连续合约价格不等于可交易价格
研究图表里常用连续合约。它适合观察趋势、波动和价差结构,不等于实际可以直接交易的合约。
将不同月份合约拼接时,至少存在三种处理方式:
- 直接拼接。
- 价差调整。
- 比例调整。
每种方法都会改变历史价格序列。直接拼接可能制造跳空;价差调整会改变绝对价格;比例调整会改变价格的尺度。
如果策略使用均线、布林带或价格突破,连续合约的拼接方法会直接改变信号。若策略使用收益率,仍然需要记录真实转仓价格,否则收益序列可能被人为平滑。
一个合格的回测系统应当保存:
| 时间点 | 旧合约 | 新合约 | 平仓价 | 开仓价 | 价差 | 费用 |
|---|---|---|---|---|---|---|
| 转仓日 | 近月合约 | 远月合约 | 实际成交 | 实际成交 | 新旧合约价差 | 手续费及税费 |
不能只保留一条“连续价格”。连续价格适合分析,实际成交记录才适合结算。
转仓时间取决于流动性,不只取决于剩余天数
最简单的转仓规则是“到期前若干天转仓”。这个规则便于编码,但不一定适合所有合约。
若近月合约临近到期仍然拥有更高成交量和未平仓量,过早转仓可能增加成本。若近月合约流动性快速下降,则等待到最后几天可能造成平仓困难。
转仓模型可使用以下变量:
- 近月与远月成交量比。
- 近月与远月未平仓量比。
- 买卖价差。
- 远近月价差。
- 剩余交易日。
- 策略当前持仓方向。
- 到期结算方式。
这里不需要预测价格方向。只需要识别哪个合约的执行条件更稳定。
转仓规则还必须避免未来函数。当天收盘后才能获得的数据,不能用于当天收盘前的成交决策。若使用未平仓量,必须确认数据发布时间和可用时间。
结算方式决定到期风险:现金结算不能按实物交割理解
选择股票期货时,需要单独确认结算方式。
股票期货并不都支持实物交割。许多主流个股期货采用现金结算。以芝商所个股期货为例,到期时根据标的股票的官方收盘价计算最终盈亏,现金直接计入或扣除账户。
现金结算的结果是:
- 到期不需要交付股票。
- 账户按照最终结算价计算盈亏。
- 到期前仍然必须管理保证金。
- 最终结算价与普通收盘价可能存在规则差异。
- 临近到期时,成交和报价行为可能变化。
实物交割和现金结算不能混为一谈。两者对账户资金、交割准备、到期处理和回测现金流的影响不同。
如果系统把所有个股期货都写成“到期自动换成股票”,结算结果会系统性错误。
除权息调整:价格变化不等于真实亏损
股票期货的标的股票发生除息时,合约通常会根据交易所规则进行契约调整。
典型处理包括:
- 除息日当天,开盘参考价扣除股利影响。
- 未平仓合约价格进行相应调整。
- 买方账户收到等额现金股利调整额。
- 调整通常在除息日进行,不需要像普通股利那样等待数周或数月。
这套机制的目的,是避免因为标的股票除息导致期货合约出现不应有的机械性损益。
回测必须同时调整价格和现金流
除权息处理最容易在回测中被漏掉。
如果只把期货价格向下调整,却没有把股利调整额加入账户现金流,模型会把中性调整误判为多头亏损。反过来,如果价格已经使用调整后序列,又额外加入一次未经核对的股利收入,也会重复计算。
一笔除息事件至少需要记录:
- 标的股票除息日。
- 每股股利或交易所公布的调整参数。
- 合约乘数。
- 持仓方向。
- 未平仓数量。
- 调整前价格。
- 调整后价格。
- 现金调整方向。
- 现金调整金额。
买方和卖方的现金流方向不能写反。股票期货不是股票现货。除息调整由合约规则决定,不应直接套用现货分红逻辑。
除权、并股和拆股也需要独立处理
除息只是调整事件的一种。
标的股票发生拆股、并股、配股、换股或其他公司行动时,合约乘数、履约价格或合约代码可能发生变化。调整方法依交易所规则而定,不能用统一公式覆盖所有事件。
因此,合约数据库需要保留公司行动字段。至少包括:
- 事件类型。
- 生效日期。
- 调整前合约规格。
- 调整后合约规格。
- 调整因子。
- 现金补偿或其他结算金额。
策略研究阶段可以使用调整后的连续序列。交易执行阶段必须使用当时真实有效的合约规格。两层数据不能混用。
交易成本不只是一项手续费
股票期货的显性成本通常低于股票现货。台湾股票期货交易税率为十万分之四,即0.004%。但低税费不等于低总成本。
总交易成本可以拆成:
\[
C_{\text{total}}
=
C_{\text{commission}}
+
C_{\text{tax}}
+
C_{\text{spread}}
+
C_{\text{slippage}}
+
C_{\text{roll}}
+
C_{\text{financing}}
\]
其中融资成本未必以传统借款利息形式出现,但保证金占用会产生资金机会成本。转仓成本则只在合约切换时出现,却可能成为低频策略的主要损耗。
不同券商的佣金和手续费标准会因政策、账户规模和交易量变化。不能在文章或模型中使用一个对所有账户都成立的固定数值。
成本模型需要和策略频率匹配
高频或日内策略需要把买卖价差按成交方向建模。中低频策略则需要关注:
- 持仓期间的保证金占用。
- 到期转仓。
- 合约流动性变化。
- 除权息现金调整。
- 极端行情下的成交偏离。
如果平均每笔交易的预期收益只有几个最小跳动单位,手续费和价差可能直接消除统计优势。即使回测净值曲线平滑,也不能据此判断策略可执行。
建议至少输出以下三组结果:
| 回测版本 | 成交假设 | 用途 |
|---|---|---|
| 理想成交 | 收盘价或中间价 | 检查信号逻辑 |
| 常规成交 | 买卖价差加固定滑点 | 估算普通执行 |
| 压力成交 | 价差扩大、逐档成交、转仓成本上升 | 检查策略生存能力 |
只有第一组盈利,不代表策略有效。第二组接近零,说明成本敏感。第三组大幅亏损,说明策略依赖理想化成交环境。
把检查流程写进系统,而不是写在交易员记忆里
选择股票期货时,最可靠的方法不是人工浏览几个字段,而是建立合约准入规则。
第一步:读取交易所和券商的合约元数据
系统启动时加载:
- 合约代码。
- 标的股票。
- 到期月份。
- 合约乘数。
- 最小变动价位。
- 交易时段。
- 最后交易日。
- 初始保证金。
- 维持保证金。
- 结算方式。
- 公司行动调整规则。
缺少任一关键字段,合约进入观察列表,而不是直接进入交易池。
第二步:建立流动性评分
流动性不应压缩成单一成交量排名。可以建立多个维度:
- 成交量的时间稳定性。
- 未平仓量的连续性。
- 平均买卖价差。
- 盘口深度。
- 订单规模占平均成交量的比例。
- 历史平仓失败次数。
- 临近到期时的流动性变化。
评分的目的不是预测收益,而是排除执行不可行的合约。
第三步:计算名义敞口和保证金占用
对每个候选合约,计算:
\[
V=N\times P\times M
\]
\[
R=\frac{V}{E}
\]
其中:
- \(N\) 为持仓张数。
- \(P\) 为期货价格。
- \(M\) 为合约乘数。
- \(E\) 为账户权益。
- \(R\) 为账户名义敞口倍数。
随后加入压力价格,重新计算账户权益和保证金状态。不要把初始保证金当成风险上限。
第四步:锁定到期处理
每个合约都需要一个明确状态:
- 可开仓。
- 只允许平仓。
- 进入转仓观察。
- 停止新信号。
- 到期结算。
- 已完成转仓。
如果系统没有这些状态,临近到期时可能继续开仓,或者在错误合约上发出平仓指令。
第五步:加入公司行动事件
除息和其他公司行动应进入事件日历。事件发生前后,行情、合约规格和账户现金流需要同时更新。
数据库设计上,建议把公司行动作为独立事件表,而不是直接覆盖原始行情。这样可以保留调整前后的完整审计路径。
一个可执行的股票期货筛选框架
可以将候选合约分为五个模块。
流动性模块
检查成交量、未平仓量、价差和盘口深度。筛掉长时间无成交、报价断裂或订单规模明显过大的合约。
规格模块
确认乘数、最小变动价位和单跳盈亏。将每一手的实际名义价值写入交易日志。
保证金模块
计算初始保证金、维持保证金和压力场景下的账户权益。设置最大张数,而不是直接使用券商允许的最大张数。
生命周期模块
记录最后交易日、转仓窗口和远月合约的流动性。策略不得默认连续持有。
结算模块
确认现金结算或其他结算方式。处理除息、除权、拆股、并股和现金调整。所有调整都必须进入损益和现金流。
这五个模块可以形成自动化准入条件:
if liquidity_pass
and contract_spec_pass
and margin_stress_pass
and expiry_rule_pass
and corporate_action_pass:
allow_trade
else:
reject_contract这里的逻辑不用于预测市场。只用于拒绝结构不完整的交易对象。
股票期货与股票现货:风险结构不同
股票期货通常拥有更低的资金占用和更低的交易税费。它也拥有更复杂的生命周期和更高的保证金敏感度。
| 参数 | 股票现货 | 股票期货 |
|---|---|---|
| 资金占用 | 通常接近持仓市值 | 主要占用保证金 |
| 持有期限 | 没有固定到期日 | 存在最后交易日 |
| 杠杆来源 | 融资融券或现金 | 合约保证金 |
| 除息处理 | 按现货分红流程 | 按合约规则进行现金调整 |
| 结算方式 | 持有股票资产 | 依规则现金结算或交割 |
| 平仓风险 | 通常可按市场价格卖出 | 受到合约流动性和保证金影响 |
| 合约规格 | 以股数为核心 | 乘数、跳动值、到期日共同决定 |
| 转仓需求 | 无 | 需要在到期前处理 |
两者不能只比较手续费。股票期货的成本结构和风险来源不同。低税费可能被滑点、转仓和保证金压力抵消。
常见的五个模型错误
1. 把收盘价当作成交价
这会忽略买卖价差和盘口深度。对低流动性合约尤其危险。
2. 把保证金当作最大损失
保证金只是开仓所需资金的一部分。实际损益按照名义价值和价格变化计算。
3. 把连续合约当作真实合约
连续合约是研究工具。转仓时必须使用两个真实月份合约的实际成交价格。
4. 忽略除息现金调整
只调整价格、不调整现金流,会系统性扭曲收益。
5. 用一个固定成本覆盖所有券商和所有时段
手续费、税费、价差和滑点并不恒定。成本模型至少需要按券商、合约和交易时段拆分。
如果需要进一步理解合约元数据、订单执行与回测引擎之间的关系,可以参考这篇关于量化交易系统架构与回测数据管理的延伸内容。这里不讨论具体策略,只讨论数据如何进入系统。
最终判断:先验证合约,再验证策略
选择股票期货时要检查什么,答案不是一张简单的产品名单。
需要确认的是:这个合约能否成交,成交规模是否可控,单跳盈亏是否匹配账户,保证金压力是否可承受,到期是否有明确转仓路径,除权息是否能正确结算,回测是否使用了真实成本。
顺序不能反过来。
先挑选一只股票,再寻找对应期货合约,容易把方向判断放在结构检查之前。更稳定的流程是先建立合约数据库,再执行流动性筛选、规格校验、保证金压力测试和生命周期管理,最后才把通过筛选的合约交给策略模块。
参数优化也应当保持克制。不要只优化入场周期和止损倍数。应同时测试:
- 滑点扩大后的净收益。
- 转仓窗口变化后的结果。
- 保证金比例变化后的最大回撤。
- 除息事件缺失时的误差。
- 不同连续合约拼接方法下的稳定性。
- 订单规模增加后的成交偏离。
- 流动性下降后的平仓成功率。
一个不依赖理想成交、不依赖无限持仓、不依赖固定保证金的模型,才有继续研究的价值。
股票期货没有预测上的特殊通道。它只是将价格波动、合约乘数、保证金和到期规则组合在一起。交易系统能否长期运行,首先取决于这些规则是否被准确编码。行情方向排在后面。
