ランダムウォークへの挑戦⑮|零号機は「荒れた相場」に強いのか ― ATRと取引成績の関係をPythonで分析する(2026/8/9)

ランダムウォーク 未分類

はじめに

前回は、零号機がMQL4から出力した trade_log.csv をPythonへ読み込み、

trade_base.csv

という分析用データへ変換しました。

ランダムウォークへの挑戦⑭ | 零号機の「記憶」をPythonへ渡す ― trade_log.csvを分析用データに整える(2026/8/5)
はじめに前回は、MQL4を改修して、零号機が取引したときの情報を記録する仕組みを作りました。エントリーが成立した瞬間に、ATRBB幅バンドまでの距離スプレッドエントリー時刻曜日バー時刻などを取得し、取引が決済されるまでGlobalVaria…

ここまでのChapter2では、

零号機が取引する
        ↓
エントリー時の相場環境を記憶する
        ↓
trade_log.csvへ保存する
        ↓
Pythonで読み込む
        ↓
trade_base.csvへ整える

という「学習するための土台」を作ってきました。

しかし、まだ零号機は何も学習していません。

ここからようやく、

どのような相場で勝ちやすく、
どのような相場で負けやすいのか。

を調べていきます。

最初に分析するのは、

entry_atr14_pips

です。

これは、零号機がエントリーした瞬間のATR14をpips単位で記録したものです。

今回調べたいことは単純です。

ATRが小さい相場と大きい相場で、零号機の成績は変わるのか?

もし明確な差が存在するなら、

ATRが○○以下ならエントリーしない

といったフィルターを零号機へ追加できる可能性があります。

Chapter1では「取引した結果」を観測してきました。

Chapter2では、いよいよ、

相場環境
    ↓
取引結果

の関係を探っていきます。


1.今回分析するATRとは

ATRは、

Average True Range

の略です。

簡単にいえば、

最近の相場がどの程度動いているか

を表す指標です。

ATRが小さい場合は、値動きが比較的小さい相場。

ATRが大きい場合は、値動きが比較的大きい相場と考えることができます。

今回の零号機では、エントリー時に、

double atr14 =
   iATR(
      _Symbol,
      0,
      14,
      0
   );

によってATR14を取得し、

GlobalVariableSet(
   EntryKey(
      ticket,
      "ATR14_PIPS"
   ),
   atr14 / PipPoint
);

としてpipsへ変換した値を保存しています。

そして決済後、

entry_atr14_pips

として trade_log.csv へ記録しています。

つまり今回分析するATRは、

決済時のATRではなく、零号機がエントリーを決断した瞬間のATR

です。

ここが重要です。

将来的にエントリー条件として利用するのであれば、

エントリーした時点ですでに分かっていた情報

を使って分析する必要があるからです。


2.分析用データを読み込む

まず、前回作成した trade_base.csv を読み込みます。

import os
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

os.makedirs(
    "results",
    exist_ok=True
)

df = pd.read_csv(
    "results/trade_base.csv",
    encoding="utf-8-sig"
)

前回までは、

trade_log.csv

を直接読み込んでいました。

今回はすでにPython側で型変換やデータチェックを行った、

trade_base.csv

を分析の出発点にします。

データ処理の流れも、

trade_log.csv
    ↓
trade_base.csv
    ↓
各種分析

となってきました。


3.今回必要な列を取り出す

今回必要になるのは、

ticket
profit
entry_atr14_pips

の3列です。

atr_df = df[
    [
        "ticket",
        "profit",
        "entry_atr14_pips"
    ]
].copy()

ここでも、

.copy()

を使っています。

元となる df を直接変更するのではなく、

ATR分析専用のDataFrame

を別に作るためです。

これを、

atr_df

という名前で扱います。


4.欠損しているデータを確認する

まず、ATRや損益が欠損していないか確認します。

print(
    "\n===== 欠損値確認 ====="
)

print(
    atr_df.isna().sum()
)

問題がなければ、

ticket              0
profit              0
entry_atr14_pips    0

のようになります。

そのうえで、安全のため、

atr_df = atr_df.dropna(
    subset=[
        "profit",
        "entry_atr14_pips"
    ]
).copy()

として、今回の分析に必要な値が欠損している行を除外します。

dropna() は、

欠損値を含む行を取り除く

ための処理です。


5.まずATRそのものの分布を見る

いきなりATRと損益の関係を見るのではなく、まず、

零号機はどの程度のATRで取引しているのか

を確認します。

print(
    "\n===== ATR基本統計 ====="
)

print(
    atr_df[
        "entry_atr14_pips"
    ].describe()
)

これによって、

count
mean
std
min
25%
50%
75%
max

などが表示されます。

例えば、

25%
50%
75%

を見ることで、

全取引のATRのうち、どのあたりが低ATR・中ATR・高ATRなのか

を把握できます。


6.ATRを4つのグループに分ける

ここからが今回の重要な部分です。

ATRを単純に眺めるだけでは、

ATRが高いと強いのか
ATRが低いと強いのか

が分かりません。

そこで、全取引をATRの大きさによって4グループに分けます。

atr_df[
    "atr_quartile_no"
] = pd.qcut(
    atr_df[
        "entry_atr14_pips"
    ],
    q=4,
    labels=False,
    duplicates="drop"
)

使用しているのが、

pd.qcut()

です。

これはデータを、

ほぼ同じ件数になるようにグループ分けする

ためのpandasの関数です。

今回、

q=4

としているため、ATRの大きさによって全取引を4分割します。

イメージとしては、

Q1
ATRが最も小さい25%

Q2
次の25%

Q3
次の25%

Q4
ATRが最も大きい25%

です。

さらに分かりやすくするため、名前を付けます。

atr_df[
    "atr_group"
] = atr_df[
    "atr_quartile_no"
].apply(
    lambda x:
        f"Q{int(x) + 1}"
        if pd.notna(x)
        else np.nan
)

これで各取引に、

Q1
Q2
Q3
Q4

というATRグループが追加されます。


7.勝ち・負けを判定する

次に、各取引が勝ちだったのか負けだったのかを判定します。

atr_df[
    "win"
] = (
    atr_df[
        "profit"
    ] > 0
).astype(int)

atr_df[
    "loss"
] = (
    atr_df[
        "profit"
    ] < 0
).astype(int)

利益が0より大きければ、

win = 1

損失なら、

loss = 1

となります。

これを後ほどグループごとに合計することで、

勝ち数
負け数

を求められます。


8.ATRグループごとの成績を集計する

いよいよATR別の成績を調べます。

atr_analysis = (
    atr_df
    .groupby(
        "atr_group",
        observed=True
    )
    .agg(
        atr_min=(
            "entry_atr14_pips",
            "min"
        ),
        atr_max=(
            "entry_atr14_pips",
            "max"
        ),
        trades=(
            "ticket",
            "count"
        ),
        wins=(
            "win",
            "sum"
        ),
        losses=(
            "loss",
            "sum"
        ),
        total_profit=(
            "profit",
            "sum"
        ),
        average_profit=(
            "profit",
            "mean"
        )
    )
    .reset_index()
)

これによって、

ATR範囲
取引回数
勝ち数
負け数
総損益
平均損益

をまとめて計算できます。


9.勝率を計算する

続いて勝率です。

atr_analysis[
    "win_rate"
] = (
    atr_analysis[
        "wins"
    ]
    /
    atr_analysis[
        "trades"
    ]
    * 100
)

これによって、

Q1  ○○%
Q2  ○○%
Q3  ○○%
Q4  ○○%

と、ATRごとの勝率を比較できます。


10.プロフィットファクターも計算する

勝率だけでは、システムの強さは判断できません。

例えば、

勝率70%

であっても、

小さく10回勝って、大きく1回負けるシステムなら利益が残らない可能性があります。

そこで、

Profit Factor(PF)

も計算します。

PFは、

総利益 ÷ 総損失の絶対値

です。

まず計算用の関数を作ります。

def calc_profit_factor(group):

    gross_profit = group.loc[
        group["profit"] > 0,
        "profit"
    ].sum()

    gross_loss = abs(
        group.loc[
            group["profit"] < 0,
            "profit"
        ].sum()
    )

    if gross_loss == 0:

        return np.inf

    return (
        gross_profit
        /
        gross_loss
    )

そしてATRグループごとに計算します。

profit_factor = (
    atr_df
    .groupby(
        "atr_group",
        observed=True
    )
    .apply(
        calc_profit_factor,
        include_groups=False
    )
    .rename(
        "profit_factor"
    )
    .reset_index()
)

先ほど作った集計結果へ結合します。

atr_analysis = atr_analysis.merge(
    profit_factor,
    on="atr_group",
    how="left"
)

これで、

Q1
Q2
Q3
Q4

それぞれについて、

勝率
総損益
平均損益
PF

を比較できるようになりました。


11.分析結果を表示する

結果を確認します。

print(
    "\n===== ATR別成績 ====="
)

print(
    atr_analysis.to_string(
        index=False
    )
)

例えば次のような表になります。

atr_group  atr_min  atr_max  trades  wins  losses  total_profit  average_profit  win_rate  profit_factor
Q1         ...
Q2         ...
Q3         ...
Q4         ...

ここで重要なのは、

勝率だけを見ないこと

です。

例えば、

Q1
勝率は高い
しかし総損益・PFが低い

Q4
勝率は少し低い
しかし総損益・PFが高い

という結果になる可能性もあります。

その場合、

ATRが大きい環境では勝つ回数自体は減るものの、一度勝ったときの利益が大きい

という零号機の性格が見えてきます。

逆に、

Q1だけ明らかにPFが低い

のであれば、

値動きが小さすぎる環境では零号機の優位性が弱くなる

という仮説を立てられます。


12.ATRと損益の相関も確認する

補助的な指標として、ATRと損益の相関係数も確認します。

atr_profit_correlation = (
    atr_df[
        "entry_atr14_pips"
    ]
    .corr(
        atr_df[
            "profit"
        ]
    )
)

print(
    "\n===== ATRと損益の相関 ====="
)

print(
    atr_profit_correlation
)

相関係数は、

+1に近い
→ ATRが大きいほど利益も大きくなる傾向

0に近い
→ 単純な直線関係は弱い

-1に近い
→ ATRが大きいほど損益が悪化する傾向

という見方ができます。

ただし、ここは注意が必要です。

相関係数が0に近いからといって、

ATRは関係ない

とは限りません。

例えば、

低ATR → 悪い
中ATR → 良い
高ATR → 悪い

という山型の関係なら、相関係数は小さくなる可能性があります。

だからこそ今回は、

相関係数
+
ATRを4分割した成績

の両方を確認します。


13.グラフでも確認する

数字だけでは分かりにくいため、ATRグループごとのPFをグラフにします。

plt.figure(
    figsize=(
        8,
        5
    )
)

plt.bar(
    atr_analysis[
        "atr_group"
    ],
    atr_analysis[
        "profit_factor"
    ]
)

plt.axhline(
    y=1.0,
    linestyle="--"
)

plt.xlabel(
    "ATR group"
)

plt.ylabel(
    "Profit Factor"
)

plt.title(
    "Profit Factor by Entry ATR"
)

plt.tight_layout()

plt.savefig(
    "results/atr_profit_factor.png",
    dpi=150
)

plt.close()

PFでは、

1.0

が一つの基準になります。

そのため、

plt.axhline(
    y=1.0,
    linestyle="--"
)

によってPF=1の位置へ線を引いています。

もし、

Q1だけ1を大きく下回る
Q2~Q4は1を超える

のであれば、低ATR環境を除外することで成績を改善できる可能性があります。


14.CSVとして保存する

分析結果はCSVにも保存します。

atr_analysis.to_csv(
    "results/atr_analysis.csv",
    index=False,
    encoding="utf-8-sig"
)

これで、

results
├─ trade_base.csv
├─ atr_analysis.csv
└─ atr_profit_factor.png

という形になります。

今後も、

bb_width_analysis.csv
band_distance_analysis.csv
spread_analysis.csv

などを増やしていけば、Chapter2の分析結果をそれぞれ独立して残していけます。


今回のまとめ

今回は、零号機がエントリーした瞬間のATRと、その後の取引結果の関係を分析する仕組みを作りました。

処理の流れは、

trade_base.csv
        ↓
entry_atr14_pipsを取得
        ↓
ATRの分布を確認
        ↓
ATRを4グループへ分割
        ↓
勝率
総損益
平均損益
PF
を比較
        ↓
ATRと損益の相関を確認
        ↓
atr_analysis.csv

です。

ここまでのChapter1では、

零号機はいつ勝っているのか。

どのくらいポジションを保有すると成績が悪化するのか。

といった「取引後の結果」を観測してきました。

今回は初めて、

エントリーした瞬間の相場環境

と、

その後の取引結果

を結び付けました。

これはChapter2において大きな一歩です。

ただし、この段階では、

Q1のPFが悪い
        ↓
ATRフィルターを実装する

と、すぐにEAを変更するべきではありません。

まだ見つけたのは、

「こうかもしれない」という仮説

にすぎないからです。

例えば、

低ATRの成績が悪い

という結果が出ても、

特定の時間帯に低ATRが多いだけではないか

特定の曜日が影響していないか

偶然ではないのか

ATRのどこに境界線を置くべきなのか

など、さらに調べる必要があります。

Chapter2「学習」では、

観測
 ↓
差を発見
 ↓
仮説
 ↓
検証
 ↓
システムへ実装
 ↓
バックテスト

という順番を崩さず進めます。

零号機にいきなり答えを教えるのではなく、

零号機自身の過去の取引から、少しずつ規則を探していく。

その最初の対象が、今回のATRです。


出力結果

分析結果

ATRを四分位に分けて集計した結果、以下のようになりました。

ATRグループATR範囲取引回数勝率総損益平均損益PF
Q11.871~5.58643463.59%13,09530.171.13
Q25.593~7.88642963.64%57,734134.581.44
Q37.893~11.22943159.86%63,707147.811.36
Q411.243~56.01443160.09%78,754182.721.31

まず目につくのは、Q1の成績の悪さです。

Q1はATRが1.871~5.586pipsの、最も値動きが小さい約25%の相場です。

勝率を見ると63.59%あり、Q2の63.64%とほとんど変わりません。むしろQ3・Q4より高い勝率です。

ところがPFは、

Q1  1.13
Q2  1.44
Q3  1.36
Q4  1.31

となりました。

グラフにすると、この違いはより明確です。

最も値動きの小さいQ1だけ、零号機の優位性がかなり弱くなっています。

勝率が高いのに、なぜ儲からないのか

今回、個人的に最も興味深かったのがここです。

Q1とQ2を比較すると、

              Q1          Q2
勝率         63.59%      63.64%
PF            1.13        1.44
平均損益      30.17      134.58

勝率はほぼ同じです。

それにもかかわらず、1取引あたりの平均損益には4倍以上の差があります。

つまり、

「低ATRだから負ける回数が増える」

という単純な話ではなさそうです。

むしろ、

低ATRでも勝つこと自体はできる。しかし、その勝ち方では十分な利益を残せていない。

という零号機の特徴が見えてきました。

これは、トレンドフォロー型の出口を持つ零号機の性格とも整合する可能性があります。

値動きの小さい相場では、方向を当てることができても、その後価格が十分に伸びず、大きな利益につながらない。

一方、ある程度値動きのある相場では、トレンドに乗ったときの利益を伸ばせる。

今回の結果だけでは原因までは断定できませんが、少なくとも低ATR環境では零号機の収益効率が大きく低下していることは確認できます。

「ATRは高いほど良い」わけでもない

もう一つ重要なのは、PFが単純にATRとともに上昇しているわけではないことです。

最高だったのはQ4ではなく、

Q2:PF 1.44

でした。

その後、

Q2  1.44
Q3  1.36
Q4  1.31

と緩やかに低下しています。

したがって、

ATRが大きければ大きいほど零号機が強くなる

とは言えません。

今回の結果から見えてくるのは、

「低すぎるATRが苦手で、ある程度値動きがある環境で優位性が高まる」

という形です。

特にQ2、つまりATR約5.6~7.9pips付近でPFが最大になっています。

一方、総利益はQ4が最大

ここも面白いところです。

PFではQ2が最高ですが、総損益を見ると、

Q1   13,094.83
Q2   57,733.62
Q3   63,707.38
Q4   78,753.78

と、ATRが大きくなるほど増えています。

平均損益も、

Q1    30.17
Q2   134.58
Q3   147.81
Q4   182.72

と増加しています。

つまりQ4は、効率(PF)はQ2ほど高くないものの、1回あたりに稼ぐ金額が大きいという特徴があります。

ここから、

零号機は大きく動く相場では勝率こそ約60%まで下がるものの、利益を伸ばすことで稼いでいる

という可能性も見えてきました。

これは今後ぜひ掘り下げたいポイントです。


最初の仮説

今回の分析から、一つ目の学習候補が見えてきました。

ATRが低すぎる環境では、新規エントリーを見送った方がよいのではないか。

特に、

5.6pips前後

が一つの境界候補になります。

Q1を単純に除外した場合、全1,725取引のうち434取引、つまり約25%のエントリーをしなくなることになります。

その434取引は利益を出しているため、

「Q1を全部捨てれば利益が増える」

という話ではありません。

実際、Q1も13,094.83の利益を生み出しています。

したがって今回の結果だけから、

ATR < 5.6
↓
取引禁止

と零号機を書き換えるのは早すぎます。

重要なのは、

「低ATR領域では零号機の優位性がかなり弱くなっている」

という仮説を得られたことです。

Chapter2「学習」では、この仮説をさらに検証していきます。


ここからさらに調べたいこと

今回の結果から、むしろ新しい疑問が生まれました。

例えばQ1では、なぜ勝率63.59%もあるのにPFが1.13しかないのでしょうか。

考えられるのは、

平均利益が小さい
平均損失が大きい
利益を伸ばせない
損切りまでの距離とのバランスが悪い
特定の時間帯・曜日がQ1に偏っている

などです。

また、今回の四分位分析ではQ1を、

1.871~5.586pips

という一つのグループにまとめています。

しかし実際には、

ATR 2~3pips → 非常に悪い
ATR 3~4pips → 悪い
ATR 4~5pips → 普通
ATR 5~6pips → 良い

というように、Q1の内部に境界が存在する可能性もあります。

そのため、今回見つかった5.6pipsという数字を、そのままEAのエントリー条件にすることはできません。

これはまだ、

答えではなく、次に調べるべき場所を発見した段階

です。


今回のまとめ

今回、零号機がエントリーした瞬間のATRと、その後の取引成績を比較しました。

その結果、

① 最低ATR群Q1はPF1.13と明確に低い

② しかしQ1の勝率は63.59%とむしろ高い

③ PFが最も高かったのはQ2の1.44

④ Q3・Q4もPF1.3以上を維持

⑤ 総損益・平均損益はQ4が最大

という特徴が確認できました。

特に重要なのは、

零号機は低ATR相場で「勝てない」のではなく、「勝っているのに利益を残しにくい」可能性がある。

という点です。

これまでChapter1では、零号機の取引結果を様々な角度から観測してきました。

Chapter2では、その結果から、

「なぜ?」

を探し始めています。

今回、最初の仮説が生まれました。

零号機には、エントリーを避けるべき低ボラティリティ領域が存在するのではないか。

まだ零号機を書き換える段階ではありません。

まずは、この仮説が本当に正しいのかを検証していきます。

次回

次回は、

entry_bb_width_pips

に注目します。

これはエントリー時の、

ボリンジャーバンドの幅

です。

ATRが「値動きの大きさ」を表す指標だとすれば、BB幅は、

相場が収縮しているのか、拡大しているのか

を見るためのもう一つの手掛かりになります。

零号機は、

バンドが狭い相場

と、

バンドが大きく広がった相場

のどちらを得意としているのでしょうか。

そしてATRとBB幅は、似たような情報を持っているのか。

それとも、零号機にとってまったく違う意味を持つのか。

次回は、

エントリー時のBB幅と取引成績

を分析します。

今回作ったPythonコード

今回の処理をまとめると、以下になります。

今回作成したコード全文
# ==========================================
# Chapter2
# エントリー時ATRと取引成績を分析
# ==========================================

import os
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt


# ==========================================
# 保存先フォルダ
# ==========================================

os.makedirs(
    "results",
    exist_ok=True
)


# ==========================================
# 分析用データを読み込む
# ==========================================

df = pd.read_csv(
    "results/trade_base.csv",
    encoding="utf-8-sig"
)


# ==========================================
# ATR分析に必要なデータを取り出す
# ==========================================

atr_df = df[
    [
        "ticket",
        "profit",
        "entry_atr14_pips"
    ]
].copy()


# ==========================================
# 欠損値確認
# ==========================================

print(
    "\n===== 欠損値確認 ====="
)

print(
    atr_df.isna().sum()
)


atr_df = atr_df.dropna(
    subset=[
        "profit",
        "entry_atr14_pips"
    ]
).copy()


# ==========================================
# ATR基本統計
# ==========================================

print(
    "\n===== ATR基本統計 ====="
)

print(
    atr_df[
        "entry_atr14_pips"
    ].describe()
)


# ==========================================
# ATRを4分割
# ==========================================

atr_df[
    "atr_quartile_no"
] = pd.qcut(
    atr_df[
        "entry_atr14_pips"
    ],
    q=4,
    labels=False,
    duplicates="drop"
)


atr_df[
    "atr_group"
] = atr_df[
    "atr_quartile_no"
].apply(
    lambda x:
        f"Q{int(x) + 1}"
        if pd.notna(x)
        else np.nan
)


# ==========================================
# 勝敗判定
# ==========================================

atr_df[
    "win"
] = (
    atr_df[
        "profit"
    ] > 0
).astype(int)


atr_df[
    "loss"
] = (
    atr_df[
        "profit"
    ] < 0
).astype(int)


# ==========================================
# ATRグループ別集計
# ==========================================

atr_analysis = (
    atr_df
    .groupby(
        "atr_group",
        observed=True
    )
    .agg(
        atr_min=(
            "entry_atr14_pips",
            "min"
        ),
        atr_max=(
            "entry_atr14_pips",
            "max"
        ),
        trades=(
            "ticket",
            "count"
        ),
        wins=(
            "win",
            "sum"
        ),
        losses=(
            "loss",
            "sum"
        ),
        total_profit=(
            "profit",
            "sum"
        ),
        average_profit=(
            "profit",
            "mean"
        )
    )
    .reset_index()
)


# ==========================================
# 勝率
# ==========================================

atr_analysis[
    "win_rate"
] = (
    atr_analysis[
        "wins"
    ]
    /
    atr_analysis[
        "trades"
    ]
    * 100
)


# ==========================================
# Profit Factor計算関数
# ==========================================

def calc_profit_factor(group):

    gross_profit = group.loc[
        group["profit"] > 0,
        "profit"
    ].sum()

    gross_loss = abs(
        group.loc[
            group["profit"] < 0,
            "profit"
        ].sum()
    )

    if gross_loss == 0:

        return np.inf

    return (
        gross_profit
        /
        gross_loss
    )


# ==========================================
# ATRグループ別Profit Factor
# ==========================================

profit_factor = (
    atr_df
    .groupby(
        "atr_group",
        observed=True
    )
    .apply(
        calc_profit_factor,
        include_groups=False
    )
    .rename(
        "profit_factor"
    )
    .reset_index()
)


atr_analysis = atr_analysis.merge(
    profit_factor,
    on="atr_group",
    how="left"
)


# ==========================================
# ATRと損益の相関
# ==========================================

atr_profit_correlation = (
    atr_df[
        "entry_atr14_pips"
    ]
    .corr(
        atr_df[
            "profit"
        ]
    )
)


# ==========================================
# 結果表示
# ==========================================

print(
    "\n===== ATR別成績 ====="
)

print(
    atr_analysis.to_string(
        index=False
    )
)


print(
    "\n===== ATRと損益の相関 ====="
)

print(
    atr_profit_correlation
)


# ==========================================
# CSV保存
# ==========================================

atr_analysis.to_csv(
    "results/atr_analysis.csv",
    index=False,
    encoding="utf-8-sig"
)


# ==========================================
# PFグラフ
# ==========================================

plt.figure(
    figsize=(
        8,
        5
    )
)

plt.bar(
    atr_analysis[
        "atr_group"
    ],
    atr_analysis[
        "profit_factor"
    ]
)

plt.axhline(
    y=1.0,
    linestyle="--"
)

plt.xlabel(
    "ATR group"
)

plt.ylabel(
    "Profit Factor"
)

plt.title(
    "Profit Factor by Entry ATR"
)

plt.tight_layout()


plt.savefig(
    "results/atr_profit_factor.png",
    dpi=150
)

plt.close()


print(
    "\nATR分析が完了しました。"
)

関連記事

ランダムウォークへの挑戦⑮|零号機は「荒れた相場」に強いのか ― ATRと取引成績の関係をPythonで分析する(2026/8/9)
ランダムウォークへの挑戦⑭ | 零号機の「記憶」をPythonへ渡す ― trade_log.csvを分析用データに整える(2026/8/5)
ランダムウォークへの挑戦⑬ | 零号機に「記憶」を与える ― mql4でエントリーから決済までの相場環境を記録する(2026/8/2)
ランダムウォークへの挑戦⑫ | Chapter2「学習」始動 ー零号機は何を学ぶべきなのかー(2026/8/2)
ランダムウォークへの挑戦⑪ | 零号機の性格診断──Chapter1「観測」 完結(2026/8/1)
ランダムウォークへの挑戦⑩ | Pythonで資産推移とドローダウンを分析する(2026/8/1)
ランダムウォークへの挑戦⑨ | Pythonで取引の連勝・連敗を分析する(2026/7/28)
ランダムウォークへの挑戦⑧ | Pythonでポジションの保有時間別に成績を分析する(2026/7/26)
ランダムウォークへの挑戦⑦ | Pythonでエントリー曜日と決済曜日から零号機を分析する(2026/7/23)
ランダムウォークへの挑戦⑥ | Pythonでエントリー時間と決済時間から損益を分析する(2026/7/22)
ランダムウォークへの挑戦⑤ | Pythonで月別損益をグラフ化する(2026/7/5)
ランダムウォークへの挑戦④ |Pythonで「零号機」の基本成績を分析する(2026/6/11)
ランダムウォークへの挑戦③ | 環境設定(2026/5/26)
ランダムウォークへの挑戦➁ | 小目標3つ設定(2026/5/25)
ランダムウォークへの挑戦① | はじめに(2026/5/25)

コメント

タイトルとURLをコピーしました