📖 還沒接過交易所 API?先看 Python 量化交易入門;不想寫程式的定投選項,看 不用 Code 的量化方法。
一句話結論:DCA(定期定額)就是不管漲跌,固定時間、固定金額買一點,把成本攤平、把「該不該進場」的擇時焦慮拿掉。它最適合長期看好、但管不住手(漲了追、跌了怕)的人。寫成程式的好處是不會忘記扣、不會手軟、還能回測。三鐵則:① 用現貨、絕不開槓桿 ② 小額、固定、別自己亂加碼擇時 ③ 標的選錯,定投也救不了——DCA 攤平成本,不保證獲利。
「我知道要定投,但每次到日子不是忘了、就是看到跌了不敢買、漲了又追高。」這正是 DCA 機器人要解決的——把紀律交給程式。這篇用 Python+ccxt 寫一個定投機器人:到點自動買、自動記帳算平均成本,還用歷史資料幫你回測「定期定額」跟「一次全買」到底哪個好。
沒接過交易所 API?先看 Python 量化交易入門。想了解不用寫程式的定投/網格選項,看 三種不用 Code 的量化方法。本文示範用 BTC,只是示範標的、不是推薦,換成任何你研究過、長期看好的標的都行。
DCA 是什麼?為什麼適合交給程式
DCA(Dollar-Cost Averaging,定期定額)=固定週期、固定金額買入,不擇時。高點買到的少、低點買到的多,長期下來成本被攤平。它的最大敵人不是市場,而是人性——忘記扣、跌時不敢買、漲時忍不住加碼。程式沒有情緒,到點就執行,剛好補上人最弱的那塊。
環境與金鑰安全(現貨只需買入權限)
pip install ccxt python-dotenv schedule。DCA 只買不賣、只碰現貨,API 金鑰只要開「現貨交易」、務必關閉「提現」、綁 IP 白名單、金鑰放 .env 並加進 .gitignore(安全細節見 資金費率套利那篇)。核心買入函式:
import os, ccxt
from dotenv import load_dotenv
load_dotenv() # .env 加進 .gitignore;金鑰只開「現貨交易」、關閉「提現」、綁 IP
ex = ccxt.okx({
"apiKey": os.environ["OKX_API_KEY"],
"secret": os.environ["OKX_API_SECRET"],
"password": os.environ["OKX_API_PASSWORD"],
"options": {"defaultType": "spot"}, # DCA 用現貨,不開槓桿
})
def dca_buy(symbol="BTC/USDT", usdt=100):
"""花固定金額 usdt 市價買入。"""
price = ex.fetch_ticker(symbol)["last"]
amount = usdt / price # 用現價把「金額」換成「數量」
order = ex.create_order(symbol, "market", "buy", amount)
print(f"定投買入 {symbol}:約 {amount:.6f} @ {price}({usdt} USDT)")
return price, amount
# 註:部分交易所市價買入可直接用金額:
# ex.create_market_buy_order_with_cost(symbol, usdt)
# 各所對 market buy 的 amount 定義不同,實作前先看該所文件。
第二步:排程,讓它自己到點買
兩種做法:用 schedule 套件常駐執行,或寫成一次性腳本交給系統 cron。後者更省資源、更穩:
import schedule, time # pip install schedule
# 每週一早上 9 點定投 100 USDT 的 BTC
schedule.every().monday.at("09:00").do(lambda: dca_buy("BTC/USDT", 100))
while True:
schedule.run_pending()
time.sleep(30)
# 或更省事:寫成一次性腳本,交給系統 cron 定時跑
# 0 9 * * 1 /usr/bin/python3 /path/dca.py # 每週一 09:00
第三步:記帳,算出你的平均成本
每次買入寫進 CSV,隨時能算「總投入 ÷ 總幣量」=平均成本,知道自己持倉的真實狀況:
import csv, os, datetime
def log_buy(path, symbol, usdt, amount, price):
new = not os.path.exists(path)
with open(path, "a", newline="") as f:
w = csv.writer(f)
if new:
w.writerow(["time", "symbol", "usdt", "amount", "price"])
w.writerow([datetime.datetime.now().isoformat(timespec="seconds"),
symbol, usdt, amount, price])
def average_cost(path):
"""讀紀錄,算總投入 / 總幣量 = 平均成本。"""
total_usdt = total_coin = 0.0
with open(path) as f:
for row in csv.DictReader(f):
total_usdt += float(row["usdt"])
total_coin += float(row["amount"])
avg = total_usdt / total_coin if total_coin else 0
print(f"累計投入 {total_usdt:.0f} USDT,持有 {total_coin:.6f},平均成本 {avg:.0f}")
return avg
第四步:回測——DCA vs 一次買進,哪個好?
這是最有價值的一段。用歷史 K 線,比較「定期定額」跟「期初一次全買」的結果:
def backtest_dca(symbol="BTC/USDT", timeframe="1w", periods=52, usdt_each=100):
"""用歷史週線回測:定期定額(DCA) vs 期初一次買進(Lump sum)。"""
ohlcv = ex.fetch_ohlcv(symbol, timeframe, limit=periods)
closes = [c[4] for c in ohlcv] # 每根的收盤價
# DCA:每期花固定金額買
dca_coin = sum(usdt_each / p for p in closes)
total_cost = usdt_each * len(closes)
dca_avg = total_cost / dca_coin
# Lump sum:期初一次把同樣總金額買進
lump_coin = total_cost / closes[0]
now = closes[-1]
print(f"投入總額 {total_cost} USDT")
print(f" DCA 平均成本 {dca_avg:,.0f},現值 {dca_coin * now:,.0f}")
print(f" 一次買進 成本 {closes[0]:,.0f},現值 {lump_coin * now:,.0f}")
backtest_dca()
沒有絕對答案:長期上漲的標的,「一次買進」因為更早進場通常贏;震盪或先跌後漲的,「DCA」攤平成本、波動體感更小、也更容易長期堅持。回測能讓你用數據看清取捨,而不是憑感覺。⚠️ 回測是過去,不代表未來。
DCA 的風險:它不是穩賺
- 標的選錯,定投也救不了:DCA 只攤平成本,無法把長期下跌的爛標的變成賺錢。選標的比定投本身更重要。
- 機會成本:強單邊牛市裡,DCA 會輸給一次買進(因為你大部分資金較晚進場)。
- 別偷偷擇時:DCA 的價值來自紀律,一旦你開始「這週先不扣、跌多再多買」,就破功了。
- 手續費:高頻小額定投,手續費佔比會變高,挑低費率/有返佣的所,並別把頻率設得太碎。
- 交易所風險:長期把幣放交易所有平台風險,累積到一定量考慮提到自管錢包。
小額高頻定投,手續費別輕忽
DCA 是現貨、頻繁小額買入,現貨手續費與返佣會累積成可觀差異。四大所現貨費率與邀請碼:
| 交易所 | 現貨 taker | 邀請碼 | 註冊 |
|---|---|---|---|
| OKX | 0.10% | VIP20FEE |
前往 |
| 幣安 | 0.10% | VIP20FEE |
前往 |
| Bybit | 0.075% | SLASHCAPITAL |
前往 |
| Bitget | 0.10% | VIP20FEE |
前往 |
※ 費率與返佣以官方為準,查證 2026-06-28。算長期省多少用 手續費返佣計算機。
常見問題 FAQ
DCA 定投機器人會不會幫我賺錢?
不保證。DCA 是攤平成本、降低擇時風險的紀律工具,不是穩賺策略。能不能賺,取決於你選的標的長期表現。標的選錯,定投一樣會虧;機器人只負責幫你不忘記、不手軟地執行紀律。
DCA 和一次全部買進,哪個比較好?
看行情。長期單邊上漲的標的,一次買進通常勝(更早進場);震盪或先跌後漲的,DCA 攤平成本、波動體感更小、也更好長期堅持。本文的回測程式碼可以用歷史資料幫你比較兩者結果,用數據而非感覺做決定。
定投機器人要用現貨還是合約?
一律用現貨、絕不開槓桿。DCA 的精神是長期持有、平滑成本,合約槓桿與爆倉風險完全違背這個目的。API 金鑰也只要開現貨交易權限、關閉提現。
用 schedule 套件還是系統 cron?
都行。schedule 套件要程式一直常駐執行;系統 cron 把腳本寫成一次性、到點才跑,更省資源也更穩,伺服器重開也不影響。長期無人值守建議用 cron。
新手沒寫過程式能做嗎?
可以從回測那段開始練(不需要 API 金鑰,只抓歷史價格),先看懂 DCA vs 一次買進的差別。真的要自動下單,建議先讀 Python 量化入門、用交易所模擬盤測試,小額開始,理解每一行再放大。
延伸閱讀:加密量化程式碼系列
入門/概念:量化交易零基礎入門、不用寫程式的 3 種量化方法
程式碼實作:Python 量化入門:30 行接 OKX API、資金費率套利 Python 腳本、ccxt 自寫網格機器人
利益揭露:本文部分交易所連結含邀請碼,使用不增加你的成本,有些還有手續費折扣。本文為程式教學整理,程式碼與示範標的僅供學習,不構成投資建議;加密貨幣價格波動大,定期定額不保證獲利,請自行研究標的並評估風險。





發表迴響