Backtesting.py を使って FX の手法を実装してみた

実装した手法の一覧と GitHub へのリンクだけを紹介する記事です。ひとつひとつの手法の実装は難しいものではありません。backtesting.py の実装経験がある方であれば、プログラムコードを見ていただくことで理解できると思っていますので、ひとつひとつのコード解説は行わないこととします。

https://github.com/zunda-lab/fx_backtest

# 環境認識（setup.py）

https://github.com/zunda-lab/fx_backtest/blob/main/src/strategy/setup.py

## 環境認識なし（StrategySetupNonクラス）

* 0 - 環境認識なし

## 移動平均線（StrategySetupMavクラス）

* 0 - 25SMA/75SMA パーフェクトオーダでのBUY判定
* 1 - 25SMA/75SMA パーフェクトオーダでのSELL判定
* 2 - 25SMA/75SMA パーフェクトオーダでのBUY判定(MTF)
* 3 - 25SMA/75SMA パーフェクトオーダでのSELL判定(MTF)
* 4 - 25SMA/75SMA/200SMA パーフェクトオーダでのBUY判定
* 5 - 25SMA/75SMA/200SMA パーフェクトオーダでのSELL判定
* 6 - 25SMA/75SMA/200SMA パーフェクトオーダでのBUY判定(MTF)
* 7 - 25SMA/75SMA/200SMA パーフェクトオーダでのSELL判定(MTF)

##  ボリンジャーバンド（StrategySetupBbdクラス）

* 0 - 終値3連続+2σ上回りでのBUY判定
* 1 - 終値3連続-2σ下回りでのSELL判定
* 2 - 終値3連続+2σ上回りでのBUY判定(MTF)
* 3 - 終値3連続-2σ下回りでのSELL判定(MTF)

### パラボリックSAR（StrategySetupSarクラス）

* 0 - 安値がSAR(0.02)上回りでBUY判定
* 1 - 高値がSAR(0.02)下回りでSSELL判定

## ADX（StrategySetupAdxクラス）

* 0 - 上昇トレンド優勢でBUY判定
* 1 - 下降トレンド優勢でSELL判定
* 2 - 上昇トレンド優勢でBUY判定(MTF)
* 3 - 下降トレンド優勢でSELL判定(MTF)

# エントリーポイント（trigger.py）

https://github.com/zunda-lab/fx_backtest/blob/main/src/strategy/trigger.py

## RSI（StrategyTriggerRsiクラス）

* 0	売られすぎゾーンへの突入で買い
* 1	買われすぎゾーンへの突入で売り

## MACD（StrategyTriggerMacクラス）

* 0 - MACDがシグナルを上抜けで買い
* 1 - シグナルがMACDを上抜けで買い

## ストキャスティクス（StrategyTriggerStcクラス）

* 0 - %Kが%Dを上抜けで買い
* 1 - %Dが%Kを上抜けで買い

## RCI（StrategyTriggerRciクラス）

* 0 - 売られすぎゾーンへの突入で買い
* 1 - 買われすぎゾーンへの突入で売り

## 移動平均線（StrategyTriggerMavクラス）

* 0 - 移動平均線が終値上抜けで買い
* 1 - 終値が移動平均線上抜けで売り
* 2 - 短期移動平均線が中期移動平均線上抜けで買い
* 3 - 中期移動平均線が短期移動平均線上抜けで売り
* 4 - 超短期移動平均線が短期移動平均線上抜けで買い
* 5 - 短期移動平均線が超短期移動平均線上抜けで売り

## ボリンジャーバンド（StrategyTriggerBbdクラス）

* 0 - 終値が+2σを上抜けで買い
* 1 - 終値が-2σを下抜けで売り
* 2 - +2σが直近最高値を上抜けで買い
* 3 - -2σが直近最安値を下抜けで売り
* 4 - 終値が-3σを下抜けで買い（逆張り）
* 5 - 終値が+3σを上抜けで売り（逆張り）
* 6 - -3σが直近最安値を下抜けで買い（逆張り）
* 7 - +3σが直近最高値を上抜けで売り（逆張り）

## ブレイクアウト（StrategyTriggerBkoクラス）

* 0 - 直近高値のブレイクアウト
* 1 - 直近安値のブレイクアウト
* 2 - 直近安値のブレイクアウト＋終値連続上昇（逆張り）
* 3 - 直近高値のブレイクアウト＋終値連続下降（逆張り）

# 利確ポイント（profit.py）

https://github.com/zunda-lab/fx_backtest/blob/main/src/strategy/profit.py

## 固定（StrategyProfitFixクラス）
* 0 - 150pips固定で決済
* 1 - 100pips固定で決済
* 2 - 時間足で可変pipsで決済
  * 1m: 150pips
  * 1w: 150pips
  * 1d: 150pips
  * 4h: 100pips
  * 1h: 100pips
  * 30min: 100pips
  * 15min: 50pips
  * 5min: 50pips
  * 1min: 50pips

## RSI（StrategyProfitRsiクラス）

* 0 - 買われすぎゾーンへの突入で決済
* 1 - 売られすぎゾーンへの突入で決済

## MACD（StrategyProfitMacクラス）

* 0 - シグナルがMACDを上抜けで決済
* 1 - MACDがシグナルを上抜けで決済

## ストキャスティクス（StrategyProfitStcクラス）

* 0 - %Dが%Kを上抜けで決済
* 1 - %Kが%Dを上抜けで決済

## RCI（StrategyProfitRciクラス）

* 0 - 買われすぎゾーンへの突入で決済
* 1 - 売られすぎゾーンへの突入で決済

## 移動平均線（StrategyProfitMavクラス）

* 0 - 終値が20SMAを上抜けで決済
* 1 - 20SMAが終値を上抜けで決済

## ブレイクアウト（StrategyProfitBkoクラス）

* 0 - 終値が20SMAを上抜けで決済
* 1 - 20SMAが終値を上抜けで決済

# 損切りポイント（loss.py）

https://github.com/zunda-lab/fx_backtest/blob/main/src/strategy/loss.py

## 固定（StrategyLossFixクラス）
* 0 - 150pips固定で損切り
* 1 - 100pips固定で損切り
* 2 - 時間足による可変pipsで損切り
  * 1m: 100pips
  * 1w: 100pips
  * 1d: 100pips
  * 4h: 75pips
  * 1h: 75pips
  * 30min: 75pips
  * 15min: 50pips
  * 5min: 50pips
  * 1min: 50pips

# 共通処理

## 戦略（strategy.py）

https://github.com/zunda-lab/fx_backtest/blob/main/src/strategy/strategy.py

## ユーティリティ（zun_util.py）

https://github.com/zunda-lab/fx_backtest/blob/main/src/strategy/zun_util.py