網格交易策略 Python 入門:從零打造自動化交易機器人(含範例程式碼)

本文目錄
  1. 什麼是網格交易策略?Python 實作前你要懂的核心邏輯
  2. 完整的網格狀態管理:買進、賣出與重複交易
  3. Python 網格交易回測教學:用歷史數據驗證策略
  4. 網格交易參數設定技巧:網格數、價格區間、單筆金額怎麼抓?
  5. 網格交易 API 自動下單:串接交易所打造 24 小時機器人
  6. 避雷防坑指南:網格交易最常見的 3 個坑
  7. 網格交易 vs 定期定額:哪種策略更適合你?
  8. 常見問題 FAQ
  9. 結論:網格交易策略 Python 實作,重點在紀律與風控

如果你曾經在盤整行情中眼睜睜看著價格上上下下,卻不知道該進場還是觀望,那你一定對「網格交易策略 Python」這個主題特別有感。網格交易的核心精神,是把「低買高賣」這件反人性的事交給程式機械化執行。這篇文章會帶你從原理、程式骨架、回測方法,一路走到 API 串接與部署,並把常見的踩雷點攤開來講。

風險警告與免責聲明

本文僅供程式教學與策略研究,不構成任何投資建議。加密貨幣與槓桿交易波動極大,可能導致本金全額損失。文中所有數字若標示為「假設範例」皆為示意,並非真實回測或實盤績效。請自行以小額資金驗證,並自負一切交易風險。

什麼是網格交易策略?Python 實作前你要懂的核心邏輯

網格交易(Grid Trading)簡單講就是「在一個價格區間內切成好幾格,低買高賣,賺區間震盪的價差」。

假設範例:BTC 現價 60,000 美元,你設定區間 55,000~65,000、切成 10 格,每格價差 1,000 美元。當價格跌到 59,000 就自動買進,反彈到 60,000 就自動賣出,賺這 1,000 美元的價差,然後不斷重複。

用 Python 實作的好處是「完全客製化」,你可以自己控制:

  • 網格類型:等差網格(每格價差固定)或等比網格(每格漲跌幅固定百分比)
  • 觸發邏輯:用迴圈持續監控價格,搭配條件判斷買賣點
  • 資料來源:透過 ccxt 套件串接交易所即時報價,或用歷史 K 線資料回測

網格價位怎麼算?

np.linspace(low, high, n + 1) 會產生 n+1 個「格線」,把區間切成 n 格。買賣判斷的關鍵是:價格落在哪兩條格線之間。以下是最基礎的網格骨架:

PYTHON
import numpy as np
def build_grid(low: float, high: float, grid_num: int) -> np.ndarray:
"""產生 grid_num + 1 條格線,將 [low, high] 切成 grid_num 格。"""
return np.linspace(low, high, grid_num + 1)
if __name__ == "__main__":
grids = build_grid(55000, 65000, 10)
print(grids)
# array([55000., 56000., 57000., ..., 65000.])

這段只是骨架。實務上你還需要手續費計算、滑點模擬、資金分配邏輯,以及最關鍵的「賣出判斷」——這些會在下一節補齊。

完整的網格狀態管理:買進、賣出與重複交易

原文的骨架只處理買進,而且 position 沒有在賣出後移除,導致同一格永遠無法重複交易。以下是一個邏輯完整、可獨立執行的網格狀態機範例:

PYTHON
import numpy as np
class GridBot:
def __init__(self, low, high, grid_num, order_size, fee_rate=0.001):
self.grids = np.linspace(low, high, grid_num + 1)
self.order_size = order_size      # 每格下單數量(以 base 幣計)
self.fee_rate = fee_rate          # 單邊手續費率,例如 0.1%
self.holdings = {}                # {格線索引: 買入價}
self.cash = 0.0
self.realized_pnl = 0.0
def _locate(self, price):
"""回傳 price 落在第幾格(0 ~ grid_num-1);超出區間回傳 None。"""
if price < self.grids[0] or price >= self.grids[-1]:
return None
return int(np.searchsorted(self.grids, price, side="right") – 1)
def on_price(self, price):
idx = self._locate(price)
if idx is None:
return  # 價格跑出區間,策略暫停,不動作
# 買進:該格尚未持有
if idx not in self.holdings:
cost = price  self.order_size  (1 + self.fee_rate)
self.cash -= cost
self.holdings[idx] = price
print(f"[買進] 格 {idx} 價格 {price:.2f}")
# 賣出:檢查「上一格」是否已持有且現價高於其買入價
prev = idx – 1
if prev in self.holdings and price > self.holdings[prev]:
buy_price = self.holdings.pop(prev)
proceeds = price  self.order_size  (1 – self.fee_rate)
cost = buy_price  self.order_size  (1 + self.fee_rate)
profit = proceeds – cost
self.cash += proceeds
self.realized_pnl += profit
print(f"[賣出] 格 {prev} 買 {buy_price:.2f} → 賣 {price:.2f},損益 {profit:.2f}")
if __name__ == "__main__":
bot = GridBot(low=55000, high=65000, grid_num=10, order_size=0.01)
for p in [59000, 58000, 60000, 57000, 61000]:
bot.on_price(p)
print("已實現損益:", round(bot.realized_pnl, 2))

這段程式碼修正了三個常見錯誤:

1. 賣出邏輯補上,不再是「只買不賣」

2. 賣出後用 pop() 把該格從 holdings 移除,同一格可重複交易

3. 用 np.searchsorted 正確定位價格落在哪一格,並處理「價格跑出區間」的情況

Python 網格交易回測教學:用歷史數據驗證策略

紙上談兵沒有用,任何策略上線前一定要回測。以下為假設範例,用來示範回測程式怎麼寫,數字純屬示意,不是真實績效。

回測程式範例

PYTHON
import numpy as np
import pandas as pd
def backtest_grid(prices: pd.Series, low, high, grid_num,
order_size, fee_rate=0.001):
"""對一串收盤價跑網格策略,回傳權益曲線與交易紀錄。"""
grids = np.linspace(low, high, grid_num + 1)
holdings = {}
cash = 0.0
trades = []
equity_curve = []
for ts, price in prices.items():
if low <= price < high:
idx = int(np.searchsorted(grids, price, side="right") – 1)
if idx not in holdings:
cost = price  order_size  (1 + fee_rate)
cash -= cost
holdings[idx] = price
trades.append((ts, "buy", idx, price))
prev = idx – 1
if prev in holdings and price > holdings[prev]:
buy_price = holdings.pop(prev)
proceeds = price  order_size  (1 – fee_rate)
cash += proceeds
trades.append((ts, "sell", prev, price))
# 以市價估算浮動權益
floating = sum(order_size * price for _ in holdings)
equity_curve.append(cash + floating)
return pd.Series(equity_curve, index=prices.index), trades

假設範例:自行載入你的 OHLC 資料

df = pd.read_csv("ETHUSDT_4h.csv", parse_dates=["time"], index_col="time")

equity, trades = backtest_grid(df["close"], 1600, 2400, 20, 0.5)

回測時一定要記錄的三件事

1. 每筆交易的進出場價格與時間(方便事後檢視邏輯是否正確)

2. 未實現損益(當最後價格落在區間外,帳面浮虧要算清楚)

3. 最大回撤區間,這會直接影響你敢不敢用真錢下去跑

回測指標對照表(假設範例)

下表數字僅為格式示意,不是任何真實回測結果。實際數字請用你手上的資料自行跑出來:

指標 假設範例數值 說明
總交易次數 假設 180 次 依區間與格數而定
勝率 假設 70% 網格在盤整盤通常偏高
總報酬率 假設 20% **務必扣除手續費與滑點後再看**
最大回撤 假設 -12% 價格跌出區間時會擴大
同期買進持有報酬率 假設 8% 用來對照策略是否真的有 alpha

重要提醒:手續費與滑點會大幅侵蝕網格獲利。若單格價差只有 0.3%,來回手續費 0.2% 就吃掉三分之二利潤。回測時務必把 fee_rate 設為交易所真實費率(幣安現貨約 0.1%,可用平台幣折抵)。

在做回測前,建議先用 TradingView 把目標標的的歷史 K 線圖抓出來肉眼看一次,確認過去一年是不是「箱型整理」格局,而不是單邊趨勢——網格策略只在震盪盤有發揮空間。

網格交易參數設定技巧:網格數、價格區間、單筆金額怎麼抓?

這是被問最多次的問題:「網格到底要切幾格?區間怎麼抓?」以下是常見的經驗法則:

1. 價格區間設定

建議抓過去 3~6 個月的歷史高低點,並往外各留 5~10% 緩衝空間。假設範例:某幣種近半年在 100~150 之間震盪,可設區間為 90~165,避免價格稍微突破就跌出網格外。

2. 網格數量

格數越多,單筆獲利越小但交易頻率越高;格數越少則相反。以下為假設情境,非真實實測:

  • 10 格:單格價差較大,但成交次數少
  • 30 格:單格價差小,成交次數多,但手續費成本明顯墊高

由於手續費是「按次」累積,格數越密、交易越頻繁,成本侵蝕越重。一般建議讓單格價差至少是來回手續費的 3 倍以上,再來決定格數。

3. 單筆下單金額

常見錯誤是「平均分配」(總資金 ÷ 格數)。另一種做法是「金字塔式加碼」——越接近區間下緣,單筆買進金額越大。這能提高資金效率,但同時也放大下檔風險,請務必先回測驗證,不要憑感覺套用。

網格交易 API 自動下單:串接交易所打造 24 小時機器人

寫好策略邏輯只是第一步,真正要「全自動」還是得串接交易所 API。ccxt 是 Python 常用套件,支援幣安、OKX、Bybit 等主流交易所,語法統一。

基本流程:

1. 申請 API Key(只開「讀取」與「交易」權限,絕對不要開「提領」)

2. 用 ccxt.binance() 建立連線物件

3. 寫一個迴圈,每隔固定秒數抓一次即時價格

4. 比對價格落在哪個網格區間,觸發買賣單

以下範例把例外處理與速率限制一併補上,並重用前面定義的 GridBot:

PYTHON
import ccxt
import time
import logging
logging.basicConfig(level=logging.INFO)
log = logging.getLogger(__name__)
exchange = ccxt.binance({
"apiKey": "YOUR_KEY",       # 建議改用 os.environ 讀取
"secret": "YOUR_SECRET",
"enableRateLimit": True,    # ccxt 內建速率限制,務必開啟
})
bot = GridBot(low=55000, high=65000, grid_num=10, order_size=0.001)
while True:
try:
ticker = exchange.fetch_ticker("BTC/USDT")
price = ticker["last"]
bot.on_price(price)
except ccxt.NetworkError as e:
log.warning("網路錯誤,稍後重試:%s", e)
except ccxt.ExchangeError as e:
log.error("交易所錯誤:%s", e)
except Exception as e:
log.exception("未預期錯誤:%s", e)
time.sleep(10)

注意:enableRateLimit=True 會讓 ccxt 自動遵守交易所的請求頻率限制,避免被鎖 IP。上面範例只示範讀價與觸發邏輯,實際下單請用 exchange.create_order(),並先用測試網(testnet)驗證。

部署建議放到雲端主機(AWS EC2、GCP 或 VPS 最小規格即可),才能真正 24 小時不間斷運行。

避雷防坑指南:網格交易最常見的 3 個坑

雷區一:區間設定太窄,遇到單邊行情直接失效

常見錯誤是把區間設得只涵蓋過去一個月的高低點。一旦遇到利多消息價格噴出區間外,網格策略完全失效,資金全部卡在低點。

防範建議:區間至少抓半年以上的歷史波動範圍,並準備「趨勢判斷機制」——若價格連續突破區間上緣或下緣超過數日,考慮暫停策略或手動介入。

雷區二:忽略手續費侵蝕

常見錯誤是回測時沒扣手續費,導致回測報酬率看起來很美,實盤卻大打折扣。若格數太密、單格價差只有 0.3%,扣掉來回 0.2% 手續費後利潤幾乎被吃光。

防範建議:回測務必計入 fee_rate 與滑點,單格價差建議至少是手續費成本的 3 倍以上。

雷區三:API 權限設定錯誤,資產安全出問題

常見錯誤是申請 API Key 時圖方便勾選「提領」權限,一旦 Key 外洩,資產可能被轉走。

防範建議:

  • API 權限只開「讀取」與「交易」,絕不開「提領」
  • 定期更換 Key
  • 金鑰用環境變數存放,不要寫死在程式碼中上傳 GitHub
  • 綁定 IP 白名單

網格交易 vs 定期定額:哪種策略更適合你?

比較項目 網格交易 定期定額
適合行情 區間震盪盤 長期上漲趨勢
操作頻率 高(每天可能多次交易) 低(每週或每月一次)
技術門檻 中高(需寫程式或用工具) 低(設定自動扣款即可)
手續費成本 較高 較低
單邊下跌抗性 差(會一直買進被套) 中等(長期攤平成本)
資金效率 高(震盪盤可反覆賺價差) 中等(趨勢盤才有效)

兩種策略並不互斥。常見的做法是「雙軌並行」:核心持倉用定期定額累積,另外撥一部分資金跑網格策略賺短期價差。配置比例請依個人風險承受度決定,切勿以本文數字作為配置依據。

常見問題 FAQ

Q1:網格交易策略需要多少啟動資金才划算?

以幣圈標的來說,建議至少準備等值新台幣數萬元起跳。若格數設在 15~20 格,每格分配的資金才不會因為交易所最低下單量限制而卡關。資金太少,格數勢必得減少,獲利空間也會被壓縮。

Q2:網格交易策略適合股票市場嗎?

理論上可行,但台股與美股都有交易時間限制(不像加密貨幣 24 小時交易),加上手續費結構不同(台股手續費 0.1425%、證交稅 0.3%),需要重新調整格數與單格價差設定。股票波動率通常低於加密貨幣,扣掉手續費後利潤空間可能有限,建議先回測驗證。

Q3:Python 寫網格機器人一定要會很深的程式基礎嗎?

不用。基本 Python 語法(迴圈、條件判斷、函式、類別)加上會用 ccxt 這類現成套件就足夠上手。重點是理解「狀態管理」與「例外處理」,而不是演算法有多難。

結論:網格交易策略 Python 實作,重點在紀律與風控

網格交易策略用 Python 實作,最大的價值在於「把情緒排除在交易之外」,讓程式按照你設定好的邏輯機械化執行。但這篇文章反覆強調的重點是:區間設定要保守、手續費一定要算進成本、API 權限務必謹慎、所有績效數字都要自己回測驗證。策略再漂亮,沒有做好風險管理都是白搭。

如果你想開始動手實作,建議先花時間在 TradingView 上把目標標的的歷史走勢圖研究透徹,確認震盪區間再回頭寫程式碼,會比憑感覺亂設參數有效率得多。動手做 → 回測 → 小資金實盤驗證,這三步驟走完,你就能真正判斷這套策略適不適合放進你的投資組合。

再次提醒:本文所有數字若標示為「假設範例」皆為示意,非真實績效。交易有風險,請自行評估並自負盈虧。