前言
哈囉!!!各位讀者好,不知不覺間已經來到 2026 年,距離上一次更新竟然已經過了 8 個月了呢。當時筆者正被微積分、線性代數、機率與統計輪番折磨,進而導致部落格斷更了一段時間。現在回過頭看,當時困擾筆者許久的問題,其實也沒有想像中那麼困難,只是需要多花一點時間去理解與消化罷了。不知道各位讀者是否也已經順利解決當時所面臨的那些難題了呢?
在 2026 年 1 月 12 日這一天,筆者在此祝福各位讀者——
新年快樂、身體健康、闔家平安、事業順利、心想事成!
文章背景說明
本篇文章將用來接續上一篇:〈三種取得比特幣價格數據的實用方法〉。
如果各位讀者曾經使用過該文章中提到的第二種方法,想必會遇到一個問題:
「我想要不同時間級別的 K 線資料,但程式一次只能抓取一種時間級別。」
因此,讀者往往需要手動修改時間級別,反覆執行程式來取得不同週期的 K 線資料。 有些勤奮的讀者,可能真的就這樣一個一個時間級別慢慢抓;而有程式基礎的讀者,則可能會使用 Double For Loop,一次性抓取多個幣種與多個時間範圍的資料。
不過,這些做法多少都會讓程式碼變得冗長,也容易產生大量重複的 CSV 檔案。
本篇要介紹的方法:資料重采樣(Resampling)
在這篇文章中,筆者想要介紹另一種更彈性、也更優雅的方法——
資料重采樣(Resampling Data)。
透過 Python 中的 Pandas 套件,我們可以將既有的 K 線資料,轉換成其他時間級別的 K 線資料。
需要特別注意的是:
👉 重采樣只能轉換成「比原始資料更大的時間級別」。
舉例來說,若你手上有的是 1 小時 K 線資料,那麼你可以將它轉換成 2 小時、4 小時,甚至是日線,但無法反向轉成 30 分鐘或 15 分鐘的 K 線。
實作步驟說明
步驟 1:讀取 CSV 檔案,並將時間欄位設為索引
目的是讓 Pandas 能夠正確辨識時間序列,這也是進行重采樣所必須的資料格式。
import os
import pandas as pd
# ====== file path(建議使用最小時間級別的數據文件)======
file = r"C:\Users\yuanc\BTCUSDT_5m.csv"
df = pd.read_csv(file)
# ====== 時間列處理:設爲索引 ======
df["OpenTime"] = pd.to_datetime(df["OpenTime"])
df = df.sort_values("OpenTime").set_index("OpenTime")

CSV FILE裡的內容
步驟 2:選擇欲重采樣的時間級別
# ====== 你想要的週期 ======
days_weeks_month = ["1d", "1w", "1M"]
hours = ["1h", "2h", "4h", "6h", "8h", "12h"]
minutes = ["3m", "5m", "10m", "15m", "30m"]
timeframes = minutes + hours + days_weeks_month
# 或將所有時間級別裝在同一個LIST裡
# timeframes = ["3m", "5m", "10m", "15m", "30m", "1h", "2h", "4h", "6h", "8h", "12h"]
注意事項:
筆者使用的原始資料為 比特幣 5 分鐘 K 線資料,因此只能將其重采樣成 5 分鐘的倍數(例如 15m、30m、1h)。
因此,需要從程式碼中移除像是 3m、7m 這類無法整除的時間級別。
若讀者有需求產生 7 分鐘 K 線,則必須從 1 分鐘 K 線資料 開始進行重采樣。
步驟 3:定義 OHLCV 聚合規則(核心邏輯)
# ====== 輸出目錄(和源文件同目錄)======
# RESAMPLE後的CSV FILE會跟你原始的CSV FILE在同一處
out_dir = os.path.dirname(file)
symbol = "BTCUSDT"
# ====== resample 規則(OHLCV)======
agg = {
"Open": "first",
"High": "max",
"Low": "min",
"Close": "last",
"Volume": "sum",
"CloseTime": "last", # 這裡保留 closeTime 的“最後一條”
}
這一步是整個重采樣的核心,用來定義:
當多根小週期 K 線合併成一根大週期 K 線時,各欄位該如何計算。
以「6 根 5 分鐘 K 線合成 1 根 30 分鐘 K 線」為例:
- Open(開盤價):取該時間區間第一根 K 線 →
first - High(最高價):取區間內最高的 High →
max - Low(最低價):取區間內最低的 Low →
min - Close(收盤價):取區間內最後一根的 Close →
last - Volume(成交量):區間內所有成交量加總 →
sum - CloseTime:取最後一根 K 線的 CloseTime →
last
以上即為標準的 K 線合成邏輯。
步驟 4:使用 for 迴圈,對所有選定的時間級別進行重采樣
此步驟可讓程式自動產生多個不同週期的 K 線資料。
for tf in timeframes:
# pandas resample 频率:m->min, h->H, d->D, w->W, M->ME
rule = tf
if tf.endswith("m"):
rule = tf[:-1] + "min" # 3min -> 3minute
elif tf.endswith("h"):
rule = tf[:-1] + "h" # 2h -> 2hour
elif tf.endswith("d"):
rule = tf[:-1] + "D" # 1d -> 1Day
elif tf.endswith("w"):
rule = tf[:-1] + "W" # 1w -> 1Week
elif tf.endswith("M"):
rule = tf[:-1] + "ME" # 1ME/1M -> 1Month(月)
# 把 5 分鐘數據聚合成更大週期
out = df.resample(rule, label="left", closed="left").agg(agg).dropna()
步驟 5:將各週期的 K 線資料存成 CSV 檔案
依需求選擇是否儲存,或直接用於後續分析與回測。
# 保存每個週期的 CSV
out = out.reset_index()
out_file = os.path.join(out_dir, f"{symbol}_{tf}.csv")
out.to_csv(out_file, index=False)
print(f"Saved: {out_file} rows={len(out)}")
總結
透過資料重采樣的方法,讀者可以:
- 一次性產生任意所需的時間級別 K 線
- 不再需要儲存大量不同時間週期的 CSV 檔案
- 只需保留「最小時間級別」的原始資料即可
這在進行策略回測、多週期分析時,會特別方便。
感謝各位讀者花時間閱讀本篇文章,希望對你有所幫助。
如果你喜歡這篇文章,歡迎給我一個大大的愛心 ❤️,並追蹤筆者。 我們下篇文章見,掰掰!













