仕事が少し忙しいのと、毎日プールで泳いでいるのでなかなか作業が進みません。
あと、最近は飲み会も多い。職場で気の合う独身兄貴たちと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から簡単な分析を行うところまでできました。
次回はグラフ化してみたいと思います。
今日はここまで。
コメント