文章裡的每一個數字,以及它從哪裡來
這裡的方法足以讓你用手驗算,或用公開的幣安歷史資料庫重建一份等價的研究。
交易所、交易範圍與期間
只用幣安 USDT 保證金永續合約,交易範圍的選樣日期是2022年6月30日。一檔合約合格的條件,只用當天拿得到的資訊來判斷:它是以 USDT 報價、USDT 計價保證金的永續合約;它的標的是單一幣種,這排除了三檔以指數為標的的合約 DEFIUSDT、 BTCDOMUSDT 與 ALLUSDT;在截至選樣日的十二個月裡,至少有 80% 的日曆日有真實的正成交量,而且它的第一個觀測值落在那個窗口起點的 7 天以內;它在2022年4月、5月、6月至少交易了 55 天;而且它在選樣日仍然活著,最後一個成交量為正的日子落在選樣日的 7 天以內。
最後那條規則存在,是因為單靠季度天數抓不到一檔在排名窗口內就死掉的合約。有四檔合約過了天數門檻,但在選樣日並沒有在交易,因此被排除:ICPUSDT 與 SCUSDT 分別從2022年6月16日與17日起被暫停,而 DODOUSDT 與 AKROUSDT 最後一次交易是2022年5月27日,卻仍在該季拿到 57 天。
合格的合約以2022年4月1日到6月30日的每日報價幣成交量中位數排序,對線性永續合約來說,這本身就已經是以 USDT 計的名目金額。這道篩選留下 105 檔合約,接著凍結的階梯取前 10、25、50、100 名並保持嚴格巢狀,讓最大的那一階之上還留有 5 檔合約的餘裕。
選樣日當天的參考點:第 1 名是 BTCUSDT,每日成交名目金額中位數 $13,246M;第 10 名 XRPUSDT 是 $367M;第 25 名 AAVEUSDT 是 $160M;第 50 名 ENJUSDT 是 $46M;第 100 名 NKNUSDT 是 $16M。
eligible = (
single_coin
& (volume_days_12m / calendar_days_12m >= 0.80)
& (first_obs <= window_start + timedelta(days=7))
& (quarter_trading_days >= 55)
& (last_positive_volume_day >= SELECTION_DATE - timedelta(days=7))
)
ranked = median_daily_quote_volume[eligible].sort_values(ascending=False)
rungs = {n: ranked.index[:n].tolist() for n in (10, 25, 50, 100)}檔案存在不等於有在交易,所以資格、排名,以及一檔合約歷史的終點,全部都用有正成交量來認定,交易所在最後一筆真實成交之後補的資料一律丟棄。在選樣日之後才死掉的合約留在交易範圍裡,並在它最後一根有成交的K線上轉為持有現金。
主代號清單用的是歷史資料庫的索引,而不是即時合約端點,因為即時端點漏掉了 333 檔後來已下市的合約。有兩檔在確認交接處價格連續之後做了代號接續,2024年9月的 MATIC 換成 POL,以及2025年5月的 EOS 換成 A,兩者都是 1:1 的遷移。至於重新計價,也就是名目金額按一個固定倍數改變,像 1000X 那類合約,不算改名,永遠不做接續。
第一個 walk-forward 窗口的樣本內資料涵蓋2022年7月到2023年6月,接著樣本外期間從2023年7月1日跑到2026年7月31日,共 37 個完整且不重疊的日曆月。任何地方用到的每一根K線都在選樣日之後,而選樣日之所以刻意放得這麼晚:如果用2022年6月的流動性選出交易範圍,再拿更早的歷史去估排序統計量,那些估計值就會被當時還不可知的存活結果所制約。
資料與行事曆
兩種頻率,15 分鐘與 1 小時,都在 UTC 時鐘網格上,視為分開的格子,從不合併。K線來自幣安公開歷史資料庫,涵蓋全部 105 檔合約:15 分鐘與 1 小時K線是主要序列,1 分鐘K線只保留用來重建每根K線的最高價與最低價出現的先後順序,資金費率事件按其真實結算時間戳,另有標記價格K線用於資金費率評價。
面板從不對缺漏的K線做價格或報酬的前向填補。一個訊號只會為緊接著的下一根K線建立委託,所以如果那根K線不存在,委託就取消,而不是延到後面某根觀察到的開盤。跨越資料空缺仍持有的部位保持開著,並在後面第一根觀察到的K線上套用跳空障礙規則,之後指標必須重新完成完整的暖身,才可能再觸發訊號。
建好的面板橫跨2022年6月1日到2026年7月31日,在 105 檔合約上帶有 15,015,087 根十五分鐘K線與 3,757,437 根小時K線,以及 481,644 筆資金費率事件。資料關卡涵蓋重複時間戳、單調性、OHLC 恆等式、正價格、以成交量為準的交易歷史、上線日期、空缺數量、一分鐘資料聚合成K線的一致性,以及資金費率對照來源的覆蓋率,全部以零失敗通過,K線空缺中位數為 0.000%。
價差
價差是實測的,而不是從K線估出來的。Corwin-Schultz 高低價估計式在更早的一次建置中被測試並針對這個交易所否決:它對 BTCUSDT 回傳 18.76 個基點,而 bookTicker 報價給的是 0.0330 個基點,高估了 568 倍;它還會隨K線頻率變動,在 15 分鐘K線上給 8.9 個基點,在 1 小時K線上給 18.8 個基點。一個會隨著自身取樣頻率改變的估計式,量到的是波動度。
改為實測的是買賣價跳動,也就是連續兩筆聚合成交之間價格變動絕對值的中位數。成交會在買價與賣價之間交替,所以那個中位數直接還原了價差。在2023年7月15日的 BTCUSDT 上驗證,它回傳 0.0330 個基點,對照 830 萬筆報價更新算出的 bookTicker 基準真值 0.0330 個基點。
# two sampled days per symbol-month, streamed and discarded changes = agg_trades["price"].diff().abs() changes = changes[changes > 0] spread_bps = 1e4 * changes.median() / agg_trades["price"].median()
每個合約月份抽兩天,7 號與 21 號,其中一天缺漏時退到鄰近日期,總計約 10,500 個合約日、大約 26 GB 的串流量。當該合約當天印出的成交少於 500 筆、或非零價格變動少於 100 次時,這個抽樣日不產出估計值,這在 5,146 個合約月份裡發生了 589 次,集中在流動性差的長尾。
沒有估計值的合約月份,採用該合約自己實測價差的第 90 個百分位;而在任何月份都沒有估計值的合約,採用它當月所屬交易範圍階層的第 90 個百分位。兩種備援都刻意放寬,所以缺資料只會讓交易看起來更貴,而 88.6% 的合約月份是直接定價的。
歷史資料庫從2023年5月起發布 bookTicker,涵蓋樣本外期間的大部分,它原本登記為第 16 道關卡下對實測序列的分層驗證。這道關卡在這份研究裡從來沒有跑過,所以基準真值的比較是從更早的建置沿用下來,而不是在這裡重做。
策略庫
八個結構性家族,每個家族十組凍結的數值參數,共 80 個策略,在種子 20260808 之下生成並原封不動沿用:bollinger_reversal、breakout、 mean_reversion、momentum、moving_average_crossover、 rsi_reversal、trend_following 與 volatility_breakout。
在這裡數值參數是策略被凍結的屬性,而不是可調的旋鈕,因為這份研究不做任何參數搜尋,於是這 80 個策略就是重複實驗的單位。
沿用的策略庫,它的實作篩選條件當初是在一個 10 檔標的的面板上校準的,所以在凍結之前先在這個交易範圍上重新量了覆蓋率,讀取活躍度、持有期間、標的覆蓋率與周轉,而從不讀獲利。結果不需要替換:在 1 小時K線上,8,400 組策略-標的配對裡有 8,398 組至少產生一個候選,而在 15 分鐘K線上是 8,400 組全部都有。
訊號、出場與K線內執行
每條規則都只用已完成的K線算出一個落在 {-1, 0, +1} 的條件,而候選只有在該策略的觀點真的反轉時才會觸發。中性的一根K線既不是訊號也不是重設,所以觀點會一直持有,直到反方向觸發為止。
# a candidate exists only on a genuine directional inversion view = condition.replace(0, np.nan).ffill() candidate = view.ne(view.shift(1)) & view.notna() & view.shift(1).notna()
一個部位會在它的停利、停損,或該策略在同一標的上發出反向訊號時平倉,沒有最長持有限制。進場時已知的 Wilder ATR(14) 決定這筆交易整個生命期間的障礙距離,每個策略都是 2.0 ATR 停損與 3.0 ATR 停利。
這組數值來自在焦點階梯的第一個樣本內窗口上、只讀活躍度的校準,讀取持有期間、出場原因組成與部位佔用率,而從不讀獲利。決定它的是佔用率:在整個障礙網格上,前 50 名交易範圍每個策略的平均同時持有部位數,從 1.0 ATR 停損的 1.96 到 3.0 ATR 的 11.33。
最後選中的這組,給出 6.39 的平均同時持有部位數,對上焦點容量 5,在 34.7% 的K線上卡住,同時讓障礙出場仍是多數,占 58.5%,對上 41.5% 的反手,持有期間中位數 6 根K線,且零截斷。
當兩個障礙都落在同一根K線裡時,光靠K線的 OHLC 無法判斷哪一個先成交,所以引擎用 1 分鐘K線把K線內的價格路徑重建為 open → first recorded extreme → second recorded extreme → close 。當最高價與最低價落在同一分鐘、順序無法判定時,停損先執行,這在焦點格上發生於 0.13% 的K線。跳空穿過停損以第一個可得的開盤成交,而跳空穿過停利的成交價不會優於停利價。
# events sharing one bar timestamp resolve in a fixed order
for ts in timestamps:
apply_funding(ts)
apply_gap_barriers(ts)
apply_opposite_signal_exits(ts)
release_slots(ts) # exits always precede entries
allocate_entries(ts) # a slot freed at this open is available now
apply_intrabar_barriers(ts)不變的候選交易流
這是整份研究的脊椎,也是這些執行模式之所以可比的原因。在每個名額資金固定、帳上沒有槓桿、不模擬市場衝擊的前提下,一筆交易的進場價、出場價、出場原因、每單位成本、每單位資金費率與每單位結果,都不取決於這個交易組合還持有什麼。因此每個候選的結果只算一次,之後每一種執行模式、交易範圍大小、容量與排序規則,都只是同一個凍結物件上的排程政策。
每一組策略-標的配對上的每一次訊號轉折都會產生一個候選,與部位佔用率無關、也與任何交易組合無關,並帶著標的、策略、家族、頻率、訊號與進場時間戳、方向、進場價、進場 ATR、宣告的強度值、預先算好的出場時間戳、出場價與出場原因,外加兩種會計單位下的每單位毛損益、手續費、滑價、資金費率與淨結果。
這些結果在每一條手臂、每一種容量與每一階上都逐位元相同,這是一道阻斷級關卡,而不是一個假設。這條流在 1 小時K線上有 3,199,677 個候選,在 15 分鐘上有 13,253,337 個,總計 16,452,374 列結果。
有一項限制直接跟著出現:因為成本在名目金額上是均一的,這個模型不會為同一筆交易對集中持有的帳收得比分散的帳更多,這也正是曝險中性診斷與依尺寸變動的滑價敏感度被登記在案的原因。
成本、資金費率與會計
5 個基點吃單、2 個基點掛單、2 個基點滑價,加上任何穿價成交都要付一半的實測價差。穿價成交付吃單手續費加滑價加半個價差,而停利是掛在簿子上的限價單,付掛單手續費、沒有滑價也沒有價差。停損會穿價,而進場成交一律穿價,成本按成交名目金額的絕對值計算。
def fill_cost(notional, crosses, spread_bps):
fee = TAKER_BPS if crosses else MAKER_BPS
slip = SLIPPAGE_BPS if crosses else 0.0
half_spread = 0.5 * spread_bps if crosses else 0.0
return abs(notional) * (fee + slip + half_spread) / 1e4資金費率使用觀察到的幣安資金費率事件、按其真實結算時間戳,而不是假設一個排程;應該存在卻缺失的資金費率觀測值算資料失敗,而不是當成零;資金費率為正時扣多單、付空單。資金費率是按結算時間戳前一刻所持有的部位計算,所以在該時間戳上的新進場既不付也不收,而抱進來並在該時點出場的部位則會計入。
每一列明細都分開保留毛損益、手續費、滑價、資金費率與淨值,因此恆等式 gross - fee - slippage - funding = net 在列層級與彙總層級都成立於 1e-9 之內,在全部 16,452,374 筆候選結果上對帳到 0.0。
全程維持兩種會計單位,兩者不能互相取代:標準化的 R,也就是以 ATR 標準化、用來衡量挑選品質的每筆交易單位;以及名目金額報酬,用於在部位權重上計算交易組合的損益。閒置資金不生息,報酬是在固定資金上以算術方式計算,沒有任何複利。
手臂與排序規則
所有手臂都使用固定資金、每個持有部位配置相同資金、帳上不使用槓桿,也不複利。沒用到的資金保持閒置,而已持有的部位絕不會被重新縮放,去填補一個空手的或被拒絕的部位。
| 手臂 | 名額 | 權重 | 名額稀缺時如何挑選 |
|---|---|---|---|
| 獨立執行基準 | U,交易範圍大小 | 1/U | 永不稀缺,每個候選都接下 |
| 隨機 | K | 1/K | 在競爭者之間均勻抽籤 |
| 訊號強度 | K | 1/K | 宣告強度最高者 |
| 歷史期望值 | K | 1/K | 該標的樣本內期望值最高者 |
| 資訊比率 | K | 1/K | 該標的樣本內資訊比率最高者 |
容量 K 取 {1, 3, 5, 10},交易範圍大小 U 取 {10, 25, 50, 100}。交易組合一律是單一策略的:一個策略在各標的之間搶自己的名額,而不同家族的訊號從不共用同一個佇列。一條手臂回報的報酬,是這 80 個單策略交易組合的等權重平均,也就是一本 1/80、不使用槓桿的帳。
隨機手臂是 100 個獨立重複的平均,其亂數產生器按格子、窗口與重複編號各自給種子,因為單一次抽籤就是雜訊,絕不會被當成隨機手臂來報告。
訊號強度是按家族宣告、並在執行之前就固定的,一律採用無尺度的單位,這樣高波動度的標的才不會因為和信心無關的理由排在低波動度標的前面,因為原始的百分比距離會夾帶波動度傾斜,是被禁止的。
| 家族 | 強度 |
|---|---|
| bollinger_reversal | 對數價格 z 分數絕對值超出通道寬度的部分,以標準差為單位 |
| breakout | 收盤價超出前一段通道極值與其緩衝的距離,以進場 ATR 為單位 |
| mean_reversion | z 分數絕對值超出進場門檻的部分,以標準差為單位 |
| momentum | 波動度調整後的回顧期報酬超出其門檻的部分 |
| moving_average_crossover | 快線減慢線 EMA 差距的絕對值,以進場 ATR 為單位 |
| rsi_reversal | RSI 超出其界線的距離,以 RSI 點數為單位 |
| trend_following | 波動度調整後的離 EMA 距離超出其門檻的部分 |
| volatility_breakout | 方向性回顧期報酬經波動度調整後的幅度 |
歷史期望值是在獨立執行基準之下、每個已執行候選的樣本內平均淨結果,單位是標準化 R,並要求該策略-標的配對至少有 20 個已執行的樣本內候選。資訊比率把同一個平均除以它自己的樣本內標準差,要求同樣的最低門檻外加標準差不為零。低於任一門檻的標的排在最後,並依凍結的交易範圍索引排序,沒有收縮、沒有匯總、也沒有模型。
stats = (
is_trades.groupby(["strategy", "symbol"])["net_r"]
.agg(["mean", "std", "count"])
.query("count >= 20")
)
expectancy_rank = stats["mean"].sort_values(ascending=False)
info_ratio_rank = (stats["mean"] / stats["std"]).sort_values(ascending=False)這道門檻多常咬住,是在凍結之前只從候選數量量出來的,完全沒有讀獲利。在焦點階梯上,每個策略-窗口可排序的標的數中位數是 50 檔裡的 48 檔,而 79.8% 的策略-窗口至少有 10 檔可排序的標的,不足的部分集中在慢速家族,其中 rsi_reversal 在 33% 的格子裡過得了 20 筆樣本內交易,對照 moving_average_crossover 的 91%。
名額機制
拒絕採用「立即成交否則取消」,所以一個候選只有在它自己的進場K線上才有資格搶名額,如果那一瞬間沒有名額空著,它就被永久拒絕,之後也不會再進場。持續佇列被考慮過並否決了,因為等待過的候選會帶著過時的訊號、以不同的價格進場,那讓它變成另一筆交易,也就破壞了「各手臂之間只有交易挑選不同」這個主張。
在同一個時間戳內,出場與名額釋出會先於進場配置處理,之後競爭的候選按該手臂的排序規則排序,名額依排名順序填滿直到達到容量,平手時取較小的凍結交易範圍索引。佔用數永遠不得超過 K,投入資金永遠不得超過 100%,兩者都以阻斷級關卡強制執行。
當 K 大於或等於 U 時,限制永遠不可能咬住,交易組合手臂必須產出與獨立執行基準完全相同的明細,這是一個正向對照,也是一道阻斷級關卡。
同時到達是次要通道,在 9.8% 的到達事件上有超過一個候選落在同一時間戳,而在 2.4% 的K線上超過五個。所以拒絕大多是因為較早的交易還佔著名額,那才是真實的機制,也是這個設計打算檢驗的那一個。這同時也代表排序作用的切片很窄,因為部位帳已滿造成的拒絕是看不到排序的。
Walk-forward 時程
每個窗口是 12 個日曆月樣本內接 1 個日曆月樣本外,每次前進一個月,所以2023年7月是第一個樣本外月份、2026年7月是最後一個,共 37 個窗口。
樣本內資料只有一個用途,估計各標的的排序統計量,任何地方都沒有樣本內參數搜尋、也沒有樣本內模型挑選。排序在窗口邊界凍結並套用一個樣本外月份,而在某個月的排序之下開出的部位,絕不會在排序滾動時被重新決定。
最長的指標暖身可以使用區塊開始之前的K線,因為那些K線本來就已經知道了,不過暖身列絕不會對被評分的區塊貢獻任何損益。
12 個月的樣本內窗口,會讓排序統計量比更長的窗口更吵,而兩條排序手臂都正是由那些統計量建起來的,所以這個設計傾向於得到「排序贏不過隨機」的結論。這件事是被登記為已知性質,而不是事後才發現的,長窗口敏感度也因此存在。
統計推論
引擎為每一個格子上的每一條手臂,在固定資金上以 UTC 日曆日建構配對的每日淨報酬:1,127 天,分布在 162 個週叢集。重抽是在 UTC 週一到週日的日曆週叢集上進行,月份邊界會把一週切成不同的窗口-週片段,而被抽到的片段裡每個標的、策略與手臂都一起移動。
# paired, week-clustered, common random numbers across arms
rng = np.random.default_rng(20260810)
for b in range(B):
weeks = rng.choice(clusters, size=len(clusters), replace=True)
draw = np.concatenate([day_index[w] for w in weeks])
stat[b] = 1e4 * (ret_a[draw].sum() - ret_b[draw].sum())
point, lo, hi = stat.mean(), *np.percentile(stat, [2.5, 97.5])種子 20260810 之下的配對以週分群 bootstrap 重複建立主要區間,每次重複的統計量都是重抽後的樣本外歷史上的累積算術報酬差。每個次要的雙尾 p 值是較小的 bootstrap 尾端機率的兩倍,並套用有限重複修正 (count + 1) / (B + 1),上限為一,然後才進入 Benjamini-Hochberg。
唯一一個登記在案的主要對比不做多重比較校正。D_cap 與 D_rank 構成一個兩項的 Benjamini-Hochberg 家族,而登記在案那片 288 個對比的曲面則自成一個家族、在自己內部校正,其中 193 個顯著。
一筆實現的交易會把它整個淨結果記在出場當天。持有期間中位數在 1 小時K線上是 6 小時、在 15 分鐘上是 1.2 小時,所以對週分群而言重要的是一筆交易多常跨越週界:1 小時上是 6.1%,15 分鐘上是 1.5%。這少數幾筆會在相鄰叢集之間引入輕微的相依性,因而稍微低估不確定性,而進場日歸屬那個變體把這個效果在 D_cap 上界定在 1.9 bp。
這 37 個月度差值是描述性的診斷,而不是 bootstrap 的單位,它們不是 37 個獨立的策略。Sharpe 可以描述性地報告,但絕不用來挑選配置、排序手臂或決定結論。
零漂移虛無語料庫
第 20 道關卡建立三十個獨立的零漂移語料,每個由 50 個合成標的組成,各自帶著一檔真實合約的實現波動度與價差,並讓每一個都跑過整條焦點格流程:訊號、候選、在真實成本模型下的首次穿越出場、樣本內排序統計量,然後是各手臂。這些序列不含任何形式的報酬可預測性,所以排序手臂在上面賺到的任何東西,都是機制製造出來的。
# volatility and spread preserved on purpose; drift removed
for seed in range(1, 31):
rng = np.random.default_rng(seed)
for symbol in rung_50:
sigma = realised_vol[symbol] # per-bar, from the real panel
log_ret = rng.normal(loc=0.0, scale=sigma, size=n_bars)
synthetic[symbol] = np.exp(np.cumsum(log_ret)) * first_price[symbol]
run_full_pipeline(synthetic, spreads=measured_spreads)保留波動度輪廓正是重點。障礙是按 ATR 縮放的,而成本是名目金額的固定比例,所以低波動度的標的每單位風險付的成本按比例更高。過往期望值與訊號強度都和波動度相關,而波動度有持續性,所以一條排序規則可以在完全不預測任何東西的情況下,挑到每單位風險比較便宜的交易。
一個把波動度拉平的虛無語料庫,會剛好把最值得檢驗的那個機制藏起來。
登記在案的通過條件是:沒有任何排序手臂對隨機的優勢,在各個種子上有 95% 區間完全高於零。訊號強度在三十個完全沒有訊號的語料裡,有 8 個過了這道門檻,所以這道關卡沒過。期望值沒有踩到登記的條件,但它仍落在自己虛無分布的第 87 個百分位,經驗 p 值 0.133,算法是虛無抽樣中大於或等於真實估計值的比例。
把資金投入與挑選分開的診斷
有四項診斷的存在,就是為了阻止一個現金拖累的假象被當成技巧來計分,而且只要有標題數字出現的地方就一定要附上:每個提供的候選對應的淨 R、每單位平均投入資金的淨報酬、機會利用率與拒絕率,以及平均與最大佔用數搭配平均閒置資金。
# denominator is the frozen candidate stream, identical for every arm net_r_per_offered = taken["net_r"].sum() / offered_count binding_rate = rejected_book_full / arrivals # asset-block rejections counted separately
咬住率是候選到達之中,因為帳上已經持有 K 個部位而被拒絕的比例,而由「每個標的只能持有一個部位」規則造成的拒絕另外計算、不算作咬住,並把獨立執行基準納入作為對照組,預期它接近零。
一本容量 1 的帳,在 100 個標的的交易範圍裡一次只持有一個部位,會顯示一個漂亮的 Sharpe,而那幾乎全是閒置現金,所以在固定資金報酬旁邊同時報告投入資金與每個提供候選這兩個衡量指標,就能讓這件事看得見。
焦點格會寫出一份完整的逐部位明細供查驗,涵蓋全部五條手臂共 2,303,532 列。產出這些診斷需要用純 Python 重新實作一次排程器,而它在全部五條手臂與 80 個策略上、每一組接下的交易集合都與 numba 核心一致,零個不一致。
關卡與檢查結果
規格書 21 道阻斷級關卡中有八道已實作。六道樣本外之前的關卡只在樣本內資料上執行,而且全部通過。
| 關卡 | 結果 |
|---|---|
| K ≥ U 時對照獨立執行基準的恆等性 | 最大絕對差 3.47e-17 |
| 先知排序勝過隨機與反向排序 | +12.53 對 -1.29 對 -15.13 |
| 隨機種子穩定性 | 離散度 0.042,約為先知差距的 330 分之一 |
| 投入資金永不超過固定資金 | 最大平均投入 95.2% |
| 每個策略在每個標的上只持有一個部位 | 已強制執行,提供的 40,824 個裡接下 7,244 個 |
| 植入的缺陷會被偵測到 | 恆等式偏離 0.514,而不是零 |
除此之外,numba 的首次穿越走訪在 59,214 個候選上完全重現了凍結的 Python 參考實作,六種出場原因全部被觸發過,而一套對抗性測試又加了 18,672 組比較、零個不一致。第 14 道關卡的排程器一致性以零個不一致通過,而第 20 道關卡沒過,而正是那次失敗撤回了排序的主張。
第一次凍結之後做了兩次檢查,一次針對引擎、一次針對統計,找出四個會改變數字的缺陷:任何在自己進場K線內就平倉的交易都會釋出名額,所以有 7.4% 的交易沒佔到容量;候選只要 ATR 為正就被接受,讓非正規化的風險分母做出大到 1e95 的結果;部位帳在每個月的邊界都被清空;以及平手時用的是 parquet 的列順序,而不是凍結的交易範圍索引。全部修正之後,標題數字從 -10,459 bp 移到 -8,090 bp,所有符號與結論都沒有改變。
還有十三道關卡尚未實作,其中沒有任何一道支撐本文提出的主張。凍結之前的試跑執行是存在的,但被隔離而不是拿來報告,因為規格書原本的關卡順序要求在凍結之前先跑排程器,這必然會暴露樣本外數字。那個順序後來修正了,所以現在每一道依賴排程器的關卡都只在樣本內期間執行。
freeze f575878c86937ab63067aeb98c9b8fb7723e5ec4a0a64c4112cc6f1ce77d8d6b superseded 5ecb4866f65386ddb18358d991b2eb541a3111362a4afb5646caf9cca62eb3b9 superseded bd72f21f1180bb32e2fd17fed02b2a616ffe9f2dfe6f2e91a60385e67de04d39 specification 1f7687a381a256e3f4d6ec0502bc8069705c4d70d0f6b01527107a8f6c0744b0 universe 429fcc435cd8ab32ca98480e6d011ee590ccfd79541b2431af8489128c81a3e5 data manifest add2fc3c1fc460d0eb74ba08d14ae829593f779fcd6ab02dfe890e27e73ab0dd
文章裡的圖是用 公開的結果表格畫的,而內文裡的數字也來自同一批表格。
索取完整的流程程式
這一頁足以讓你用手核對文章裡的每一個數字,或用公開的幣安歷史資料庫重建一份等價的研究,不過生產用的腳本、資料建置、numba 排程器、分析與圖表建置並未附上。來信 daniel@daru.finance ,我會寄給你。

