量化交易策略撰寫教學:從零開始的 Python 實戰範例(2026完整程式碼)
快速導覽: 好策略vs爛策略 | 策略4大要素 | RSI實戰範例 | 策略優化 | 常見問題
Hook:好策略 vs 爛策略的差別
你花了三個月寫出一個「完美」的策略,回測報酬率 300%,興奮地投入實盤——結果一個月虧掉 20%。問題出在哪?
爛策略的特徵:
- 過度擬合歷史數據,對未來行情毫無抵抗力
- 只有進場邏輯,沒有明確的出場與風控
- 參數隨意設定,缺乏統計驗證
- 忽視手續費、滑價等交易成本
好策略的特徵:
- 邏輯簡潔,能在不同市場環境存活
- 進場、出場、濾網、倉位管理四位一體
- 經過樣本外測試與壓力測試
- 風險可控,單筆虧損有限
關鍵洞察: 好的量化策略不是預測未來,而是管理風險與期望值。
策略的 4 大要素
一個完整的交易策略必須包含以下四個核心組件:
1. 進場條件(Entry Signal)
決定何時開倉。常見的進場邏輯包括:
- 技術指標交叉(如均線黃金交叉)
- 價格突破(突破前高/前低)
- 統計套利(價差回歸均值)
- 機器學習預測訊號
2. 出場條件(Exit Signal)
決定何時平倉。包含兩種類型:
- 止盈出場:達到目標價位或條件
- 止損出場:觸及風險上限,保護本金
3. 濾網條件(Filter)
用於過濾低品質訊號,避免在不利環境交易:
- 趨勢濾網:只在多頭/空頭趨勢中交易
- 波動率濾網:避開低波動或極端高波動時段
- 時間濾網:避開重大財經事件或盤整時段
4. 倉位管理(Position Sizing)
決定每筆交易投入多少資金:
- 固定金額:每筆交易固定投入 $X
- 固定比例:每次投入總資金的 X%
- 波動率調整:根據 ATR 動態調整倉位
- 凱利公式:根據勝率與賠率計算最佳倉位
策略要素檢查清單
□ 進場條件:明確定義何時進場
□ 出場條件:包含止盈和止損機制
□ 濾網條件:過濾低品質訊號
□ 倉位管理:控制單筆風險
□ 回測驗證:使用樣本外數據測試
□ 成本考量:包含手續費和滑價
實戰範例: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% 資金比例,控制單筆風險 |
程式碼重點說明
- RSI 計算:使用標準的 Wilder's RSI 計算方法
- 趨勢濾網:50/200 均線交叉確認趨勢方向
- 風險控制:每筆交易固定 2% 止損,控制最大虧損
- 動態出場: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 > 閾值時減少倉位
- 相關性濾網:避開與持倉高度相關的訊號
- 流動性濾網:只在成交量充足時交易
# 波動率濾網範例
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)
])
優化檢查清單
- [ ] 使用 Walk-Forward Analysis 避免過度擬合
- [ ] 限制參數數量(建議 3-5 個以內)
- [ ] 加入適當的濾網條件
- [ ] 考慮動態倉位管理
- [ ] 進行壓力測試和蒙地卡羅模擬
- [ ] 驗證策略在不同市場環境的表現
其他常見策略類型
趨勢跟隨策略
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?
- 低門檻:無需管理伺服器,專注策略開發
- 高彈性:支援 Python、C++、TradingView Pine Script
- 真實績效:所有策略經過實盤驗證,拒絕紙上談兵
- 社群驗證:用戶評分與評論,好策略自然浮現
結論與行動呼籲
量化交易的本質不是追求完美的預測,而是建立一套可重複、可驗證、可執行的交易系統。
下一步行動:
- 立即下載 Sentinel:註冊免費帳號,取得完整策略模板
- 複製 RSI 策略:從本文範例開始,在模擬環境測試
- 加入 Discord 社群:與 5,000+ 量化交易者交流優化心得
- 上架你的策略:當策略通過回測驗證,考慮在市集分享變現
🚀 限時優惠:新用戶註冊即送 30 天 Pro 會員,解鎖進階回測與即時數據!
常見問題 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:策略優化後還是虧錢怎麼辦?
首先檢查是否有前視偏差或過度擬合。如果策略邏輯正確但仍虧損,可能是市場環境不適合,建議暫停交易或調整策略類型。
相關閱讀
- 量化交易入門 2026|Python 自動交易策略完整指南(附 5 個範例程式碼)
- 技術指標大全:RSI、MACD、KD 策略回測比較|2026 量化交易指南
- BTC 量化交易策略:2026 年比特幣自動交易完整攻略
- 趨勢 vs 逆勢:兩大經典量化策略回測績效比較
- 回測是什麼?新手必學的 5 個回測技巧,避免 90% 交易策略失敗(2026完整指南)
- Python 程式交易入門:50 行程式碼打造自動下單機器人|2026 完整教學