Skip to content

13.5 永续合约策略

永续合约与交割合约的区别

永续合约(Perpetual Swap)是加密货币独有的衍生品创新,它克服了传统期货的一些固有局限。

名词解释:永续合约

一种没有到期日的期货合约,通过"资金费率"机制定期将合约价格锚定在标的价格附近。永续合约的交易量远超传统交割合约,是加密衍生品市场的主导产品。

维度永续合约交割合约(传统期货)
到期日无到期日有固定到期日
价格锚定资金费率到期日强制收敛
持仓成本资金费率(可能正可能负)主要体现为基差
展期无需展期到期前需展期
基差交易价格 vs 标记价格现货价格 vs 期货价格
流动性通常更高,主战场特定到期日可能更大
PYTHON29 行 · 1007 B
📄此处有展示代码29 行 · 1007 B展开 ▼
python
def compare_perp_vs_futures(spot_price, perp_price, futures_prices, funding_rate, T, r):
    """
    永续合约与交割合约的持仓成本比较
    futures_prices: dict {expiry: price} 不同到期日的期货价格
    """
    comparison = []

    # 永续合约持仓成本(年化)
    perp_cost = funding_rate * 365 * 3  # 每日3次资金费率结算,年化

    comparison.append({
        'type': '永续合约',
        'price': perp_price,
        'basis_bps': (perp_price / spot_price - 1) * 10000,
        'annualized_cost_pct': perp_cost * 100
    })

    # 各到期日交割合约持仓成本
    for expiry, price in futures_prices.items():
        basis = price / spot_price - 1
        annualized_basis = basis / expiry  # 简化年化
        comparison.append({
            'type': f'期货 ({expiry*12:.0f}个月)',
            'price': price,
            'basis_bps': basis * 10000,
            'annualized_cost_pct': annualized_basis * 100
        })

    return comparison
点击展开可浏览运行结果
📘 本段代码定义了 1 个函数/类:函数 `compare_perp_vs_futures`(永续合约与交割合约的持仓成本比较)。该片段为教学展示(未包含独立运行的输入数据),可在实战练习中结合真实数据调用。

资金费率预测与交易

资金费率不仅是被动支付的成本,更可以成为一个主动交易信号

资金费率的预测因子

影响资金费率的关键变量:

  1. 市场情绪溢价:极端贪婪时,杠杆做多拥挤,资金费率飙升
  2. 现货-期货基差:期货溢价越大,资金费率越高
  3. 持仓量变化:未平仓合约增加通常伴随资金费率上升
  4. 价格动量:大幅上涨后的资金费率往往处于高位
PYTHON37 行 · 1.3 KB
📄此处有展示代码37 行 · 1.3 KB展开 ▼
python
def predict_funding_rate(price_momentum_24h, oi_change_24h, basis_bps,
                          sentiment_index, model_weights=None):
    """
    资金费率方向预测模型
    """
    if model_weights is None:
        model_weights = {
            'momentum': 0.30,
            'oi_change': 0.25,
            'basis': 0.20,
            'sentiment': 0.25
        }

    # 各因子标准化到 [-1, 1]
    momentum_z = np.clip(price_momentum_24h / 0.10, -3, 3) / 3  # 假设10%为极限
    oi_z = np.clip(oi_change_24h / 0.20, -3, 3) / 3
    basis_z = np.clip(basis_bps / 50, -3, 3) / 3
    sentiment_z = np.clip((sentiment_index - 50) / 30, -3, 3) / 3

    # 加权预测
    predicted_change = (
        model_weights['momentum'] * momentum_z
        + model_weights['oi_change'] * oi_z
        + model_weights['basis'] * basis_z
        + model_weights['sentiment'] * sentiment_z
    )

    return {
        'predicted_direction': 'higher' if predicted_change > 0.2 else 'lower' if predicted_change < -0.2 else 'stable',
        'confidence': abs(predicted_change),
        'factor_contributions': {
            'momentum': model_weights['momentum'] * momentum_z,
            'oi_change': model_weights['oi_change'] * oi_z,
            'basis': model_weights['basis'] * basis_z,
            'sentiment': model_weights['sentiment'] * sentiment_z
        }
    }
点击展开可浏览运行结果
📘 本段代码定义了 1 个函数/类:函数 `predict_funding_rate`(资金费率方向预测模型)。该片段为教学展示(未包含独立运行的输入数据),可在实战练习中结合真实数据调用。

资金费率交易策略

当预测资金费率将从高位回落时,经典的交易策略是"做多现货 + 做空永续",同时赚取资金费率收入和价差收敛收益:

PYTHON26 行 · 963 B
📄此处有展示代码26 行 · 963 B展开 ▼
python
def funding_rate_mean_reversion_strategy(current_rate, rate_history, threshold=2.0):
    """
    基于资金费率均值回归的交易策略
    """
    mean_rate = np.mean(rate_history)
    std_rate = np.std(rate_history)
    z_score = (current_rate - mean_rate) / std_rate

    if z_score > threshold:
        # 费率极高 → 预期回落 → 做空永续 + 做多现货
        signal = 'SHORT_PERP_LONG_SPOT'
        expected_return = current_rate * 3 * 30  # 30天预期费率收入
    elif z_score < -threshold:
        # 费率极低(负值) → 预期回升 → 做多永续 + 做空现货
        signal = 'LONG_PERP_SHORT_SPOT'
        expected_return = abs(current_rate) * 3 * 30
    else:
        signal = 'NEUTRAL'
        expected_return = 0

    return {
        'z_score': z_score,
        'current_rate_annualized': current_rate * 365 * 3 * 100,  # %
        'signal': signal,
        'expected_return_30d_pct': expected_return * 100
    }
点击展开可浏览运行结果
📘 本段代码定义了 1 个函数/类:函数 `funding_rate_mean_reversion_strategy`(基于资金费率均值回归的交易策略)。该片段为教学展示(未包含独立运行的输入数据),可在实战练习中结合真实数据调用。

跨所价差统计套利

同一币种的永续合约在不同交易所之间可能存在持续的价格差异,这为统计套利提供了机会。

PYTHON32 行 · 1.1 KB
📄此处有展示代码32 行 · 1.1 KB展开 ▼
python
def cross_exchange_stat_arb(exchange_prices, lookback_hours=24):
    """
    跨所永续合约统计套利框架
    exchange_prices: dict {exchange: pd.Series of minute prices}
    """
    import pandas as pd
    prices_df = pd.DataFrame(exchange_prices)

    # 计算跨所价差
    # 以中位数价格为基准
    median_price = prices_df.median(axis=1)
    deviations = prices_df.sub(median_price, axis=0)

    # 滚动统计:每个交易所的价格偏离度
    rolling_mean = deviations.rolling(f'{lookback_hours}h').mean()
    rolling_std = deviations.rolling(f'{lookback_hours}h').std()

    z_scores = (deviations - rolling_mean) / rolling_std

    # 生成交易信号
    signals = pd.DataFrame(index=prices_df.index, columns=prices_df.columns)
    for col in prices_df.columns:
        signals[col] = 0
        signals.loc[z_scores[col] > 2.0, col] = -1  # 价格偏高 → 做空
        signals.loc[z_scores[col] < -2.0, col] = 1   # 价格偏低 → 做多

    return {
        'prices': prices_df,
        'deviations': deviations,
        'z_scores': z_scores,
        'signals': signals
    }
点击展开可浏览运行结果
📘 本段代码定义了 1 个函数/类:函数 `cross_exchange_stat_arb`(跨所永续合约统计套利框架)。该片段为教学展示(未包含独立运行的输入数据),可在实战练习中结合真实数据调用。

跨所套利的关键挑战

  1. 资金分散:需要在每个交易所都有足够的保证金
  2. 滑点差异:不同交易所的深度不同,大量滑点可能侵蚀利润
  3. 提币延迟:如果需要跨所转移资金做市,链上确认时间可能造成机会错失
  4. API 限制:频率限制和稳定性差异

杠杆管理与爆仓风险控制

杠杆管理是永续合约交易的生命线。加密货币的极端波动性使得这一环节尤为关键。

最优杠杆计算

基于 Kelly 准则的杠杆率选择:

$$f^* = \frac{\mu - r}{\sigma^2}$$

其中 μ 为策略预期收益,σ 为收益波动率,r 为无风险利率。

但在加密市场中,还需要考虑资金费率成本和尾部风险,因此实务中通常使用半凯利(Half-Kelly)或更低杠杆。

PYTHON17 行 · 673 B
📄此处有展示代码17 行 · 673 B展开 ▼
python
def optimal_leverage(strategy_sharpe, annual_vol, max_leverage=5.0, safety_factor=0.5):
    """
    基于夏普比和波动率的最优杠杆计算
    safety_factor: 0.5 = 半凯利准则
    """
    # Kelly 最优杠杆
    excess_return = strategy_sharpe * annual_vol  # 超额收益
    kelly_leverage = excess_return / (annual_vol ** 2)

    # 应用安全系数并设置上限
    recommended_leverage = min(kelly_leverage * safety_factor, max_leverage)

    return {
        'kelly_leverage': kelly_leverage,
        'recommended_leverage': recommended_leverage,
        'max_drawdown_estimate': 1 - np.exp(-2 * recommended_leverage)  # 简化的回撤估计
    }
点击展开可浏览运行结果
📘 本段代码定义了 1 个函数/类:函数 `optimal_leverage`(基于夏普比和波动率的最优杠杆计算)。该片段为教学展示(未包含独立运行的输入数据),可在实战练习中结合真实数据调用。

爆仓风险管理

PYTHON63 行 · 2.2 KB
📄此处有展示代码63 行 · 2.2 KB展开 ▼
python
class LiquidationRiskManager:
    """
    永续合约爆仓风险管理器
    """

    def __init__(self, position_value, entry_price, leverage, maintenance_margin_rate=0.005):
        self.position_value = position_value
        self.entry_price = entry_price
        self.leverage = leverage
        self.maintenance_margin_rate = maintenance_margin_rate
        self.margin = position_value / leverage

    def liquidation_price(self, is_long=True):
        """
        计算强平价格
        """
        if is_long:
            liq_price = self.entry_price * (
                1 - (1 / self.leverage - self.maintenance_margin_rate)
            )
        else:
            liq_price = self.entry_price * (
                1 + (1 / self.leverage - self.maintenance_margin_rate)
            )
        return liq_price

    def margin_ratio(self, current_price, is_long=True):
        """
        计算当前保证金率
        """
        if is_long:
            unrealized_pnl = (current_price / self.entry_price - 1) * self.position_value
        else:
            unrealized_pnl = (1 - current_price / self.entry_price) * self.position_value

        current_equity = self.margin + unrealized_pnl
        margin_ratio = current_equity / self.position_value

        return {
            'margin_ratio': margin_ratio,
            'unrealized_pnl': unrealized_pnl,
            'current_equity': current_equity,
            'warning': margin_ratio < 0.05,
            'critical': margin_ratio < 0.02
        }

    def risk_budget_allocation(self, max_risk_per_trade_pct=0.02):
        """
        风险预算分配 —— 控制单笔交易的最大亏损
        """
        # 每笔交易的最大亏损额
        max_loss = self.margin * max_risk_per_trade_pct * 5  # 假设5倍初始风险

        # 对应止损价格
        if self.leverage > 0:
            stop_loss_pct = max_loss / (self.position_value * self.leverage)

        return {
            'max_loss_amount': max_loss,
            'stop_loss_pct_from_entry': stop_loss_pct * 100,
            'stop_loss_price': self.entry_price * (1 - stop_loss_pct),
            'risk_reward_required': 1 / max_risk_per_trade_pct  # 需要的最小盈亏比
        }
点击展开可浏览运行结果
📘 本段代码定义了 1 个函数/类:类 `LiquidationRiskManager`(永续合约爆仓风险管理器)。该片段为教学展示(未包含独立运行的输入数据),可在实战练习中结合真实数据调用。

多层防护体系

PYTHON45 行 · 1.7 KB
📄此处有展示代码45 行 · 1.7 KB展开 ▼
python
def multi_layer_protection(positions, market_data):
    """
    永续合约多层防护监控
    """
    alerts = []

    for pos in positions:
        rm = LiquidationRiskManager(
            pos['value'], pos['entry_price'],
            pos['leverage'], pos.get('maintenance_margin', 0.005)
        )

        liq_price = rm.liquidation_price(pos['is_long'])
        current_price = market_data[pos['symbol']]['price']
        distance_to_liq = abs(current_price - liq_price) / current_price

        # 第1层:预警线(距强平价10%)
        if distance_to_liq < 0.10:
            alerts.append({
                'level': 'WARNING',
                'symbol': pos['symbol'],
                'message': f"距强平价仅 {distance_to_liq*100:.1f}%",
                'action': '考虑减仓或追加保证金'
            })

        # 第2层:危险线(距强平价5%)
        if distance_to_liq < 0.05:
            alerts.append({
                'level': 'DANGER',
                'symbol': pos['symbol'],
                'message': f"距强平价仅 {distance_to_liq*100:.1f}%",
                'action': '立即减仓50%以上'
            })

        # 第3层:极端波动止损
        volatility_24h = market_data[pos['symbol']].get('volatility_24h', 0)
        if volatility_24h > 0.15:  # 日波动超过15%
            alerts.append({
                'level': 'EXTREME_VOL',
                'symbol': pos['symbol'],
                'message': f"24h波动率 {volatility_24h*100:.1f}%",
                'action': '检查所有持仓,收紧止损'
            })

    return sorted(alerts, key=lambda x: {'WARNING': 0, 'DANGER': 1, 'EXTREME_VOL': 2}[x['level']], reverse=True)
点击展开可浏览运行结果
📘 本段代码定义了 1 个函数/类:函数 `multi_layer_protection`(永续合约多层防护监控)。该片段为教学展示(未包含独立运行的输入数据),可在实战练习中结合真实数据调用。

爆仓风险的核心教训:加密市场的黑天鹅事件(如2021年5月19日"519事件"、2022年FTX崩盘、Luna/UST脱锚)在几分钟内就能触发连锁清算。在这种环境下,杠杆是双刃剑——2-3倍杠杆的长期持有可能优于5-10倍杠杆的短期投机。永远为最坏情况留足余地,包括交易所宕机、API 故障、以及极端行情下的滑点放大。