主题切换
13.5 永续合约策略
永续合约与交割合约的区别
永续合约(Perpetual Swap)是加密货币独有的衍生品创新,它克服了传统期货的一些固有局限。
名词解释:永续合约
一种没有到期日的期货合约,通过"资金费率"机制定期将合约价格锚定在标的价格附近。永续合约的交易量远超传统交割合约,是加密衍生品市场的主导产品。
| 维度 | 永续合约 | 交割合约(传统期货) |
|---|---|---|
| 到期日 | 无到期日 | 有固定到期日 |
| 价格锚定 | 资金费率 | 到期日强制收敛 |
| 持仓成本 | 资金费率(可能正可能负) | 主要体现为基差 |
| 展期 | 无需展期 | 到期前需展期 |
| 基差 | 交易价格 vs 标记价格 | 现货价格 vs 期货价格 |
| 流动性 | 通常更高,主战场 | 特定到期日可能更大 |
此处有展示代码展开 ▼
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`(永续合约与交割合约的持仓成本比较)。该片段为教学展示(未包含独立运行的输入数据),可在实战练习中结合真实数据调用。
资金费率预测与交易
资金费率不仅是被动支付的成本,更可以成为一个主动交易信号。
资金费率的预测因子
影响资金费率的关键变量:
- 市场情绪溢价:极端贪婪时,杠杆做多拥挤,资金费率飙升
- 现货-期货基差:期货溢价越大,资金费率越高
- 持仓量变化:未平仓合约增加通常伴随资金费率上升
- 价格动量:大幅上涨后的资金费率往往处于高位
此处有展示代码展开 ▼
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`(资金费率方向预测模型)。该片段为教学展示(未包含独立运行的输入数据),可在实战练习中结合真实数据调用。
资金费率交易策略
当预测资金费率将从高位回落时,经典的交易策略是"做多现货 + 做空永续",同时赚取资金费率收入和价差收敛收益:
此处有展示代码展开 ▼
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`(基于资金费率均值回归的交易策略)。该片段为教学展示(未包含独立运行的输入数据),可在实战练习中结合真实数据调用。
跨所价差统计套利
同一币种的永续合约在不同交易所之间可能存在持续的价格差异,这为统计套利提供了机会。
此处有展示代码展开 ▼
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`(跨所永续合约统计套利框架)。该片段为教学展示(未包含独立运行的输入数据),可在实战练习中结合真实数据调用。
跨所套利的关键挑战:
- 资金分散:需要在每个交易所都有足够的保证金
- 滑点差异:不同交易所的深度不同,大量滑点可能侵蚀利润
- 提币延迟:如果需要跨所转移资金做市,链上确认时间可能造成机会错失
- API 限制:频率限制和稳定性差异
杠杆管理与爆仓风险控制
杠杆管理是永续合约交易的生命线。加密货币的极端波动性使得这一环节尤为关键。
最优杠杆计算
基于 Kelly 准则的杠杆率选择:
$$f^* = \frac{\mu - r}{\sigma^2}$$
其中
但在加密市场中,还需要考虑资金费率成本和尾部风险,因此实务中通常使用半凯利(Half-Kelly)或更低杠杆。
此处有展示代码展开 ▼
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`(基于夏普比和波动率的最优杠杆计算)。该片段为教学展示(未包含独立运行的输入数据),可在实战练习中结合真实数据调用。
爆仓风险管理
此处有展示代码展开 ▼
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`(永续合约爆仓风险管理器)。该片段为教学展示(未包含独立运行的输入数据),可在实战练习中结合真实数据调用。
多层防护体系
此处有展示代码展开 ▼
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 故障、以及极端行情下的滑点放大。