📖 還沒接過交易所 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 自寫網格機器人

計算機爆倉價計算機手續費返佣計算機


利益揭露:本文部分交易所連結含邀請碼,使用不增加你的成本,有些還有手續費折扣。本文為程式教學整理,程式碼與示範標的僅供學習,不構成投資建議;加密貨幣價格波動大,定期定額不保證獲利,請自行研究標的並評估風險。

關於Mr. Slash

「Mr. Slash 的系統性人生」,創立於 2024年,由 Mr. Slash 本人及專業編輯團隊經營的財經內容平台。

我們的宗旨是透過投資、財經、自動化與新興科技等領域的深入解說與應用,幫助讀者打造穩定的被動收入系統。內容涵蓋加密貨幣、股息資產、量化工具、平台分潤等實用策略,協助你用更聰明的方法配置資金、累積資產,走在財務自由的路上,少走冤枉路。

若為商業合作邀稿,將會清楚標註「不代表本站立場」。

商業合作

如果您有任何關於我們團隊或網站內容的疑問或建議,歡迎您前往IG 私訊 @slash.Capital聯繫我們,謝謝!

發表迴響

相關文章

Trending

探索更多來自 Mr. Slash|系統流人生 的內容

立即訂閱即可持續閱讀,還能取得所有封存文章。

繼續閱讀

خصم دائم على الرسوم سجّل في OKX مجاناً ←
Join Mr. Slash