Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor ·

網格交易機器人 誠實分析

網格交易機器人在固定區間內低買高賣,從價格波動獲利。本文以真實數據圖表分析其獲利機制與失效的市場型態,並揭示未平倉部位的潛在風險。

一個網格交易機器人會在固定價格區間內佈下一系列委託單:在當前價格以下的每個階梯放置買單,在當前價格以上的每個階梯放置賣單。每當市場下跌一個階梯,機器人就買入;每當市場回升一個階梯,機器人就賣出先前在較低價位買入的部位。這個機制從價格波動中獲利,但當市場持續朝單一方向偏離網格範圍時,就會累積出未平倉部位。

本文將拆解這個機制的運作原理,然後衡量決定其成敗的兩種市場型態。以下每個圖表都是針對真實美國股票價格的儲存查詢結果,並固定在特定日期,以確保數據可重現。

網格交易機器人的運作方式

網格由三個設定定義:範圍的上限與下限、範圍內的線數,以及每條線的委託數量。線與線之間的間距則由前兩項設定推導得出。

以下用一組為求清晰而選取的整數來舉例,並非來自任何真實報價。假設某股票交易價格接近100美元,操作者設定一個從95美元到105美元的網格,共有十一條線,每條線間隔1美元,每條線委託100股。價格跌至99美元時,掛著的買單成交。價格回升至100美元時,對應的賣單成交,完成一個來回交易,獲得100美元的毛利。兩張委託單隨即重新掛上。在這段時間內,公司基本面沒有任何變化。這個部位只是完成了一次相鄰兩個階梯之間的往返。

在公開流傳的開源專案中,有兩種常見的變體。算術網格以固定的美元金額作為線間距。幾何網格則以固定的百分比作為線間距,這能讓每次來回交易的獲利百分比在較大範圍內保持穩定。文件也區分了中性網格與多頭網格:中性網格起始時無庫存,雙向操作;多頭網格起始時持有庫存,並在價格上漲時賣出。

其報酬型態可以用一句簡單的話來說明。完成一次來回交易的獲利上限,是一個網格階梯減去交易成本。而當價格離開網格範圍時所累積的未平倉部位,則沒有對應的虧損上限。

網格所需的市場型態

網格是透過價格的「移動」來獲利,而非「方向」。兩檔股票在經歷了截然不同的總移動距離後,可能在期末收於相同價格。將每日價格變動的絕對值加總,即為總移動距離。將淨變動除以該距離,即得到效率比,這是衡量價格路徑方向性強弱的標準指標。效率比低,代表價格路徑曲折來回;效率比高,則代表價格直線前進。

查詢累計波動距離 vs 淨變動:十二檔常見股票,2024年1月至2026年6月
每個數據背後的精確 SQL 語法
WITH daily AS (
    SELECT ticker,
           toDate(toTimeZone(window_start, 'America/New_York')) AS dt,
           argMax(toFloat64(close), toTimeZone(window_start, 'America/New_York')) AS c
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('SPY','KO','PG','JNJ','VZ','MO','XOM','JPM','WMT','NVDA','TSLA','NFLX')
      AND toDate(toTimeZone(window_start, 'America/New_York')) BETWEEN toDate('2024-01-02') AND toDate('2026-06-30')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY ticker, dt
),
steps AS (
    SELECT ticker, dt, c,
           c / lagInFrame(c) OVER (PARTITION BY ticker ORDER BY dt) - 1 AS ret
    FROM daily
)
SELECT ticker,
       round(sum(abs(ret)) * 100, 0) AS travel_pct,
       round(abs(argMax(c, dt) / argMin(c, dt) - 1) * 100, 1) AS net_move_pct,
       round(100 * abs(argMax(c, dt) / argMin(c, dt) - 1) / sum(abs(ret)), 1) AS efficiency_pct
FROM steps
WHERE ret > -0.5 AND ret < 0.5
GROUP BY ticker
ORDER BY efficiency_pct
Run this yourself

請同時閱讀第一列和最後一列。PG 的累計每日移動幅度為 527%,期末價格與起點相差 0.9%,效率比為 0.2%。SPY 則位於光譜的另一端,效率比為 14.3%,將 415% 的總移動幅度轉化為 59.2% 的淨變動。將網格階梯放在第一條路徑上,它會反覆觸及自己的階梯。將同樣的網格放在第二條路徑上,則會被市場遠遠拋在後面。

盤整與區間波動是相關但不同的特性。一檔股票可能以非常小的每日漲幅緩慢向上漂移,這仍然會讓網格陷入困境,這也是為什麼在 低波動異常 文獻中研究的股票,並非自動適合用於網格交易的原因之一。

計算來回次數

效率比是其中一個觀察角度。網格的收益取決於一個更具體的因素:價格實際重新觸及某個水準的次數。以每個日曆年的第一個收盤價為基準,並計算收盤價落在該基準價另一側的交易日數,即可得出單一網格線能夠捕捉到的穿越次數。此處以可口可樂(KO)為例,這是一檔大型、流動性高的消費類股,也是網格交易文件常會提到的標的。

查詢KO:每年穿越年初開盤價位次數,依曆年統計,2019年至2025年
每個數據背後的精確 SQL 語法
WITH daily AS (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS dt,
           argMax(toFloat64(close), toTimeZone(window_start, 'America/New_York')) AS c
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'KO'
      AND toDate(toTimeZone(window_start, 'America/New_York')) BETWEEN toDate('2019-01-01') AND toDate('2025-12-31')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY dt
),
anchored AS (
    SELECT toYear(dt) AS year, dt, c,
           first_value(c) OVER (PARTITION BY toYear(dt) ORDER BY dt) AS anchor
    FROM daily
),
sided AS (
    SELECT year, dt, c, anchor,
           if(c >= anchor, 1, 0) AS side,
           row_number() OVER (PARTITION BY year ORDER BY dt) AS rn,
           lagInFrame(if(c >= anchor, 1, 0)) OVER (PARTITION BY year ORDER BY dt) AS prev_side
    FROM anchored
)
SELECT year,
       countIf(rn > 1 AND side != prev_side) AS crossing_count,
       count() AS sessions,
       round((argMax(c, dt) / any(anchor) - 1) * 100, 1) AS net_change_pct
FROM sided
GROUP BY year
ORDER BY year
Run this yourself

2019 年,收盤價穿越其年度開盤價的次數為 8 次,該年共有 252 個交易日,年末收盤價與開盤價相差 17.9%。在 2025 年,穿越次數為 6 次,共有 250 個交易日,淨變動為 13%。單一線、單一股票,而網格所需的「原料」——價格穿越次數——每年可能相差數倍,且無法預先得知來年的次數。

這種變異性正是那個潛在的問題。網格廣告中宣稱的報酬率,通常是以每次完成的來回交易為單位來計算,但來回交易的次數是由市場決定的,而非由設定決定。

網格在何處失效

失效的模式有其特定型態。將網格固定在一個範圍內,然後讓市場離開這個範圍。下圖中,天花板和地板是2024年前二十個交易日的最高與最低收盤價,並在接下來的三十個月中保持不變,同時繪製出追蹤S&P 500指數的ETF的每月收盤價。

查詢以2024年初為基準的網格區間,及標普500指數ETF後續走勢
每個數據背後的精確 SQL 語法
WITH daily AS (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS dt,
           argMax(toFloat64(close), toTimeZone(window_start, 'America/New_York')) AS c
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND toDate(toTimeZone(window_start, 'America/New_York')) BETWEEN toDate('2024-01-02') AND toDate('2026-06-30')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY dt
),
opening_20 AS (
    SELECT c FROM daily ORDER BY dt LIMIT 20
),
band AS (
    SELECT min(c) AS grid_low, max(c) AS grid_high FROM opening_20
),
monthly AS (
    SELECT toStartOfMonth(dt) AS month_start, argMax(c, dt) AS close_px
    FROM daily
    GROUP BY month_start
)
SELECT formatDateTime(monthly.month_start, '%Y-%m') AS month,
       round(monthly.close_px, 2) AS spy_close,
       round(band.grid_high, 2) AS grid_top,
       round(band.grid_low, 2) AS grid_bottom
FROM monthly, band
ORDER BY monthly.month_start
Run this yourself

這個區間範圍從 467.27 美元到 491.26 美元。該序列的第一個月收盤價為 482.92 美元,落在區間內。在總共 30 個月中,最後一個月的收盤價為 746.32 美元,遠高於天花板,圖表顯示價格線離開了區間且再也沒有回來。

讓我們逐步檢視網格階梯在這條路徑上的行為。當價格在區間內上漲時,機器人逐階賣出庫存,每次鎖定一個階梯的利潤。當價格高於天花板時,機器人持有現金並旁觀。之後每一次的上漲,都是操作者不再參與的漲幅,這是較溫和的失敗形式。

嚴重的失敗形式則是鏡像的相反情況。價格跌破地板,機器人在下跌過程中於每個階梯都買入了,因此它現在持有完整的網格庫存,平均成本高於市場價格,每一次進一步的下跌都會擴大未實現虧損。一個曾經能穩定產生小額、明顯成功交易的區間,變成了一個集中的單一部位。網格行銷將此描述為機器人「卡住了」;而在券商的對帳單上,這是一個沒有內建出場機制的開放式虧損。

成本與交易次數成正比

網格會完成許多小額交易,而每一筆交易都需支付完整的來回交易成本:買賣價差,加上適用的手續費或交易所費用。買賣價差 是網格計算中最常被忽略的部分,因為它從不會作為獨立項目出現在對帳單上。

用一個簡單的算術來說明。對於一股100美元、價差為1美分的股票,一個在買入和賣出時都需跨越價差的來回交易,大約會損失2美分,約為名目本金的0.02%。相對於1美元的網格階梯,這約占每次交易毛利的2%。如果將價差擴大至5美分(這在流動性較差的股票上很常見),同樣的來回交易在1美元的毛利中會損失10美分,即占10%。如果為了捕捉更多波動而將網格階梯縮小至10美分,則每次交易的毛利降至10美分,而成本不變,此時5美分的價差就會吞噬掉整筆交易。

這種關係為實用的網格間距設定了一個下限:階梯必須遠大於來回交易成本,而且網格越密集,其產生的收入中就有越大的比例是屬於交易所,而非操作者。

為何回測會美化網格機器人

網格策略往往能產生異常漂亮的回測結果,主要有四個結構性原因。

  1. 事後選擇區間。 在看到數據後才選擇的區間邊界,自然會包含該數據。一個針對某段盤整期所設計的網格,在該段期間內會顯示出很高的勝率。
  2. 未平倉階梯。 在選定的結束日期停止回測時,通常會計算已實現的來回交易,同時寬鬆地處理剩餘庫存。誠實的會計處理方式,是在最後一天按市價標記未平倉部位,並將該損失納入最終結果。
  3. 成交假設。 模擬中的掛單會在價格觸及時成交。但在真實市場中,排隊的委託單不一定會在價格觸及時成交,而未能成交的交易,在快速變動的市場中,往往正是那些有利可圖的交易。
  4. 參數密度。 區間邊界、線數、間距和委託數量,這四個參數作用於同一組價格序列,足以擬合幾乎任何歷史區間。

上述的穿越次數統計,正是對抗這四個原因的有力證據。這些數據僅來自價格歷史,不附加任何設定,而且它們每年都在變化,這是任何參數選擇都無法控制的。任何人在評估一個網格策略的主張時,都可以問一個簡單的問題:這個策略依賴於多少次完成的來回交易?而這個次數是從哪裡來的?在模擬器上進行一段時間的實戰練習,並在結束時按市價標記未平倉階梯,這比一張顯示已實現交易的圖表更能誠實地回答這個問題。

常見問題

網格交易機器人真的能賺錢嗎?

網格在每次完成的來回交易中賺取有上限的利潤,但當價格離開其範圍時,會承擔一個無上限的未平倉部位。在任何時期內,已實現的來回交易利潤是否能超過未平倉部位的虧損,取決於市場在該範圍內波動的程度,這是市場本身的特性,而非軟體的特性。

什麼樣的市場條件適合網格機器人?

這個機制是為價格反覆回到相同水準的市場而設計的:相對於淨變動,總移動距離要高。在上述的十二檔股票圖表中,效率比從曲折來回端的 0.2% 到方向性移動端的 14.3% 不等,而階梯機制只有在第一種情況下才能反覆觸及自己的階梯。

當價格突破網格範圍時會發生什麼事?

當價格高於網格範圍時,機器人已賣出所有庫存並持有現金,而市場繼續上漲,它卻無法參與。當價格低於網格範圍時,機器人持有它在下跌過程中於每個階梯買入的部位,平均成本高於當前價格,每一次進一步的下跌都會擴大這個未實現虧損。

網格交易與定期定額有何不同?

兩者都是在價格下跌時買入更多,但相似之處僅止於此。定期定額 是按固定時間表投入固定金額,沒有出場規則,也沒有上限。網格則是在預先選定的範圍內,根據價格觸發條件進行買賣,一旦價格離開該範圍,其行為就會完全改變。

更密集的網格間距能產生更多收入嗎?

更密集的間距會增加來回交易的次數,但同時降低每次交易的毛利,而來回交易的成本保持不變。一旦超過由價差決定的某個臨界點,增加交易次數反而會從總收入中扣除,而非增加收入。


以上每個數字都來自針對真實股票價格的儲存、版本化查詢;您可以打開任何圖表下方的SQL來檢查,或在Strasmore終端機上,針對您自己的股票清單,測量總移動距離與淨變動的關係。

#grid trading#trading bots#automation#mean reversion#market data