實戰:選擇權交易系統
將前面的理論整合為一個可運作的交易系統。
🔥 Vibe Prompt
「用 Python 建立一個選擇權交易系統:包含即時股價取得、Black-Scholes 定價、Greeks 計算、策略訊號判斷、以及風險監控告警。輸出買賣建議與風險指標。」
系統架構
市場資料 → 定價引擎 → 策略訊號 → 風險控制 → 交易執行
↑ ↓
└────────── 回饋迴圈(績效分析)─────────────┘
完整實作
import math
from scipy.stats import norm
from enum import Enum
from datetime import datetime, timedelta
class Signal(Enum):
STRONG_BUY = 2
BUY = 1
HOLD = 0
SELL = -1
STRONG_SELL = -2
class OptionsTradingSystem:
def __init__(self, risk_limit=0.02):
self.risk_limit = risk_limit # 每筆最大風險 2%
self.positions = []
self.cash = 100000 # 初始資金
def price_option(self, S, K, T, r, sigma, opt_type):
"""Black-Scholes 定價"""
d1 = (math.log(S / K) + (r + 0.5 * sigma ** 2) * T) / (sigma * math.sqrt(T))
d2 = d1 - sigma * math.sqrt(T)
if opt_type == 'call':
return S * norm.cdf(d1) - K * math.exp(-r * T) * norm.cdf(d2)
else:
return K * math.exp(-r * T) * norm.cdf(-d2) - S * norm.cdf(-d1)
def calculate_greeks(self, S, K, T, r, sigma):
"""計算 Greeks"""
d1 = (math.log(S / K) + (r + 0.5 * sigma ** 2) * T) / (sigma * math.sqrt(T))
d2 = d1 - sigma * math.sqrt(T)
return {
'delta': norm.cdf(d1),
'gamma': norm.pdf(d1) / (S * sigma * math.sqrt(T)),
'theta': (-S * norm.pdf(d1) * sigma / (2 * math.sqrt(T))
- r * K * math.exp(-r * T) * norm.cdf(d2)) / 365,
'vega': S * norm.pdf(d1) * math.sqrt(T) / 100
}
def generate_signals(self, S, K, T, r, sigma):
"""產生交易訊號"""
greeks = self.calculate_greeks(S, K, T, r, sigma)
# 基於 Delta 的策略訊號
delta = greeks['delta']
if delta > 0.7 and T < 30/365:
return Signal.STRONG_BUY # 價內且即將到期
elif delta > 0.5:
return Signal.BUY
elif abs(delta) < 0.3:
return Signal.HOLD # 價外,不建議
else:
return Signal.SELL
def check_risk(self, price, amount):
"""風險檢查"""
risk_amount = price * amount
if risk_amount / self.cash > self.risk_limit:
return False, f"風險超限: {risk_amount/self.cash:.1%} > {self.risk_limit:.0%}"
return True, "風險可控"
def execute_trade(self, S, K, T, r, sigma, opt_type, amount):
"""執行交易"""
price = self.price_option(S, K, T, r, sigma, opt_type)
signal = self.generate_signals(S, K, T, r, sigma)
if signal in [Signal.HOLD, Signal.SELL, Signal.STRONG_SELL]:
return {"status": "rejected", "reason": f"訊號: {signal.name}"}
ok, msg = self.check_risk(price, amount)
if not ok:
return {"status": "rejected", "reason": msg}
cost = price * amount * 100 # 一張 = 100 股
self.cash -= cost
trade = {
'time': datetime.now(),
'type': opt_type,
'S': S, 'K': K, 'T': T,
'price': price,
'amount': amount,
'cost': cost
}
self.positions.append(trade)
return {"status": "executed", "trade": trade, "remaining_cash": self.cash}
# 使用範例
system = OptionsTradingSystem(risk_limit=0.05)
result = system.execute_trade(
S=100, K=105, T=45/365, r=0.05, sigma=0.2,
opt_type='call', amount=1
)
print(f"交易結果: {result['status']}")
if result['status'] == 'executed':
trade = result['trade']
print(f"買入價格: ${trade['price']:.2f}")
print(f"花費: ${trade['cost']:.2f}")
print(f"剩餘現金: ${result['remaining_cash']:.2f}")
風險監控儀表板
class RiskDashboard:
def __init__(self, positions):
self.positions = positions
def portfolio_greeks(self):
"""計算投資組合的總 Greeks"""
total = {'delta': 0, 'gamma': 0, 'theta': 0, 'vega': 0}
for pos in self.positions:
greeks = OptionsTradingSystem().calculate_greeks(
pos['S'], pos['K'], pos['T'], 0.05, 0.2
)
for greek in total:
total[greek] += greeks[greek] * pos['amount']
return total
def value_at_risk(self, confidence=0.95, days=1):
"""簡化 VaR 計算"""
import numpy as np
# 假設每日報酬率為常態分布
daily_vol = 0.02 # 2% 每日波動
z_score = norm.ppf(confidence)
var = z_score * daily_vol * self.total_exposure()
return var
def total_exposure(self):
return sum(p['cost'] for p in self.positions)
# 使用
if system.positions:
dashboard = RiskDashboard(system.positions)
print(f"\n投資組合風險報告")
print(f"總曝險: ${dashboard.total_exposure():.2f}")
print(f"95% VaR (1天): ${dashboard.value_at_risk():.2f}")
實戰練習
💡 Vibe Coding 練習:請 AI 建立一個「完整選擇權交易平台」:
- 即時股價獲取(使用 yfinance 或 API)
- 選擇權定價與 Greeks 計算
- 策略訊號產生器
- 風險監控儀表板
- 交易歷史與績效分析
- 使用 Streamlit 或 Gradio 建立 Web 介面