はじめに
前回は、
D:Relative Band Distance 0.60 ~ 1.00
の優位性が、なぜ時間とともに弱くなっているように見えるのかを調べました。
Dの計344取引を時系列で4分割すると、Profit Factorは、
Period1:3.027
Period2:1.863
Period3:1.473
Period4:1.121
と大きく低下していました。
しかし、その中身を分解すると興味深いことが分かりました。
勝率は、
Period1:53.49%
Period2:58.14%
Period3:50.00%
Period4:52.33%
でした。
つまり、
時間とともにエントリー精度が落ち続けた
わけではありません。
平均損失についても、
Period1:-687円
Period2:-658円
Period3:-731円
Period4:-657円
と大きな変化はありませんでした。
最も大きく変わったのは、
平均利益
です。
Period1:1,808円
Period2: 883円
Period3:1,077円
Period4: 671円
Period1からPeriod4にかけて約63%低下しています。
つまりDの問題は、
負けるようになったというより、勝ったときに利益が伸びなくなった
ことにありそうです。
Dは完全に死んだわけでもない
さらに年別分析では、
2018:PF 2.455
2019:PF 2.421
2020:PF 2.077
2021:PF 2.633
と強かったDが、
2022:PF 1.092
2023:PF 0.928
2024:PF 1.166
と急激に弱くなりました。
ところが、
2025:PF 3.132
と再び復活しています。
そして2026年8月まででは、
PF 0.265
まで低下しています。
この動きを見る限り、
Dの優位性が時間の経過によって単純に消滅した
と考えるのは少し無理があります。
むしろ、
Dが非常に機能する相場と、ほとんど機能しない相場が存在する
と考えた方が自然です。
「良いエントリー」から「良い相場環境」へ
これまでの分析では主に、
どのエントリーを残すべきか
を研究してきました。
その中でRelative Band Distanceが見つかりました。
例えば、
Relative Band Distance
=
BBからの距離
÷
ATR
を見ることで、
0.60 ~ 1.00
というD条件では、
PF:1.861
最大DD:1.122%
という非常に強い結果が得られました。
しかし第25回までの分析から、
Relative Band Distanceだけでは十分ではない
可能性が出てきました。
同じ、
0.60 ~ 1.00
でも、
非常に利益が伸びる相場
と、
ほとんど利益が伸びない相場
が存在します。
そこで今回から、
システムを動かすべき相場環境そのもの
を探します。
まずATRを見る
最初に見るのは、
ATR14
です。
ATRは値動きの大きさ、つまりボラティリティを見るための指標です。
今回特にATRに注目する理由は、第25回で、
勝率ではなく「勝ったときの利益」が縮小している
ことが分かったからです。
例えば、
ATRが小さい
↓
値動きが小さい
↓
エントリー後に価格が伸びない
↓
平均利益が小さくなる
という構造なら、第25回の結果をかなり自然に説明できます。
逆にATRが大きすぎる場合も、
値動きが激しすぎる
↓
ノイズが増える
↓
SLにかかりやすい
可能性があります。
SL(Stop Loss)とは、損失を一定範囲に抑えるための損切り注文のことです。
つまり、
ATRが低すぎる相場
適度なATRの相場
ATRが高すぎる相場
で、Dの成績が違う可能性があります。
BB幅も見る
もう一つ見るのが、
Bollinger Band Width
です。
BB幅は、
ボリンジャーバンドがどれくらい広がっているか
を表します。
一般的には、
BB幅が狭い
→ 値動きが収縮している
BB幅が広い
→ 値動きが拡大している
状態と考えることができます。
DはRelative Band Distanceという、
BBとの位置関係
を利用した条件です。
そのため、
BBそのものが収縮しているのか、拡大しているのか
によってDの意味が変わる可能性があります。
例えば同じ、
Relative Band Distance = 0.70
でも、
BBが大きく拡大している最中
と、
BBがほとんど動いていない状態
では、エントリー後の値動きが違うかもしれません。
いきなり「最適値」は探さない
ここは今回かなり重要です。
例えばATRについて、
ATR 5~10
ATR 6~11
ATR 7~12
ATR 8~13
...
と大量の条件を試せば、
どこかにPFの高い条件は見つかると思います。
しかし、それを繰り返すと、
過去データに偶然合った条件
を見つけているだけになる危険があります。
これまでRelative Band Distanceについてかなり細かく分析してきたからこそ、ここではいったん最適化を止めます。
今回やるのは、
勝ちトレードと負けトレードで相場環境に本当に違いがあるのか
の確認です。
違いが確認できてから、初めて閾値探索へ進みます。
今回の分析対象
対象はDです。
0.60 <= Relative Band Distance <= 1.00
に該当する344取引を、
WIN
LOSS
に分けます。
そして、
ATR14
BB幅
について比較します。
平均値だけでは判断しない
例えばATRが、
WIN :平均 10.5
LOSS:平均 9.8
だったとしても、
これだけで、
ATRが高い方が勝ちやすい
とは判断できません。
平均値は外れ値の影響を受けるからです。
そこで今回は、
平均値
中央値
標準偏差
25%点
75%点
も計算します。
例えば、
WIN
25%:8.2
中央値:10.1
75%:13.4
と、
LOSS
25%:6.5
中央値:8.1
75%:10.2
なら、
勝ちトレードのATR分布そのものが高い方向へずれている可能性があります。
箱ひげ図で分布を見る
さらに、
ATR
と、
BB幅
について箱ひげ図を作ります。
平均値だけではなく、
WIN
LOSS
の分布を直接比較します。
これによって、
勝ちトレードが特定の相場環境に集中しているのか
を視覚的に確認します。
年別中央値も確認する
第25回では、
2022~2024
にDの成績が大きく低下し、
2025
に再び復活しました。
そこで、
ATR中央値
BB幅中央値
も年別に計算します。
例えば、
2018~2021
ATR高い
2022~2024
ATR低い
2025
ATR再上昇
となっていれば、
第25回までの結果と非常にきれいにつながります。
逆にATRにほとんど変化がなければ、
Dの劣化原因は単純なボラティリティではない
ということになります。
どちらの結果でも意味があります。
今回のコード
ファイル名は、
d_market_regime_analysis.py
とします。
今回はまず、現在の trade_base.csv に存在する列からBB幅候補を自動検出するようにします。
コード全文
import os
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# ============================================================
# 設定
# ============================================================
INPUT_FILE = "results/trade_base.csv"
OUTPUT_DIR = "results"
os.makedirs(
OUTPUT_DIR,
exist_ok=True
)
D_LOWER = 0.60
D_UPPER = 1.00
# ============================================================
# 出力ファイル
# ============================================================
SUMMARY_CSV = os.path.join(
OUTPUT_DIR,
"d_market_regime_win_loss_summary.csv"
)
YEAR_CSV = os.path.join(
OUTPUT_DIR,
"d_market_regime_year_analysis.csv"
)
ATR_BOX_GRAPH = os.path.join(
OUTPUT_DIR,
"d_atr_win_loss_boxplot.png"
)
BB_BOX_GRAPH = os.path.join(
OUTPUT_DIR,
"d_bb_width_win_loss_boxplot.png"
)
ATR_YEAR_GRAPH = os.path.join(
OUTPUT_DIR,
"d_yearly_atr_median.png"
)
BB_YEAR_GRAPH = os.path.join(
OUTPUT_DIR,
"d_yearly_bb_width_median.png"
)
# ============================================================
# 読み込み
# ============================================================
df = pd.read_csv(
INPUT_FILE
)
print("=" * 60)
print("D MARKET REGIME ANALYSIS")
print("=" * 60)
print(
f"\n読み込み件数: {len(df)}"
)
# ============================================================
# 列確認
# ============================================================
required_columns = [
"entry_time",
"entry_band_distance_pips",
"entry_atr14_pips",
"profit",
]
missing_columns = [
column
for column in required_columns
if column not in df.columns
]
if missing_columns:
raise ValueError(
"必要な列がありません: "
+ ", ".join(missing_columns)
)
# ============================================================
# BB幅候補を探す
# ============================================================
bb_candidates = [
column
for column in df.columns
if (
"bb" in column.lower()
and
(
"width" in column.lower()
or
"bandwidth" in column.lower()
)
)
]
print("\nBB幅候補列:")
print(bb_candidates)
if len(bb_candidates) == 0:
BB_WIDTH_COLUMN = None
print(
"\nBB幅を表す列が見つかりませんでした。"
)
print(
"今回はATR分析のみ実行します。"
)
else:
BB_WIDTH_COLUMN = (
bb_candidates[0]
)
print(
"\n使用するBB幅列:",
BB_WIDTH_COLUMN
)
# ============================================================
# 型変換
# ============================================================
df["entry_time"] = pd.to_datetime(
df["entry_time"],
errors="coerce"
)
numeric_columns = [
"entry_band_distance_pips",
"entry_atr14_pips",
"profit",
]
if BB_WIDTH_COLUMN is not None:
numeric_columns.append(
BB_WIDTH_COLUMN
)
for column in numeric_columns:
df[column] = pd.to_numeric(
df[column],
errors="coerce"
)
# ============================================================
# 基本データ
# ============================================================
analysis_df = df[
df["entry_time"].notna()
&
df["entry_band_distance_pips"].notna()
&
df["entry_atr14_pips"].notna()
&
df["profit"].notna()
&
(
df["entry_atr14_pips"] > 0
)
].copy()
analysis_df[
"relative_band_distance"
] = (
analysis_df[
"entry_band_distance_pips"
]
/
analysis_df[
"entry_atr14_pips"
]
)
analysis_df[
"relative_band_distance"
] = (
analysis_df[
"relative_band_distance"
]
.replace(
[
np.inf,
-np.inf
],
np.nan
)
)
analysis_df = analysis_df[
analysis_df[
"relative_band_distance"
].notna()
].copy()
analysis_df[
"year"
] = (
analysis_df[
"entry_time"
].dt.year
)
# ============================================================
# D抽出
# ============================================================
d_df = analysis_df[
analysis_df[
"relative_band_distance"
].between(
D_LOWER,
D_UPPER,
inclusive="both"
)
].copy()
d_df[
"result"
] = np.where(
d_df["profit"] > 0,
"WIN",
"LOSS"
)
# 0円取引が存在する場合は除外
d_df = d_df[
d_df["profit"] != 0
].copy()
print(
f"\nD取引数: {len(d_df)}"
)
print(
"WIN:",
(
d_df["result"]
==
"WIN"
).sum()
)
print(
"LOSS:",
(
d_df["result"]
==
"LOSS"
).sum()
)
# ============================================================
# 要約統計
# ============================================================
def distribution_stats(
source_df,
column
):
series = (
source_df[column]
.dropna()
)
if len(series) == 0:
return {
"count": 0,
"mean": np.nan,
"median": np.nan,
"std": np.nan,
"q25": np.nan,
"q75": np.nan,
"min": np.nan,
"max": np.nan,
}
return {
"count":
len(series),
"mean":
series.mean(),
"median":
series.median(),
"std":
series.std(),
"q25":
series.quantile(0.25),
"q75":
series.quantile(0.75),
"min":
series.min(),
"max":
series.max(),
}
summary_rows = []
analysis_variables = {
"ATR14":
"entry_atr14_pips"
}
if BB_WIDTH_COLUMN is not None:
analysis_variables[
"BB_WIDTH"
] = BB_WIDTH_COLUMN
for variable_name, column in (
analysis_variables.items()
):
for result in [
"WIN",
"LOSS"
]:
subset = d_df[
d_df["result"]
==
result
]
stats = distribution_stats(
subset,
column
)
stats[
"variable"
] = variable_name
stats[
"result"
] = result
summary_rows.append(
stats
)
summary_df = pd.DataFrame(
summary_rows
)
summary_columns = [
"variable",
"result",
"count",
"mean",
"median",
"std",
"q25",
"q75",
"min",
"max",
]
summary_df = summary_df[
summary_columns
]
summary_df.to_csv(
SUMMARY_CSV,
index=False
)
# ============================================================
# 年別分析
# ============================================================
year_rows = []
for year, year_df in d_df.groupby(
"year"
):
row = {
"year":
year,
"trades":
len(year_df),
"total_profit":
year_df[
"profit"
].sum(),
"avg_profit":
year_df[
"profit"
].mean(),
"atr_mean":
year_df[
"entry_atr14_pips"
].mean(),
"atr_median":
year_df[
"entry_atr14_pips"
].median(),
}
if BB_WIDTH_COLUMN is not None:
row[
"bb_width_mean"
] = (
year_df[
BB_WIDTH_COLUMN
].mean()
)
row[
"bb_width_median"
] = (
year_df[
BB_WIDTH_COLUMN
].median()
)
year_rows.append(
row
)
year_df = pd.DataFrame(
year_rows
).sort_values(
"year"
)
year_df.to_csv(
YEAR_CSV,
index=False
)
# ============================================================
# ATR:WIN / LOSS 箱ひげ図
# ============================================================
win_atr = (
d_df.loc[
d_df["result"] == "WIN",
"entry_atr14_pips"
]
.dropna()
)
loss_atr = (
d_df.loc[
d_df["result"] == "LOSS",
"entry_atr14_pips"
]
.dropna()
)
plt.figure(
figsize=(9, 6)
)
plt.boxplot(
[
win_atr,
loss_atr
],
labels=[
"WIN",
"LOSS"
],
showfliers=True
)
plt.title(
"D: ATR Distribution - WIN vs LOSS"
)
plt.xlabel(
"Trade Result"
)
plt.ylabel(
"ATR14 (pips)"
)
plt.grid(
axis="y",
alpha=0.3
)
plt.tight_layout()
plt.savefig(
ATR_BOX_GRAPH,
dpi=150
)
plt.close()
# ============================================================
# BB幅:WIN / LOSS 箱ひげ図
# ============================================================
if BB_WIDTH_COLUMN is not None:
win_bb = (
d_df.loc[
d_df["result"] == "WIN",
BB_WIDTH_COLUMN
]
.dropna()
)
loss_bb = (
d_df.loc[
d_df["result"] == "LOSS",
BB_WIDTH_COLUMN
]
.dropna()
)
plt.figure(
figsize=(9, 6)
)
plt.boxplot(
[
win_bb,
loss_bb
],
labels=[
"WIN",
"LOSS"
],
showfliers=True
)
plt.title(
"D: BB Width Distribution - WIN vs LOSS"
)
plt.xlabel(
"Trade Result"
)
plt.ylabel(
BB_WIDTH_COLUMN
)
plt.grid(
axis="y",
alpha=0.3
)
plt.tight_layout()
plt.savefig(
BB_BOX_GRAPH,
dpi=150
)
plt.close()
# ============================================================
# 年別ATR中央値
# ============================================================
plt.figure(
figsize=(12, 7)
)
plt.plot(
year_df["year"],
year_df["atr_median"],
marker="o"
)
plt.title(
"D: Yearly Median ATR"
)
plt.xlabel(
"Year"
)
plt.ylabel(
"Median ATR14 (pips)"
)
plt.grid(
alpha=0.3
)
plt.tight_layout()
plt.savefig(
ATR_YEAR_GRAPH,
dpi=150
)
plt.close()
# ============================================================
# 年別BB幅中央値
# ============================================================
if BB_WIDTH_COLUMN is not None:
plt.figure(
figsize=(12, 7)
)
plt.plot(
year_df["year"],
year_df[
"bb_width_median"
],
marker="o"
)
plt.title(
"D: Yearly Median BB Width"
)
plt.xlabel(
"Year"
)
plt.ylabel(
BB_WIDTH_COLUMN
)
plt.grid(
alpha=0.3
)
plt.tight_layout()
plt.savefig(
BB_YEAR_GRAPH,
dpi=150
)
plt.close()
# ============================================================
# 表示
# ============================================================
print("\n")
print("=" * 60)
print("WIN / LOSS DISTRIBUTION")
print("=" * 60)
print(
summary_df.to_string(
index=False
)
)
print("\n")
print("=" * 60)
print("YEAR ANALYSIS")
print("=" * 60)
print(
year_df.to_string(
index=False
)
)
print("\n")
print("=" * 60)
print("OUTPUT FILES")
print("=" * 60)
print(
SUMMARY_CSV
)
print(
YEAR_CSV
)
print(
ATR_BOX_GRAPH
)
print(
ATR_YEAR_GRAPH
)
if BB_WIDTH_COLUMN is not None:
print(
BB_BOX_GRAPH
)
print(
BB_YEAR_GRAPH
)
出力されるファイル
まずCSVは、
d_market_regime_win_loss_summary.csv
d_market_regime_year_analysis.csv
の2つです。
1つ目では、
WIN
LOSS
について、
ATR
BB幅
の分布を比較します。
2つ目では、
年
取引数
総損益
平均損益
ATR平均
ATR中央値
BB幅平均
BB幅中央値
を確認します。
画像は最大4枚です。
d_atr_win_loss_boxplot.png
d_bb_width_win_loss_boxplot.png
d_yearly_atr_median.png
d_yearly_bb_width_median.png
ただし trade_base.csv にBB幅の列が存在しなかった場合は、今回はATR関連の2枚だけ出力します。
分析結果
今回は、
D(Relative Band Distance 0.60~1.00)が機能する相場と機能しない相場では、ATRやBB幅に違いがあるのか
を調べました。
分析対象となったDは344取引。
内訳は、
WIN :184取引
LOSS:160取引
です。
第25回では、Dの長期的な成績低下について、
勝率が下がり続けているのではなく、「勝ったときの利益」が小さくなっている
ことが分かりました。
そこで今回は、その背景にボラティリティやBBの状態があるのではないかと考えました。
しかし結果は、想像していたほど単純ではありませんでした。
ATRは勝敗をほとんど説明していない
まずATR14を比較します。
結果は、
| WIN | LOSS | |
|---|---|---|
| 取引数 | 184 | 160 |
| 平均 | 9.195 | 9.336 |
| 中央値 | 8.200 | 8.139 |
| 25%点 | 6.036 | 6.022 |
| 75%点 | 11.173 | 11.386 |
となりました。
驚くほど似ています。
特に中央値は、
WIN :8.200 pips
LOSS:8.139 pips
で、その差はわずか、
0.061 pips
です。
平均値については、むしろLOSSの方がわずかに高くなっています。
四分位範囲についても、
WIN
6.036 ~ 11.173
LOSS
6.022 ~ 11.386
とほぼ重なっています。
つまり今回の結果を見る限り、
ATRが高いからDが勝つ、あるいはATRが低いからDが負ける
という単純な関係は確認できませんでした。

箱ひげ図でも、この結果はかなり明確です。
WINとLOSSの箱はほぼ同じ位置にあります。
外れ値には違いがありますが、分布の中心部分については大きな差がありません。
したがって、
ATR○○以上だけ取引する
といったフィルターを、この結果だけを根拠に追加するのは危険だと考えます。
閾値を細かく探索すればPFの高い領域は見つかるかもしれません。
しかし現段階では、それが本当に相場構造を捉えたものなのか、それとも過去データへの過剰適合なのか区別できません。
今回の目的は「高いPFを作ること」ではなく、
なぜDが機能するのか
を理解することです。
その意味では、
ATR単体にはDの勝敗を説明する力がほとんど見られなかった
という結果そのものが重要です。
BB幅には少し違いが見えた
一方、BB幅ではATRとは少し違う結果になりました。
| WIN | LOSS | |
|---|---|---|
| 平均 | 33.720 | 29.625 |
| 中央値 | 28.821 | 24.186 |
| 25%点 | 19.005 | 17.628 |
| 75%点 | 43.015 | 34.782 |
中央値を見ると、
WIN :28.821 pips
LOSS:24.186 pips
です。
WINの方が約4.6pips広くなっています。
平均値でも、
WIN :33.720
LOSS:29.625
とWINの方が大きくなりました。
ATRではほぼ完全に重なっていたのに対し、BB幅では、
勝ちトレードの方が、ややBB幅の広い相場で発生している
という傾向が見えます。

箱ひげ図を見ると、WINとLOSSはもちろん大きく重なっています。
したがって、
BB幅だけで勝敗を判別できる
というほど強い結果ではありません。
しかし中央値だけでなく、
25%点
中央値
75%点
のすべてでWINの方が高くなっています。
特に75%点は、
WIN :43.015
LOSS:34.782
と比較的大きな差があります。
これは、
BBがある程度拡大している局面では、Dのエントリー後に利益が伸びやすい
可能性を示しています。
第25回で分かった、
Dの問題は勝率よりも「勝ったときに利益が伸びなくなったこと」
という結果とも方向性としては整合します。
BB幅は、次にもう少し詳しく調べる価値がありそうです。
ただし「BB幅が広ければ勝てる」でもない
ここで注意しなければならないのが年別分析です。
Dの年別BB幅中央値は、
2015:46.444
2016:23.264
2017:22.350
2018:30.401
2019:17.289
2020:25.943
2021:21.144
2022:34.591
2023:26.327
2024:21.207
2025:25.480
2026:25.477
でした。

もし、
BB幅が広い相場ほどDが強い
という単純な構造なら、PFの高い年ほどBB幅も広くなるはずです。
しかし実際にはそうなっていません。
例えば2019年は、
BB幅中央値:17.289
平均損益 :+201円
です。
BB幅は全期間でもかなり狭いにもかかわらず、Dは利益を出しています。
逆に2022年は、
BB幅中央値:34.591
平均損益 :+48円
です。
BB幅はかなり広いにもかかわらず、Dの期待値はほとんどありません。
さらに2025年と2026年は非常に興味深い結果になりました。
2025
BB幅中央値:25.480
平均損益 :+374円
2026
BB幅中央値:25.477
平均損益 :-387円
BB幅中央値は、
25.480
25.477
とほぼ完全に同じです。
しかし平均損益は、
+374円
↓
-387円
と正反対です。
これはかなり強い証拠です。
BB幅だけでは、Dが機能する相場と機能しない相場を説明できない。
WIN/LOSS間には一定の差が見えるものの、それだけを相場レジーム判定に使うことは難しそうです。
ATRの年別推移にも明確な答えはない
次にATR中央値です。
2015:14.279
2016: 8.497
2017: 7.286
2018: 9.775
2019: 4.943
2020: 8.121
2021: 6.600
2022:10.025
2023: 8.107
2024: 7.561
2025: 7.883
2026: 6.943

こちらもDの成績との単純な対応は確認できません。
例えば2019年は、
ATR中央値:4.943
平均損益 :+201円
でした。
かなり低ボラティリティの年でも利益を出しています。
一方、2022年は、
ATR中央値:10.025
平均損益 :+48円
でした。
ATRが高くても期待値はほぼゼロです。
そして、
2025:ATR 7.883 → 平均損益 +374円
2026:ATR 6.943 → 平均損益 -387円
です。
やはり、
ATRが○○以上ならDが機能する
という単純な構造ではなさそうです。
今回は「単純なボラティリティ仮説」を棄却する
今回の分析を始める前には、
ボラティリティが低い
↓
トレンドが伸びない
↓
平均利益が低下
↓
DのPFが低下
という仮説を考えていました。
しかし結果を見る限り、この説明は十分ではありません。
ATRについてはWINとLOSSでほぼ差がありません。
BB幅についてはWINの方がやや広い傾向がありますが、年別ではDの成績と一貫して対応していません。
したがって現段階では、
「値動きの大きさ」だけではDの優位性を説明できない
と判断します。
これは失敗というより、探索範囲をかなり狭める結果です。
「大きさ」ではなく「方向」が重要なのではないか
ここで一つ、新しい仮説が出てきます。
ATRとBB幅には共通点があります。
どちらも主に、
値動きの大きさ
を測っています。
しかし零号機がトレンドフォロー型であることを考えると、本当に重要なのは、
どれくらい動いているか
ではなく、
どちらか一方向へ継続して動いているか
なのかもしれません。
例えば、
ATRが高い
BB幅も広い
としても、
価格が上下に激しく振れているだけなら、トレンドフォロー型システムにとって良い相場とは限りません。
一方、
ATRはそれほど高くない
としても、
価格が一方向へ滑らかに進んでいれば、利益を伸ばせる可能性があります。
これは2019年の結果とも整合します。
2019年は、
ATR中央値:4.943
BB幅中央値:17.289
と低いにもかかわらず、
平均損益:+201円
でした。
つまり零号機に必要なのは、
高ボラティリティではなく、方向性のある値動き
なのかもしれません。
2025年と2026年は重要な比較対象になる
そして今回、今後の研究に使えそうな非常に面白い比較対象が見つかりました。
2025
ATR中央値 :7.883
BB幅中央値 :25.480
平均損益 :+374円
2026
ATR中央値 :6.943
BB幅中央値 :25.477
平均損益 :-387円
特にBB幅はほぼ同じです。
それにもかかわらず、成績は正反対です。
これは、
値動きの大きさが似ていても、値動きの「質」が違えば零号機の成績は大きく変わる
可能性を示しています。
この2025年と2026年の違いを説明できる指標が見つかれば、零号機の相場レジーム判定にかなり近づくはずです。
今回の結論
今回の分析結果を整理すると、
① ATRはWINとLOSSでほぼ完全に重なる
② ATR単体をフィルター化する根拠は現時点では弱い
③ BB幅はWINの方がやや大きい
④ ただしBB幅だけでは年ごとの成績差を説明できない
⑤ ATR・BB幅とも「高ければ良い」という関係ではない
⑥ 2025年と2026年はBB幅がほぼ同じなのに成績が正反対
⑦ 単純なボラティリティより「値動きの方向性」を見る必要がある
となりました。
第25回では、
「良いエントリー」から「良い相場環境」へ
研究対象を広げました。
そして今回、
良い相場環境とは、単純に値動きが大きい相場ではない
ことが見えてきました。
次に見るべきなのは、
値動きの大きさではなく、トレンドの方向性・持続性
だと考えます。
次回
次回は、
Dが機能する相場では、本当にトレンドの方向性が強いのか
を調べます。
ATRやBB幅は、
どれくらい動いているか
は教えてくれます。
しかし、
一方向へ動いているのか
上下に激しく振れているだけなのか
までは十分に区別できません。
そこで次回は、現在のデータに含まれているトレンド系の情報を確認し、
移動平均線の傾き
価格と移動平均線の位置関係
BB中心線の傾き
ADXなどのトレンド強度
のうち、既存データから利用できるものを使って分析します。
特に、
2025
→ Dが非常に強かった
2026
→ Dが非常に弱い
にもかかわらず、
BB幅
2025:25.480
2026:25.477
とほぼ同じだった点に注目します。
もし両年で、
ボラティリティは同程度
しかし
トレンド方向性には大きな差
が確認できれば、第25回から続いている、
なぜDは勝ったときに利益を大きく伸ばせる場合と、伸ばせない場合があるのか
という疑問に一歩近づきます。
次回もいきなり最適な閾値を探索するのではなく、
まずWINとLOSSでトレンド指標の分布に差があるか
を確認します。
差が確認できた指標だけ、その次の段階で閾値探索へ進めます。
コメント