實戰:選擇權交易系統

將前面的理論整合為一個可運作的交易系統。

🔥 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 建立一個「完整選擇權交易平台」:

  1. 即時股價獲取(使用 yfinance 或 API)
  2. 選擇權定價與 Greeks 計算
  3. 策略訊號產生器
  4. 風險監控儀表板
  5. 交易歷史與績效分析
  6. 使用 Streamlit 或 Gradio 建立 Web 介面

解鎖完整教學內容

本章為付費內容。加入專案即可解鎖超過 5000 字的深度解析,包含 10 個以上神級 Prompt 與真實 Source Code 範例!