在大宗商品衍生品应用场景中,期货与期权组合策略的风险收益评估是决策的核心依据。传统割裂式的风险分析方法难以准确刻画非线性收益结构与希腊字母敏感性的交互影响。本文从产业套保实务出发,解析期货与期权一体化平台中风险收益评估的核心算法、情景仿真机制与敏感性分析的技术实现。
一、组合收益函数的统一建模
期货与期权组合的收益评估需建立统一的数学模型,处理线性与非线性收益的叠加:
python
from dataclasses import dataclass
from typing import List, Callable
from decimal import Decimal
import numpy as np
@dataclass
class FuturesLeg:
"""期货头寸"""
direction: int # 1=多头, -1=空头
entry_price: float # 入场价格
quantity: float # 数量(吨)
contract_multiplier: int = 10
def payoff(self, spot_price: float) -> float:
"""期货盈亏"""
return self.direction * (spot_price - self.entry_price) * self.quantity
@dataclass
class OptionLeg:
"""期权头寸"""
option_type: str # 'call' or 'put'
direction: int # 1=多头, -1=空头
strike: float # 执行价
premium: float # 权利金
quantity: float # 数量(吨)
def payoff(self, spot_price: float) -> float:
"""期权到期收益"""
if self.option_type == 'call':
intrinsic = max(0, spot_price - self.strike)
else:
intrinsic = max(0, self.strike - spot_price)
return self.direction * (intrinsic - self.premium) * self.quantity
class PortfolioPayoff:
"""组合收益计算器"""
def __init__(self):
self.futures_legs: List[FuturesLeg] = []
self.option_legs: List[OptionLeg] = []
def add_futures(self, leg: FuturesLeg):
self.futures_legs.append(leg)
def add_option(self, leg: OptionLeg):
self.option_legs.append(leg)
def total_payoff(self, spot_price: float) -> float:
"""计算组合总收益"""
futures_pnl = sum(leg.payoff(spot_price) for leg in self.futures_legs)
options_pnl = sum(leg.payoff(spot_price) for leg in self.option_legs)
return futures_pnl + options_pnl
def payoff_curve(self, price_range: np.ndarray) -> np.ndarray:
"""生成收益曲线"""
return np.array([self.total_payoff(p) for p in price_range])
# 构建领口策略示例:期货多头 + 卖出看涨 + 买入看跌
portfolio = PortfolioPayoff()
portfolio.add_futures(FuturesLeg(direction=1, entry_price=4000, quantity=100))
portfolio.add_option(OptionLeg('call', -1, strike=4200, premium=80, quantity=100))
portfolio.add_option(OptionLeg('put', 1, strike=3800, premium=60, quantity=100))
prices = np.linspace(3500, 4500, 100)
payoffs = portfolio.payoff_curve(prices)
print(f"价格3600时组合收益: {portfolio.total_payoff(3600):,.0f}")
print(f"价格4400时组合收益: {portfolio.total_payoff(4400):,.0f}")
该模型支持任意期货与期权腿的组合收益计算与曲线生成。
二、蒙特卡洛情景仿真与概率分布
基于历史波动率或隐含波动率进行蒙特卡洛仿真,评估组合收益的概率分布特征:
python
import numpy as np
from typing import Tuple, Dict
class MonteCarloSimulator:
"""蒙特卡洛情景仿真"""
def __init__(
self,
current_price: float,
volatility: float, # 年化波动率
days_to_expiry: int,
risk_free_rate: float = 0.03
):
self.S0 = current_price
self.sigma = volatility
self.T = days_to_expiry / 252 # 转换为年
self.r = risk_free_rate
def simulate_gbm(self, n_paths: int = 10000) -> np.ndarray:
"""几何布朗运动模拟价格路径"""
dt = self.T
drift = (self.r - 0.5 * self.sigma**2) * dt
diffusion = self.sigma * np.sqrt(dt) * np.random.standard_normal(n_paths)
return self.S0 * np.exp(drift + diffusion)
def evaluate_portfolio(
self,
portfolio: PortfolioPayoff,
n_simulations: int = 10000
) -> Dict[str, float]:
"""评估组合收益分布"""
terminal_prices = self.simulate_gbm(n_simulations)
payoffs = np.array([portfolio.total_payoff(p) for p in terminal_prices])
return {
"期望收益": float(np.mean(payoffs)),
"收益标准差": float(np.std(payoffs)),
"最大收益": float(np.max(payoffs)),
"最大亏损": float(np.min(payoffs)),
"盈利概率": float(np.mean(payoffs > 0)),
"VaR_95": float(np.percentile(payoffs, 5)),
"CVaR_95": float(np.mean(payoffs[payoffs <= np.percentile(payoffs, 5)]))
}
# 执行仿真
simulator = MonteCarloSimulator(
current_price=4000,
volatility=0.25, # 25%年化波动率
days_to_expiry=30
)
results = simulator.evaluate_portfolio(portfolio, n_simulations=50000)
print("\n=== 蒙特卡洛仿真结果 ===")
for metric, value in results.items():
print(f"{metric}: {value:,.2f}")
仿真结果提供期望收益、VaR与CVaR等核心风险指标。
三、希腊字母敏感性分析框架
期权组合的风险管理需持续监控Delta、Gamma、Vega、Theta等希腊字母:
python
from scipy.stats import norm
import numpy as np
class GreeksCalculator:
"""希腊字母计算器(Black-Scholes)"""
@staticmethod
def d1(S: float, K: float, T: float, r: float, sigma: float) -> float:
return (np.log(S/K) + (r + 0.5*sigma**2)*T) / (sigma*np.sqrt(T))
@staticmethod
def d2(S: float, K: float, T: float, r: float, sigma: float) -> float:
return GreeksCalculator.d1(S, K, T, r, sigma) - sigma*np.sqrt(T)
@classmethod
def delta(cls, S: float, K: float, T: float, r: float, sigma: float,
option_type: str) -> float:
"""Delta: 价格敏感性"""
d1 = cls.d1(S, K, T, r, sigma)
if option_type == 'call':
return norm.cdf(d1)
else:
return norm.cdf(d1) - 1
@classmethod
def gamma(cls, S: float, K: float, T: float, r: float, sigma: float) -> float:
"""Gamma: Delta变化率"""
d1 = cls.d1(S, K, T, r, sigma)
return norm.pdf(d1) / (S * sigma * np.sqrt(T))
@classmethod
def vega(cls, S: float, K: float, T: float, r: float, sigma: float) -> float:
"""Vega: 波动率敏感性(每1%波动率变化)"""
d1 = cls.d1(S, K, T, r, sigma)
return S * norm.pdf(d1) * np.sqrt(T) / 100
@classmethod
def theta(cls, S: float, K: float, T: float, r: float, sigma: float,
option_type: str) -> float:
"""Theta: 时间衰减(每日)"""
d1 = cls.d1(S, K, T, r, sigma)
d2 = cls.d2(S, K, T, r, sigma)
term1 = -S * norm.pdf(d1) * sigma / (2 * np.sqrt(T))
if option_type == 'call':
term2 = -r * K * np.exp(-r*T) * norm.cdf(d2)
else:
term2 = r * K * np.exp(-r*T) * norm.cdf(-d2)
return (term1 + term2) / 252 # 转换为日度
# 计算组合希腊字母
S, K_call, K_put = 4000, 4200, 3800
T, r, sigma = 30/252, 0.03, 0.25
greeks = GreeksCalculator()
print("\n=== 组合希腊字母 ===")
# 卖出看涨期权的Greeks(方向取反)
call_delta = -greeks.delta(S, K_call, T, r, sigma, 'call') * 100
call_gamma = -greeks.gamma(S, K_call, T, r, sigma) * 100
call_vega = -greeks.vega(S, K_call, T, r, sigma) * 100
# 买入看跌期权的Greeks
put_delta = greeks.delta(S, K_put, T, r, sigma, 'put') * 100
put_gamma = greeks.gamma(S, K_put, T, r, sigma) * 100
put_vega = greeks.vega(S, K_put, T, r, sigma) * 100
# 期货Delta
futures_delta = 100 # 100吨多头
print(f"组合Delta: {futures_delta + call_delta + put_delta:.2f}")
print(f"组合Gamma: {call_gamma + put_gamma:.4f}")
print(f"组合Vega: {call_vega + put_vega:.2f}")
希腊字母分析帮助识别组合对市场变量的敏感程度,支撑动态对冲决策。
四、压力测试与边界条件校验
风险收益评估需覆盖极端市场情景下的组合表现:
python
from dataclasses import dataclass
from typing import List, Dict
import numpy as np
@dataclass
class StressScenario:
"""压力测试情景"""
name: str
price_shock: float # 价格变动百分比
vol_shock: float # 波动率变动(绝对值)
time_decay_days: int # 时间推移天数
class StressTester:
"""压力测试引擎"""
def __init__(self, portfolio: PortfolioPayoff, base_price: float):
self.portfolio = portfolio
self.base_price = base_price
def run_scenario(self, scenario: StressScenario) -> Dict[str, float]:
"""执行单一压力情景"""
shocked_price = self.base_price * (1 + scenario.price_shock)
payoff = self.portfolio.total_payoff(shocked_price)
return {
"情景名称": scenario.name,
"冲击后价格": shocked_price,
"组合收益": payoff,
"收益变化率": payoff / self.base_price * 100
}
def run_all_scenarios(self, scenarios: List[StressScenario]) -> List[Dict]:
"""执行全部压力情景"""
return [self.run_scenario(s) for s in scenarios]
def sensitivity_matrix(
self,
price_shocks: List[float],
vol_shocks: List[float]
) -> np.ndarray:
"""生成价格-波动率敏感性矩阵"""
matrix = np.zeros((len(price_shocks), len(vol_shocks)))
for i, p_shock in enumerate(price_shocks):
for j, v_shock in enumerate(vol_shocks):
shocked_price = self.base_price * (1 + p_shock)
matrix[i, j] = self.portfolio.total_payoff(shocked_price)
return matrix
# 定义压力测试情景
scenarios = [
StressScenario("基准", 0.0, 0.0, 0),
StressScenario("温和上涨", 0.05, 0.02, 5),
StressScenario("温和下跌", -0.05, 0.02, 5),
StressScenario("剧烈上涨", 0.15, 0.10, 1),
StressScenario("剧烈下跌", -0.15, 0.10, 1),
StressScenario("波动率飙升", 0.0, 0.15, 0),
]
tester = StressTester(portfolio, base_price=4000)
results = tester.run_all_scenarios(scenarios)
print("\n=== 压力测试结果 ===")
for r in results:
print(f"{r['情景名称']}: 价格{r['冲击后价格']:.0f}, 收益{r['组合收益']:,.0f}")
压力测试覆盖价格冲击、波动率飙升等极端情景,为风险限额设定提供依据。
总结
期货与期权一体化平台的风险收益评估需构建统一的组合收益模型,通过蒙特卡洛仿真量化收益分布与尾部风险,借助希腊字母分析监控多维敏感性,并以压力测试覆盖极端市场情景。整套评估框架为产业用户的衍生品策略设计与风险管理提供量化决策支撑。