曜日別の損益を分析する | ランダムウォークへの挑戦⑦2026/7/23

2075年。これは何の年?
答えは、平均寿命を考えた時の私の享年。

そんなことを考えていた今日この頃です。

前回は時間帯別の損益を分析するコードをPythonで作成しました。

今回は曜日別の損益を分析するコードを追記します。

コード作成

次のコードを前回作成した「analyze.py」に保存します。

# ==============================
# 曜日別分析
# ==============================

# 決済時刻から曜日番号を取り出す
# 月曜日=0、火曜日=1、……、日曜日=6
trades["曜日番号"] = trades["時間"].dt.dayofweek

# 曜日番号を日本語の曜日名に変換
weekday_names = {
    0: "月曜日",
    1: "火曜日",
    2: "水曜日",
    3: "木曜日",
    4: "金曜日",
    5: "土曜日",
    6: "日曜日"
}

trades["曜日"] = trades["曜日番号"].map(weekday_names)

# 曜日ごとの成績を集計
weekday_analysis = (
    trades
    .groupby(["曜日番号", "曜日"])
    .agg(
        取引回数=("損益", "count"),
        勝ち数=("損益", lambda x: (x > 0).sum()),
        負け数=("損益", lambda x: (x < 0).sum()),
        総損益=("損益", "sum"),
        平均損益=("損益", "mean"),
        総利益=("損益", lambda x: x[x > 0].sum()),
        総損失=("損益", lambda x: x[x < 0].sum())
    )
)

# 勝率を計算
weekday_analysis["勝率"] = (
    weekday_analysis["勝ち数"]
    / weekday_analysis["取引回数"]
    * 100
)

# PFを計算
weekday_analysis["PF"] = (
    weekday_analysis["総利益"]
    / weekday_analysis["総損失"].abs()
)

# 曜日番号を通常の列に戻す
weekday_analysis = weekday_analysis.reset_index()

# 曜日番号順に並べる
weekday_analysis = weekday_analysis.sort_values("曜日番号")

# 表示する列を整理
weekday_analysis = weekday_analysis[
    [
        "曜日番号",
        "曜日",
        "取引回数",
        "勝ち数",
        "負け数",
        "勝率",
        "総損益",
        "平均損益",
        "PF"
    ]
]

print("\n===== 曜日別分析 =====")
print(
    weekday_analysis[
        [
            "曜日",
            "取引回数",
            "勝ち数",
            "負け数",
            "勝率",
            "総損益",
            "平均損益",
            "PF"
        ]
    ].round(2)
)

さらにcsvにレポートを出力するために以下のコードを追記します。

# 曜日番号を除いてCSVに出力
weekday_analysis[
    [
        "曜日",
        "取引回数",
        "勝ち数",
        "負け数",
        "勝率",
        "総損益",
        "平均損益",
        "PF"
    ]
].to_csv(
    "results/weekday_analysis.csv",
    index=False,
    encoding="utf-8-sig"
)

print(
    "曜日別分析結果を "
    "results/weekday_analysis.csv として保存しました。"
)

さらに曜日別の総損益グラフも作ります。

# ==============================
# 曜日別損益グラフ
# ==============================

plt.figure(figsize=(10, 6))

plt.bar(
    weekday_analysis["曜日"],
    weekday_analysis["総損益"]
)

plt.title("Profit by Weekday")
plt.xlabel("Weekday")
plt.ylabel("Profit")
plt.axhline(0, linewidth=1)
plt.tight_layout()

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

plt.close()

print(
    "曜日別損益グラフを "
    "results/weekday_profit.png として保存しました。"
)

実行すると結果が出力されました。

結果
結果
文字化けしていますが、左から月、火、水、木、金、土 です。

分析

グラフから見てわかる通り、

  • 火曜日が圧倒的に強い
  • 水曜日も非常に優秀
  • 木・金は利益は出ているが少し落ちる
  • 月曜日は利益がかなり少ない
  • 土曜日は参考にならない(5件のみ)

月曜日

  • 総利益 15,546
  • PF 1.14
  • 平均損益 49.99

勝率59%ありますが、利益がほとんど伸びていません。
小さく勝って大きく負けている可能性があります。

火曜日

  • 総利益 77,965
  • PF 1.80
  • 勝率61.9%
  • 平均228

かなり優秀です。平均利益も他曜日より圧倒的に良いです。

水曜日

  • 総利益 61,142
  • PF 1.45
  • 勝率65.1%

勝率が最もいいです。火曜日ほど利益はありませんがかなり安定しています。

木曜日

PF

1.27

利益も約4万円。合格と言えます。

金曜日

勝率は61.9%ですがPFが1.25しかありません。

勝っているのに利益が残らないパターンです。前回の時間帯分析の4時台と似ています。

まとめ

曜日別に分析した結果、火曜日と水曜日が利益の大部分を生み出していることが分かりました。月曜日は勝率約59%を維持しているものの、PFは1.14と低く、利益効率は他曜日より劣っています。

今日はここまで。次回は保有時間別分析のロジックを組み込んでみます。

おまけ

ちなみに私がテクニカル分析の際に一番勉強になった本はこちらです。

一つ一つのテクニカル指標の解説が丁寧で、株を始めた時に何度も何度も読み返しました。
この本を読んでストキャスティクスが一番のお気に入り指標になりました。

慣れた頃にこそ再度手に取りたい一冊です。

次の記事

関連記事

コメント

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