AI交易績效紀錄如何驗證?六項檢查清單
AI交易績效要可驗證,須檢查事前時間戳記、固定基準、交易成本、版本控制、完整部位與足夠資本;單一實盤季度不足以證明成果。
AI 交易績效紀錄具備可驗證性,是指陌生人能根據結果尚未發生前就已存在的紀錄,重建整段績效。網路上公開的內容,極少達到這項標準。以下是讀者約兩分鐘內即可套用的檢查清單,其中四項有市場資料支持:基準、時間戳記、交易成本與樣本長度。
什麼樣的 AI 交易績效紀錄具備可驗證性?
共有六項特徵。每一項都能直接查找,而不是憑主觀判斷。
- 進場紀錄在結果揭曉前公開。 時間戳記必須位於作者無法改寫的地方,例如當時推送的 commit 或券商對帳單。列出過往交易的檔案,只是對過去的說法,而不是交易發生時的紀錄。
- 一個在開始時就指明、之後從未變更的基準。 在比較對象尚未鎖定為特定期間內的特定基金前,「擊敗市場」沒有意義。
- 回報數字已納入成本。 包括佣金、監管費用、放空部位的借券成本,以及進場與出場時支付的 spread。
- 操作手冊有版本控制,而不是事後編輯。 若公開儲存庫支撐這項紀錄,有用的連結應指向標記版本或 commit hash。指向預設分支的連結顯示的是今天的策略,未必是3月實際交易時使用的策略。
- 每個部位與每個帳戶都納入,包含虧損者。 五個運作中的帳戶只公布一個,這就是選擇性呈現。
- 起始資本足以讓成交價合理可信。 幾百美元的名目金額,可能讓部位看似能以公布價格成交,但現實中沒有真正的委託單會以該價格完成成交。
缺少其中一項,並不代表紀錄必然不誠實。這代表它無法驗證;這種情況更常見,對讀者而言也同樣沒有用。
為什麼基準必須事先指明
事後才選定基準,是金融市場中成本最低的優勢。以下比較六檔廣泛型美國指數基金在2026年前六個月的價格變動,僅計算價格變化:
每個數據背後的精確 SQL 語法
WITH rets AS (
SELECT ticker,
round(100 * (toFloat64(argMax(close, window_start))
/ toFloat64(argMin(close, window_start)) - 1), 2) AS return_pct
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('SPY', 'QQQ', 'IWM', 'DIA', 'RSP', 'MDY')
AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2026-01-02')
AND toDate(toTimeZone(window_start, 'America/New_York')) <= 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
)
SELECT ticker,
return_pct,
round(return_pct - min(return_pct) OVER (), 2) AS points_above_worst
FROM rets
ORDER BY return_pct DESCIWM 報酬為 21.12%,DIA 報酬為 8.42%。在相同期間內,6 的最高與最低相差 12.7 個百分點。期間結束後才選擇比較對象,等於直接取得整段差距,而策略不必做任何事即可獲得這項優勢。以上是股息發放前的價格報酬,另一項也應事先說明的衡量規則則是總報酬;月報酬如何計算說明了總報酬的算術方式。
為什麼進場時間戳記就是整項主張的核心
若進場紀錄在行情移動後才出現,那只是對圖表的描述。市場在一個交易時段內的波動幅度足以讓「09:35發布」與「15:55發布」之間的差異,壓過大多數所宣稱的優勢。以下是2026年前六個月,以每個交易時段的第一筆成交價為基準所衡量的這段距離:
每個數據背後的精確 SQL 語法
WITH minute_px AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS session_date,
toTimeZone(window_start, 'America/New_York') AS et,
toFloat64(close) AS px
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2026-01-02')
AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-06-30')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
),
opens AS (
SELECT session_date, argMin(px, et) AS open_px
FROM minute_px
GROUP BY session_date
),
buckets AS (
SELECT session_date,
toStartOfInterval(et, INTERVAL 30 MINUTE) AS bucket,
argMax(px, et) AS bucket_px
FROM minute_px
GROUP BY session_date, bucket
)
SELECT formatDateTime(b.bucket, '%H:%i') AS et_time,
count() AS session_count,
round(quantileDeterministic(0.5)(abs(100 * (b.bucket_px / o.open_px - 1)),
cityHash64(b.session_date)), 3) AS median_abs_move_pct
FROM buckets AS b
INNER JOIN opens AS o ON b.session_date = o.session_date
GROUP BY et_time
ORDER BY et_time在 09:30 ET 區間內,交易時段的中位數收盤距離開盤成交價 0.216%。在 15:30 區間內,中位數距離為 0.415%。代理人在開盤時已知的資訊,幾乎不包含之後的全部價格移動。commit history 或附有日期的公開 feed 能證明先後順序(AI 每日市場研究報告的可信度同樣取決於這項特徵)。股票權益曲線的截圖則完全無法提供這項證明。
數字中必須包含哪些內容
毛報酬描述的是沒有人能實際持有的投資組合。每次進場與出場都必須跨越買賣價差,也就是最佳買價與最佳賣價之間的差距;而這項差距並非每檔標的都相同:
每個數據背後的精確 SQL 語法
SELECT ticker,
round(quantileDeterministic(0.5)(20000 * (toFloat64(ask_price) - toFloat64(bid_price))
/ (toFloat64(ask_price) + toFloat64(bid_price)),
cityHash64(sip_timestamp)), 2) AS median_spread_bps,
round(25000 * quantileDeterministic(0.5)(2 * (toFloat64(ask_price) - toFloat64(bid_price))
/ (toFloat64(ask_price) + toFloat64(bid_price)),
cityHash64(sip_timestamp)), 2) AS round_trip_cost_per_25k_usd
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('SPY', 'AAPL', 'MSFT', 'NVDA', 'KO', 'MSTR')
AND sip_timestamp >= toDateTime('2026-07-15 15:00:00')
AND sip_timestamp < toDateTime('2026-07-15 16:00:00')
AND bid_price > 1
AND ask_price > bid_price
GROUP BY ticker
ORDER BY median_spread_bps DESC在這一小時的午盤期間,對 MSTR 的報價 spread 中位數為 10.08 個基點,對 SPY 則為 0.27。一個基點是百分之一個百分點。在25,000美元部位上,若在進出場各跨越一次 spread,則在清單中 spread 較寬的一端,成本為 25.2 美元;在 spread 較窄的一端,成本為 0.66 美元,且尚未計入佣金。若投資組合每週完整換手一次,一年約須支付這項成本50次;未納入該成本的紀錄,便悄悄把這些美元計入自身績效(交易股票的成本進一步拆解其餘費用)。
實盤結果要經過多久才有意義?
實盤交易一季,只是從一個寬廣分布中抽取一次樣本,而這個分布的寬度可以量化。以下是自2015年1月起,SPY(規模最大的 S&P 500 追蹤基金)所有相互重疊的指定期間視窗,並按百分位數排序:
每個數據背後的精確 SQL 語法
WITH daily AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS session_date,
toFloat64(argMax(close, window_start)) AS close_px
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2015-01-02')
AND toDate(toTimeZone(window_start, 'America/New_York')) <= 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 session_date
),
series AS (
SELECT groupArray(close_px) AS px
FROM (SELECT close_px FROM daily ORDER BY session_date)
),
horizons AS (
SELECT arrayJoin([21, 63, 126, 252]) AS sessions, px
FROM series
),
windows AS (
SELECT sessions,
arrayJoin(arrayMap(i -> (i, 100 * (px[i + sessions] / px[i] - 1)),
range(1, length(px) - sessions + 1))) AS w
FROM horizons
),
measured AS (
SELECT sessions,
w.1 AS window_index,
w.2 AS window_return_pct
FROM windows
)
SELECT multiIf(sessions = 21, '1 month',
sessions = 63, '3 months',
sessions = 126, '6 months',
'12 months') AS holding_period,
count() AS window_count,
round(quantileDeterministic(0.05)(window_return_pct,
cityHash64(window_index * 1000 + sessions)), 1) AS p05_return_pct,
round(quantileDeterministic(0.50)(window_return_pct,
cityHash64(window_index * 1000 + sessions)), 1) AS median_return_pct,
round(quantileDeterministic(0.95)(window_return_pct,
cityHash64(window_index * 1000 + sessions)), 1) AS p95_return_pct,
round(quantileDeterministic(0.95)(window_return_pct,
cityHash64(window_index * 1000 + sessions))
- quantileDeterministic(0.05)(window_return_pct,
cityHash64(window_index * 1000 + sessions)), 1) AS spread_pct,
round(stddevSamp(window_return_pct), 1) AS stdev_pct
FROM measured
GROUP BY sessions
ORDER BY sessions在 2826 個相互重疊的三個月視窗中,單純持有、不進行交易的中位數結果為 3.9%;第5百分位為 -8.8%,第95百分位為 12.2%,兩者相差 21.1 個百分點。任何單季結果只要落在這個區間內,都可能只是持有指數後去度假。若啟動20個代理人、運作一季,再公布其中表現最佳者,展示的數字必然來自類似區間的頂端。
樣本長度的算術結果並不寬容。同一系列的12個月結果,標準差為 13.6 個百分點。要區分真正的優勢與雜訊,大約需要(2 × 波動 ÷ 優勢)²年的實盤結果。在這種波動程度下,假設每年有3個百分點的優勢,需要數十年;即使優勢達到10個百分點,也需要數年而非數月。以上視窗彼此重疊,因此 2826 計算的是視窗數量,而不是相互獨立的樣本數。
25,000美元的真實資金能解決問題嗎?
真實資金會在一個特定方面提升證據品質。紙上交易以沒有交易對手同意的價格成交,也從不會遇到委託遭拒。資金規模25,000美元的帳戶則以即時報價成交,支付真實佣金,並在第三方可稽核的對帳單上留下紀錄;部位規模也足以讓成交結果是正常交易,而非想像中的成交。
但它無法解決樣本問題。以25,000美元交易四個月,仍只是從上述分布中抽取一次樣本;實盤帳戶也可能在回撤後關閉,再以全新的帳戶重新開始,讓紀錄從頭起算。資金規模能讓成交結果可信。只有時間能讓結果具備資訊價值。
四種需要辨識的失敗模式
- 披著績效紀錄外衣的回測。 以過往資料模擬出的結果,只是對過去的假設。前視偏誤說明模擬如何吸收策略當時不可能取得的資訊;最明顯的跡象,是權益曲線早在程式碼出現前數年就已開始。
- 台上只有倖存者。 啟動10個代理人,卻只公布一個。多代理人 AI 交易系統很容易在無意間造成這種結果,因為運作10個變體的框架,也會選出最值得撰寫的那一個。
- 重新開始。 回撤、暫停交易、開立新帳戶,以及從重新開始日期起算的曲線。能解決問題的提問是:請展示第一個帳戶從第一美元開始的完整權益曲線。
- 被改寫的操作手冊。 在交易發生到撰寫報告之間,編輯提示詞與部位上限。LLM 產生的 alpha 因子可以大量生成,因此選擇規則必須在選擇之前公布;否則,紀錄就會變成一個事後挑出恰好有效因子的故事。
常見問題
AI 交易績效紀錄可以驗證嗎?
可以。前提是進場紀錄在結果揭曉前已公開、基準事先固定、成本已納入數字,且所有帳戶都完整呈現。檢查流程是機械式的,幾分鐘即可完成。大多數公開紀錄在第一項就不符合要求。
實盤 AI 交易紀錄必須持續多久?
必須比幾乎所有公開紀錄都更久。本文衡量的視窗中,指數的12個月結果標準差為 13.6 個百分點;要在傳統信心水準下區分溫和的優勢與運氣,至少需要數年,優勢較小時則需要數十年。
25,000美元足以讓 AI 投資組合的結果具備意義嗎?
這筆資金足以讓成交結果真實可信,包括即時報價、真實佣金與可稽核對帳單。但它不足以讓數個月的結果具備統計意義;這取決於經過的時間,而非帳戶規模。
回測與績效紀錄有何不同?
回測是將規則套用於已存在的資料。績效紀錄則是一系列在結果發生前已公開的決策。只有後者能由後續發生的結果加以驗證或推翻,這也是它能成為證據的原因。
為什麼基準的選擇如此重要?
在2026年前六個月,上述六檔指數基金僅以價格計算,期末相差 12.7 個百分點。若在期間結束後才選擇基準,便能在沒有任何策略參與的情況下,取得整段差距。
本頁每個數字都是對市場資料執行的儲存查詢,每個圖表下方均附有 SQL。請在 Strasmore terminal 將相同視窗套用至你自己的日期。