通用策略文件格式

目前支援 JSON 策略設定檔,上傳後會使用系統內建 OHLCV 資料執行回測。

回到回測頁

上傳規範

檔案類型.json,UTF-8 或 UTF-8 BOM 皆可。
大小限制單一策略文件最多 200 KB。
策略引擎支援 strategy.type = "rule_based" 與既有 strategy.name = "trend_following"
策略原始週期上傳時選擇此策略參數原本對應的 K 線週期,例如 5m1d
週期切換勾選「依週期縮放參數」時,系統會依目標週期換算快慢線、量能、ATR 與最多持有根數。

必要區塊

  • run_name:策略顯示名稱與儲存檔名來源。
  • backtest:資金、成本、日期範圍。
  • strategy:策略類型、方向、進場規則、出場規則。
  • risk:單筆風險、倉位與停損。
  • verdict:裁決門檻與 bootstrap 設定。

建議原則

  • 通用策略優先使用 strategy.type: "rule_based"
  • all 表示所有條件都要成立,any 表示任一條件成立。
  • 均線交叉用 crosses_above / crosses_below,例如 EMA20 上穿 EMA50。
  • 複合條件可使用 expression 運算樹,例如 close > previous_close + ATR * 2
  • 突破前 N 根高點時,用 highest 搭配 shift: 1,避免把目前這根 K 棒納入比較。
  • 日線策略可用 max_holding_days 表示天數;日內策略在系統中代表 K 棒數。
  • 加密貨幣通常使用 allow_fractional_shares: true
  • 先用保守成本,例如手續費 0.001 與滑價 8 bps。

欄位說明

backtest.initial_cash期初資金,數字。
backtest.commission_rate單邊手續費率,例如 0.001 代表 0.1%。
backtest.commission_per_unit每單位固定手續費;期貨可用來表示每口固定費用。
backtest.transaction_tax_rate交易稅率,平倉時計入成本;不需要時填 0 或省略。
backtest.slippage_bps滑價,bps 單位;8 代表 0.08%。
backtest.start_datenullYYYY-MM-DD
backtest.trade_start_datenullYYYY-MM-DD;可用更早資料暖機指標,但只從此日期後開始交易。
backtest.end_date"latest"YYYY-MM-DD
strategy.type通用規則策略請填 "rule_based"
strategy.side"long""short""both"both 代表多空雙向。
strategy.entry / exit單向策略使用這兩個欄位,可使用 allany 或單一條件。
long_entry / long_exitside: "both" 時的做多進出場規則。
short_entry / short_exitside: "both" 時的做空進出場規則。
condition.left / right可填價格欄位、數字或指標物件。
condition.operator支援 >>=<<===!=crosses_abovecrosses_below
indicator支援 smaemarsiatrmacdbollingerrocmomentumvolume_smavolume_emahighestlowest
macd.component支援 linesignalhistogram;可設定 fast_windowslow_windowsignal_window
bollinger.band支援 uppermiddlelower;可設定 windowstddev
expression支援 {"op":"add","args":[...]}subtractmultiplydivide
source支援 openhighlowclosevolume
shift指標往前位移 N 根。突破前 20 根高點可用 {"indicator":"highest","source":"high","window":20,"shift":1}
strategy.atr_windowATR 計算視窗,整數。
risk.risk_per_trade_pct單筆最大風險占資金比例,例如 0.01
risk.max_position_pct單一部位最大資金比例,例如 0.2
risk.max_open_positions全策略同一時間最多可持有的未平倉單數;設為 1 時,平倉前不會再建立第二張單。
risk.max_position_units單一部位的數量上限;期貨設為 1 即限制每筆最多一口。
backtest.position_accountingcash 為現貨資金交割,futures 為保證金與逐點損益模式。
backtest.contract_multiplier每一價格點對應的金額;臺股期貨 TX 為 200
backtest.margin_per_unit每口原始保證金;會限制可建立的期貨口數。
risk.atr_stop_multiple通用初始停損 ATR 倍數。
risk.long_atr_stop_multiple多單專用初始停損 ATR 倍數;未設定時使用 atr_stop_multiple
risk.short_atr_stop_multiple空單專用初始停損 ATR 倍數;未設定時使用 atr_stop_multiple
risk.trailing_stop_atr_multiple移動停損 ATR 倍數;可用 null 關閉。
risk.take_profit_pct固定百分比止盈;例如 0.3 代表獲利 30% 觸發止盈,null 代表不使用固定止盈。
risk.long_take_profit_pct多單專用固定止盈比例;未設定時使用 take_profit_pct
risk.short_take_profit_pct空單專用固定止盈比例;未設定時使用 take_profit_pct

通用 rule_based JSON 範本

{
  "run_name": "ema_macd_expression_combo",
  "description": "Rule-based long strategy using EMA cross, MACD momentum, volume, and ATR expression.",
  "market": "crypto:binance",
  "backtest": {
    "initial_cash": 100000.0,
    "commission_rate": 0.001,
    "commission_per_unit": 0.0,
    "transaction_tax_rate": 0.0,
    "slippage_bps": 8.0,
    "allow_fractional_shares": true,
    "position_accounting": "cash",
    "contract_multiplier": 1.0,
    "margin_per_unit": null,
    "annualization_factor": 365,
    "start_date": null,
    "trade_start_date": null,
    "end_date": "latest"
  },
  "strategy": {
    "type": "rule_based",
    "side": "long",
    "atr_window": 14,
    "max_holding_days": 120,
    "entry": {
      "all": [
        {
          "left": { "indicator": "ema", "source": "close", "window": 20 },
          "operator": "crosses_above",
          "right": { "indicator": "ema", "source": "close", "window": 50 }
        },
        {
          "left": { "indicator": "macd", "source": "close", "component": "line" },
          "operator": ">",
          "right": { "indicator": "macd", "source": "close", "component": "signal" }
        },
        {
          "left": "volume",
          "operator": ">",
          "right": { "indicator": "volume_ema", "window": 20 }
        },
        {
          "left": "close",
          "operator": ">",
          "right": {
            "op": "add",
            "args": [
              { "field": "close", "shift": 1 },
              {
                "op": "multiply",
                "args": [
                  { "indicator": "atr", "window": 14 },
                  0.5
                ]
              }
            ]
          }
        }
      ]
    },
    "exit": {
      "any": [
        {
          "left": "close",
          "operator": "<",
          "right": { "indicator": "ema", "source": "close", "window": 20 }
        },
        {
          "left": "close",
          "operator": ">",
          "right": { "indicator": "bollinger", "source": "close", "window": 20, "band": "upper", "stddev": 2.0 }
        }
      ]
    }
  },
  "risk": {
    "risk_per_trade_pct": 0.01,
    "max_position_pct": 0.2,
    "max_open_positions": 5,
    "max_position_units": null,
    "atr_stop_multiple": 2.0,
    "long_atr_stop_multiple": null,
    "short_atr_stop_multiple": null,
    "trailing_stop_atr_multiple": 2.5,
    "take_profit_pct": null,
    "long_take_profit_pct": null,
    "short_take_profit_pct": null
  },
  "verdict": {
    "min_trades": 10,
    "min_profit_factor": 1.1,
    "max_drawdown_pct": 0.3,
    "min_bootstrap_positive_probability": 0.6,
    "bootstrap_iterations": 500,
    "random_seed": 42
  }
}

多空雙向範例

{
  "run_name": "ema_dual_side_strategy",
  "market": "crypto:binance",
  "backtest": {
    "initial_cash": 100000.0,
    "commission_rate": 0.001,
    "slippage_bps": 8.0,
    "allow_fractional_shares": true,
    "start_date": null,
    "end_date": "latest"
  },
  "strategy": {
    "type": "rule_based",
    "side": "both",
    "atr_window": 14,
    "max_holding_days": 120,
    "long_entry": {
      "left": { "indicator": "ema", "source": "close", "window": 20 },
      "operator": "crosses_above",
      "right": { "indicator": "ema", "source": "close", "window": 50 }
    },
    "long_exit": {
      "left": { "indicator": "ema", "source": "close", "window": 20 },
      "operator": "crosses_below",
      "right": { "indicator": "ema", "source": "close", "window": 50 }
    },
    "short_entry": {
      "left": { "indicator": "ema", "source": "close", "window": 20 },
      "operator": "crosses_below",
      "right": { "indicator": "ema", "source": "close", "window": 50 }
    },
    "short_exit": {
      "left": { "indicator": "ema", "source": "close", "window": 20 },
      "operator": "crosses_above",
      "right": { "indicator": "ema", "source": "close", "window": 50 }
    }
  },
  "risk": {
    "risk_per_trade_pct": 0.01,
    "max_position_pct": 0.2,
    "max_open_positions": 5,
    "max_position_units": null,
    "atr_stop_multiple": 2.0,
    "long_atr_stop_multiple": null,
    "short_atr_stop_multiple": null,
    "trailing_stop_atr_multiple": 2.5,
    "take_profit_pct": null,
    "long_take_profit_pct": null,
    "short_take_profit_pct": null
  }
}