最近は暑すぎてプールが気持ちいいです。
今日は夏休みをとって、昼間から泳ぎに行きました。
前回は分析結果をグラフ化するところまで進めました。
今回は、決済時刻から「時間」を取り出し、0時台、1時台、2時台……という単位で、集計し分析ます。また、グラフも併せて作成します。
コードの追加
前回まで作成したPythonファイル「」に以下のコードを追記します。
# ==============================
# 時間帯別分析
# ==============================
# 決済時刻から「時」だけを取り出す
trades["時間帯"] = trades["時間"].dt.hour
# 時間帯ごとの集計
hourly_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())
)
)
# 勝率を計算
hourly_analysis["勝率"] = (
hourly_analysis["勝ち数"]
/ hourly_analysis["取引回数"]
* 100
)
# PFを計算
hourly_analysis["PF"] = (
hourly_analysis["総利益"]
/ hourly_analysis["総損失"].abs()
)
# 表示する列の順番を整える
hourly_analysis = hourly_analysis[
[
"取引回数",
"勝ち数",
"負け数",
"勝率",
"総損益",
"平均損益",
"PF"
]
]
print("\n===== 時間帯別分析 =====")
print(hourly_analysis.round(2))
aggは、aggregate(集計する)の略で時間帯ごとに分けたデータに対して、複数の計算をまとめて実行することを意味します。
lambda は、その場で作る小さな関数です。
Pythonでは、計算時におおむね、
True = 1
False = 0
として扱えるため、勝ち数は.sum()で計算できます。
また、グラフ化のために次のコードを最下行に追記します。
# 時間帯別損益グラフ
plt.figure(figsize=(12, 6))
plt.bar(
hourly_analysis.index,
hourly_analysis["総損益"]
)
plt.title("Profit by Hour")
plt.xlabel("Hour")
plt.ylabel("Profit")
plt.xticks(range(24))
plt.axhline(0, linewidth=1)
plt.tight_layout()
plt.savefig("hourly_profit.png")
plt.close()
print("時間帯別損益グラフを hourly_profit.png として保存しました。")
# 結果をcvsに出力
hourly_analysis.to_csv(
"results/hourly_analysis.csv",
encoding="utf-8-sig"
)
結果として以下のCSVが出力されました。(枠線とグラフは筆者が追加しました)


分析
分析結果を見ると、深夜~早朝(3~10時)が非常に強い一方で、夜22~23時が壊滅的に悪いです。
よい時間帯
6時台
- 取引回数:32回
- 勝率:87.5%
- 総損益:+18,803円
- PF:11.06
これは突出しています。ただし32回なので、「良い傾向」ではあるものの、まだサンプル数は少なめです。
10時台
- 122回(最も多い)
- 勝率:77.0%
- 総損益:+50,079円
- PF:3.89
ここはかなり信頼できます。取引数も十分あり、システムが最も利益を生んでいる時間帯です。
5時台
- 勝率:67.5%
- PF:4.12
- 総利益:+42,348円
ここも非常に優秀です。
9時台
- 84回
- 勝率:71.4%
- PF:3.63
ここもかなり安定しています。
悪い時間帯
23時台
- 51回
- 勝率:35.3%
- 総損益:-55,360円
- PF:0.24
システム全体の利益をかなり削っています。
22時台
- 勝率:30.6%
- PF:0.38
- 総損益:-31,063円
こちらも悪いです。
0時台
- 勝率:39.5%
- PF:0.44
- 総損益:-24,928円
20時台
- PF:0.63
- 総損益:-12,916円
ここもマイナスです。
不思議な時間帯
4時台は勝率76.4%なのに総損益 -2,027円となっています。つまり勝率は高いのに負けています。
これは平均利益より平均損失がかなり大きい可能性があります。
分析まとめ
時間帯別に集計したところ、3〜10時台では利益が大きく、特に10時台は取引回数122回、総損益約5万円、PF3.89と最も安定した結果となった。一方、22〜23時台は勝率が30〜35%程度に留まり、PFも0.4未満で大きく利益を削っていることが分かった。時間帯によるパフォーマンス差は予想以上に大きく、今後はエントリー時間を制限することで成績改善につながる可能性がある。
次回は曜日別の損益を分析することを目標にします。
今日はここまで。
おまけ
この本を読みました。
「私たちが小麦を栽培化したのではなく、小麦が私たちを家畜化した。」この一文が衝撃的でした。
人間は最も成功した種で地球の主人公だと、無意識に思っていましたが、実は我々は小麦にコントロールされていたという衝撃。
また、「種」としての成功は必ずしも「個」の幸福にはつながらないという主張も納得しました。
家畜だけでなく、現代日本人ももれなく当てはまります。
「幸せとは、内なる感情の追及をやめること」ブッダの教えがここまで科学的とは思いませんでした。

コメント