ランダムウォークへの挑戦_20260611

仕事が少し忙しいのと、毎日プールで泳いでいるのでなかなか作業が進みません。
あと、最近は飲み会も多い。職場で気の合う独身兄貴たちと4人で定期飲みをしています♨

ということで、今日は少し進めます。

前回はMT4から出力したcsvを読みこむところまでやりました。
今日は、読みこんだcsvから基本成績を出すところまで進めたい。

まず、前回の「analyze.py」を次のように修正。

import pandas as pd

# CSV読み込み 文字コード設定
df = pd.read_csv("/mnt/c/Users/clcwo/MT4/report.csv", encoding="utf-8-sig")

# 決済済み取引(close)だけ抽出
trades = df[df["取引種別"] == "close"].copy()

# 日時を変換
trades["時間"] = pd.to_datetime(trades["時間"], format="%Y.%m.%d %H:%M")

# 基本集計
total_trades = len(trades)
wins = trades[trades["損益"] > 0]
losses = trades[trades["損益"] < 0]

#勝ち数・負け数
win_count = len(wins)
loss_count = len(losses)

#勝率
win_rate = win_count / total_trades * 100

#利益合計・損失合計
gross_profit = wins["損益"].sum()
gross_loss = losses["損益"].sum()

#プロフィットファクタ(absは絶対値)
profit_factor = gross_profit / abs(gross_loss)

#損益・平均利益・平均損失
total_profit = trades["損益"].sum()
average_profit = wins["損益"].mean()
average_loss = losses["損益"].mean()

# 最大ドローダウン
trades["過去最高残高"] = trades["残高"].cummax()
trades["ドローダウン"] = trades["残高"] - trades["過去最高残高"]
max_drawdown = trades["ドローダウン"].min()

# 表示
print("===== EA分析結果 =====")
print(f"総取引数: {total_trades}")
print(f"勝ち取引: {win_count}")
print(f"負け取引: {loss_count}")
print(f"勝率: {win_rate:.2f}%")
print(f"総損益: {total_profit:.2f}")
print(f"総利益: {gross_profit:.2f}")
print(f"総損失: {gross_loss:.2f}")
print(f"PF: {profit_factor:.2f}")
print(f"平均利益: {average_profit:.2f}")
print(f"平均損失: {average_loss:.2f}")
print(f"最大ドローダウン: {max_drawdown:.2f}")
print(f"最終残高: {trades['残高'].iloc[-1]:.2f}")

結果が出力された。

月別の成績も追加したいので次を追加。

# 年月列を作成
trades["年月"] = trades["時間"].dt.strftime("%Y-%m")

# 月別損益
monthly_profit = (
    trades
    .groupby("年月")["損益"]
    .sum()
    .reset_index()
)

print("\n===== 月別損益 =====")
print(monthly_profit)

追加した後のソースは

import pandas as pd

# CSV読み込み 文字コード設定
df = pd.read_csv("/mnt/c/MT4/report.csv", encoding="utf-8-sig")

# 決済済み取引(close)だけ抽出
trades = df[df["取引種別"] == "close"].copy()

# 日時を変換
trades["時間"] = pd.to_datetime(trades["時間"], format="%Y.%m.%d %H:%M")

# 年月列を作成
trades["年月"] = trades["時間"].dt.strftime("%Y-%m")

# 基本集計
total_trades = len(trades)
wins = trades[trades["損益"] > 0]
losses = trades[trades["損益"] < 0]

#勝ち数・負け数
win_count = len(wins)
loss_count = len(losses)

#勝率
win_rate = win_count / total_trades * 100

#利益合計・損失合計
gross_profit = wins["損益"].sum()
gross_loss = losses["損益"].sum()

#プロフィットファクタ(absは絶対値)
profit_factor = gross_profit / abs(gross_loss)

#損益・平均利益・平均損失
total_profit = trades["損益"].sum()
average_profit = wins["損益"].mean()
average_loss = losses["損益"].mean()

# 最大ドローダウン
trades["過去最高残高"] = trades["残高"].cummax()
trades["ドローダウン"] = trades["残高"] - trades["過去最高残高"]
max_drawdown = trades["ドローダウン"].min()

# 表示
print("===== EA分析結果 =====")
print(f"総取引数: {total_trades}")
print(f"勝ち取引: {win_count}")
print(f"負け取引: {loss_count}")
print(f"勝率: {win_rate:.2f}%")
print(f"総損益: {total_profit:.2f}")
print(f"総利益: {gross_profit:.2f}")
print(f"総損失: {gross_loss:.2f}")
print(f"PF: {profit_factor:.2f}")
print(f"平均利益: {average_profit:.2f}")
print(f"平均損失: {average_loss:.2f}")
print(f"最大ドローダウン: {max_drawdown:.2f}")
print(f"最終残高: {trades['残高'].iloc[-1]:.2f}")

# 月別損益
monthly_profit = (
    trades
    .groupby("年月")["損益"]
    .sum()
    .reset_index()
)

print("\n===== 月別損益 =====")
print(monthly_profit)

結果が出た。

これを見ると月による損益の落差がかなり激しい。
ちなみに、csvの出力元のEAは私が以前に作成したプロトタイプEAです。

ひとまず出力したcsvから簡単な分析を行うところまでできました。
次回はグラフ化してみたいと思います。

今日はここまで。

コメント

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