教學 進階

量化交易策略撰寫教學:從零開始的 Python 實戰範例(2026完整程式碼)

Sentinel Team · 2026-03-06
量化交易策略撰寫教學:從零開始的 Python 實戰範例(2026完整程式碼)

量化交易策略撰寫教學:從零開始的 Python 實戰範例(2026完整程式碼)

快速導覽: 好策略vs爛策略 | 策略4大要素 | RSI實戰範例 | 策略優化 | 常見問題


Hook:好策略 vs 爛策略的差別

你花了三個月寫出一個「完美」的策略,回測報酬率 300%,興奮地投入實盤——結果一個月虧掉 20%。問題出在哪?

爛策略的特徵:

好策略的特徵:

關鍵洞察: 好的量化策略不是預測未來,而是管理風險與期望值


策略的 4 大要素

一個完整的交易策略必須包含以下四個核心組件:

1. 進場條件(Entry Signal)

決定何時開倉。常見的進場邏輯包括:

2. 出場條件(Exit Signal)

決定何時平倉。包含兩種類型:

3. 濾網條件(Filter)

用於過濾低品質訊號,避免在不利環境交易:

4. 倉位管理(Position Sizing)

決定每筆交易投入多少資金:

策略要素檢查清單

□ 進場條件:明確定義何時進場
□ 出場條件:包含止盈和止損機制
□ 濾網條件:過濾低品質訊號
□ 倉位管理:控制單筆風險
□ 回測驗證:使用樣本外數據測試
□ 成本考量:包含手續費和滑價

實戰範例:RSI 超買超賣策略

以下是一個完整的 RSI 均值回歸策略,使用 Python 與 Sentinel 框架撰寫:

from sentinel import Strategy, Order
import pandas as pd
import numpy as np

class RSIMeanReversion(Strategy):
    """
    RSI 超買超賣均值回歸策略
    邏輯:當 RSI 超買(>70)做空,超賣(<30)做多
    """
    
    def __init__(self):
        super().__init__()
        # 策略參數
        self.rsi_period = 14
        self.overbought = 70
        self.oversold = 30
        self.stop_loss_pct = 0.02  # 2% 止損
        self.take_profit_pct = 0.04  # 4% 止盈
        self.position_size = 0.1  # 每次投入 10% 資金
        
    def calculate_rsi(self, prices, period=14):
        """計算 RSI 指標"""
        deltas = np.diff(prices)
        gains = np.where(deltas > 0, deltas, 0)
        losses = np.where(deltas < 0, -deltas, 0)
        
        avg_gain = np.mean(gains[:period])
        avg_loss = np.mean(losses[:period])
        
        for i in range(period, len(gains)):
            avg_gain = (avg_gain * (period - 1) + gains[i]) / period
            avg_loss = (avg_loss * (period - 1) + losses[i]) / period
        
        rs = avg_gain / avg_loss if avg_loss != 0 else 0
        rsi = 100 - (100 / (1 + rs))
        return rsi
    
    def on_bar(self, data):
        """每根 K 線觸發的邏輯"""
        # 取得歷史價格
        closes = data['close'].values
        if len(closes) < self.rsi_period + 1:
            return
        
        # 計算 RSI
        rsi = self.calculate_rsi(closes, self.rsi_period)
        current_price = closes[-1]
        
        # 趨勢濾網:只在有明確趨勢時交易
        sma_50 = np.mean(closes[-50:])
        sma_200 = np.mean(closes[-200:]) if len(closes) >= 200 else sma_50
        
        # 檢查持倉
        position = self.get_position()
        
        # 進場邏輯
        if position == 0:
            # 超賣 + 多頭趨勢 → 做多
            if rsi < self.oversold and sma_50 > sma_200:
                stop_price = current_price * (1 - self.stop_loss_pct)
                target_price = current_price * (1 + self.take_profit_pct)
                
                self.buy(
                    size=self.position_size,
                    stop_loss=stop_price,
                    take_profit=target_price
                )
            
            # 超買 + 空頭趨勢 → 做空
            elif rsi > self.overbought and sma_50 < sma_200:
                stop_price = current_price * (1 + self.stop_loss_pct)
                target_price = current_price * (1 - self.take_profit_pct)
                
                self.sell(
                    size=self.position_size,
                    stop_loss=stop_price,
                    take_profit=target_price
                )
        
        # 出場邏輯(若未觸及止損止盈,RSI 回歸中線時出場)
        elif position != 0:
            if (position > 0 and rsi > 50) or (position < 0 and rsi < 50):
                self.close_position()

# 策略配置
config = {
    'strategy': RSIMeanReversion,
    'symbols': ['BTCUSDT', 'ETHUSDT'],
    'timeframe': '1h',
    'start_date': '2023-01-01',
    'end_date': '2024-01-01',
    'initial_capital': 10000,
    'commission': 0.001  # 0.1% 手續費
}

策略解析

| 要素 | 實現方式 |

|------|----------|

| 進場 | RSI < 30 且多頭趨勢做多;RSI > 70 且空頭趨勢做空 |

| 出場 | 固定 2% 止損 / 4% 止盈,或 RSI 回歸 50 |

| 濾網 | 50/200 均線趨勢確認,避免逆勢交易 |

| 倉位 | 固定 10% 資金比例,控制單筆風險 |

程式碼重點說明

  1. RSI 計算:使用標準的 Wilder's RSI 計算方法
  2. 趨勢濾網:50/200 均線交叉確認趨勢方向
  3. 風險控制:每筆交易固定 2% 止損,控制最大虧損
  4. 動態出場:RSI 回歸中線時主動出場,鎖定利潤

如何優化策略

1. 參數優化(Walk-Forward Analysis)

避免過度擬合的最佳方法是使用滾動樣本外測試:

# 將數據分為多個時段,每個時段獨立優化與驗證
for train_start, train_end, test_start, test_end in walk_forward_splits:
    best_params = optimize_on_train(train_start, train_end)
    results = test_on_out_of_sample(test_start, test_end, best_params)

2. 加入更多濾網

# 波動率濾網範例
atr = calculate_atr(data, 14)
if atr > atr_threshold:
    # 高波動時減少倉位或暫停交易
    position_size = base_size * 0.5

3. 動態倉位調整

# 根據波動率調整倉位
atr = calculate_atr(data, 14)
volatility_factor = base_atr / atr  # 波動率越高,倉位越小
adjusted_size = base_position_size * volatility_factor

4. 多策略組合

將多個低相關性策略組合,降低整體回撤:

portfolio = StrategyPortfolio([
    ('rsi_mean_reversion', 0.3),
    ('trend_following', 0.4),
    ('breakout', 0.3)
])

優化檢查清單


其他常見策略類型

趨勢跟隨策略

class TrendFollowing(Strategy):
    """雙均線趨勢跟隨策略"""
    
    def on_bar(self, data):
        short_ma = data['close'].rolling(20).mean()
        long_ma = data['close'].rolling(50).mean()
        
        if short_ma > long_ma and not self.position:
            self.buy()
        elif short_ma < long_ma and self.position:
            self.sell()

突破策略

class BreakoutStrategy(Strategy):
    """價格突破策略"""
    
    def on_bar(self, data):
        highest_high = data['high'].rolling(20).max()
        lowest_low = data['low'].rolling(20).min()
        
        if data['close'] > highest_high.shift(1):
            self.buy()
        elif data['close'] < lowest_low.shift(1):
            self.sell()

Sentinel 策略市集介紹

寫好策略只是第一步,Sentinel 策略市集幫你將策略變現:

市集功能

| 功能 | 說明 |

|------|------|

| 策略上架 | 一鍵部署策略到雲端,24/7 自動運行 |

| 訂閱制變現 | 設定月費/季費,讓其他用戶跟單你的策略 |

| 績效展示 | 自動生成專業級回測報告與實盤曲線 |

| 風險評級 | 系統自動評估策略風險等級,幫助用戶選擇 |

| 分潤機制 | 跟單獲利時自動分潤給策略作者 |

為什麼選擇 Sentinel?


結論與行動呼籲

量化交易的本質不是追求完美的預測,而是建立一套可重複、可驗證、可執行的交易系統。

下一步行動:

  1. 立即下載 Sentinel:註冊免費帳號,取得完整策略模板
  2. 複製 RSI 策略:從本文範例開始,在模擬環境測試
  3. 加入 Discord 社群:與 5,000+ 量化交易者交流優化心得
  4. 上架你的策略:當策略通過回測驗證,考慮在市集分享變現

🚀 限時優惠:新用戶註冊即送 30 天 Pro 會員,解鎖進階回測與即時數據!

👉 立即免費試用 Sentinel


常見問題 FAQ

Q1:不會寫程式也能做量化交易嗎?

可以!Sentinel 提供視覺化策略編輯器,透過拖拉介面就能建立策略。但學習基礎 Python 能讓你更靈活地自訂策略。

Q2:RSI 策略適合什麼市場?

RSI 均值回歸策略適合震盪市場,在趨勢明確的牛市或熊市可能表現較差。建議搭配趨勢濾網使用。

Q3:如何知道策略是否過度擬合?

觀察樣本外測試結果,如果訓練集表現很好但測試集表現差,可能就是過度擬合。另外,參數過多也是警訊。

Q4:策略參數要怎麼設定?

建議使用 Walk-Forward Analysis 進行參數優化,避免用肉眼挑選「看起來最好」的參數組合。

Q5:一個策略應該包含多少行程式碼?

好的策略通常簡潔明瞭,核心邏輯可能在 50-200 行之間。過於複雜的策略往往難以維護且容易過度擬合。

Q6:Sentinel 支援哪些程式語言?

主要支援 Python,也提供 TradingView Pine Script 轉換工具。進階用戶可以使用 C++ 開發高效能策略。

Q7:如何測試策略的穩健性?

除了 Walk-Forward Analysis,還可以進行蒙地卡羅模擬(隨機打亂交易順序)、壓力測試(極端市場條件)、以及多市場驗證。

Q8:策略優化後還是虧錢怎麼辦?

首先檢查是否有前視偏差或過度擬合。如果策略邏輯正確但仍虧損,可能是市場環境不適合,建議暫停交易或調整策略類型。


相關閱讀

延伸閱讀