初心者のための『トレード日誌データ化』入門:約定履歴CSVから最初のエッジを見つける実践ガイド

データ分析

本稿では、初心者でも自分の約定履歴(ブローカーの取引レポートCSV)を材料にして、統計的に根拠のある「勝ちパターン(エッジ)」を発見し、少額から収益化するまでの道筋を、ノーコード(Excel / Google スプレッドシート中心)で具体的に解説します。再現性のある手順とテンプレートを提供しますので、今日からトレードの意思決定を「勘」から「データ」へ置き換えていきましょう。

この記事のゴール

  • 約定履歴CSVを安全に取得・整形し、ミスのない分析用データセットを作る。
  • 勝率・損益比・期待値・ドローダウンなどの指標を正しく定義して、自分に効くパターンを数値で可視化する。
  • 曜日・時間帯・銘柄属性・ボラティリティなどの軸で「やる取引/やらない取引」を線引きする。
  • 少額での実地検証→改善→定着という反復サイクルをセットアップする。

なぜ「日誌のデータ化」が初心者の最短ルートなのか

多くの初心者は「勝てる手法探し」の前に、自分が何で負けているかを把握できていません。市場はコントロールできませんが、自分の再現行動はコントロールできます。そこで、まずは過去の自分の売買から統計的に優位な条件を抽出し、「やらないことリスト」を作るだけで損失の多くは消せます。これは資金量や知識量に依存せず、今日から誰でも実行できる改善です。

準備物:口座・ツール・ファイル構成

口座・ツール

  • ブローカー約定履歴のCSVエクスポート機能(株・FX・暗号資産いずれも可)。
  • Excel または Google スプレッドシート(以降「Sheets」)。
  • (任意)MT4/MT5、TradingView。取引コメント/タグを付けられると分析精度が上がります。

フォルダ構成のテンプレ

journal/
├─ raw/          (生のCSVを保存:編集禁止)
├─ clean/        (整形済みCSV)
├─ reports/      (日次・週次レポートHTML/PDF)
└─ templates/    (ピボット・関数テンプレ)

CSVの中身:最低限の必須列と意味

ブローカーによって列名は異なりますが、下記が最低限あれば分析可能です。

列名(例) 意味 データ型
timestamp 約定日時(現地またはJST)。 日時
symbol 銘柄/通貨ペア/ティッカー。 文字列
side 買い=BUY / 売り=SELL。 文字列
qty 約定数量。 数値
price 約定価格。 数値
exit_price 手仕舞い価格。 数値
gross_pl 売買損益(手数料・スワップ等控除前)。 数値
fee 売買手数料・スリッページ・スワップ等の合計。 数値
net_pl 実現損益=gross_pl – fee。 数値
comment 戦略IDやメモ(例:breakout_A)。 文字列

列が足りない場合は、後述の計算列で補います。最重要は「net_pl(最終損益)」を正しく持つことです。

安全に取得・整形する手順(Excel / Sheets)

生データの扱い

  1. raw/にCSVを保存(上書き禁止)。
  2. 別ファイルとしてclean/にコピーし、整形は必ずこちらで実施。

日付と数値の正規化

  • 日付は ISO 形式(YYYY-MM-DD HH:MM:SS)に統一。
  • 小数点区切り(, / .)を確認し、全列のデータ型を明示設定。
  • 通貨や%記号は削除し、数値のみにします。

計算列を追加

  • hour(=HOUR(timestamp))
  • weekday(=WEEKDAY(timestamp,2)) ※1=月, …, 7=日
  • hold_minutes(約定〜手仕舞いの分数)
  • r_multiple(=net_pl / 想定リスク額)
  • is_win(net_pl > 0 → 1, それ以外 0)

想定リスク額は、エントリー時のストップ幅×数量×ポイント価値で見積もります。ストップを事前に置かない裁量でも、置いたと仮定してRを揃えると比較が容易です。

正しい指標定義(誤解しやすいポイント)

基本4指標

  • 勝率 = 勝ちトレード数 / 総トレード数。
  • 損益比(RR) = 平均利益 / 平均損失(絶対値)。
  • 期待値 = 勝率×平均利益 − (1 − 勝率)×平均損失。
  • プロフィットファクター(PF) = 総利益 / 総損失(絶対値)。

実務で重要な3指標

  • 最大ドローダウン:累積損益曲線の最大落ち込み。現金残高で把握。
  • 保持時間の偏り:勝ち負けで保持時間がどう違うか。
  • 手数料・スリッページ負担取引コストがPFをどれだけ圧縮しているか

勝率だけ良く見せかける「早利確・損切り粘り」は、RRが悪化して期待値がマイナスになります。必ず期待値とPFを併記しましょう。

ピボットで「効く条件」を可視化する

Excelでの作成手順

  1. データ範囲を選択 → 「挿入」→「ピボットテーブル」。
  2. 行:weekday、列:hour、値:net_plの合計。
  3. 同じピボットに「値の追加」でis_winの平均(=勝率)も追加。
  4. 条件付き書式で色分け(PF>1.2や勝率>55%を濃色など)。

Sheetsでの作成手順

  1. データ → ピボット テーブル → 新しいシート。
  2. 行:weekday、列:hour、値:net_pl合計 + is_win平均。
  3. スライサーでsymbolsideで絞り込み。

この一枚で「曜日×時間帯の相性」が一目瞭然になります。勝っている帯だけを残して他を削るだけで、損益の分布は大きく改善します。

初心者がまず試すべき3つの「簡易エッジ」

1)曜日×時間帯の相性を固定

例えばFXならロンドン開始直後(日本時間16〜18時)やNY早朝(21〜23時)にボラティリティが高まりやすい時間帯があります。自分の履歴で最もPFが高い帯を「積極ゾーン」として固定し、それ以外の時間は原則見送りにします。

2)勝ちやすい保持時間を守る

勝ちトレードの保持時間中央値を計算し、その±25%に収まるように利確・損切りの時間制約をあらかじめ決めます。時間切れの自動手仕舞いを入れると、保有の引き延ばし癖を矯正できます。

3)手数料負担の重い銘柄を避ける

同じ戦略でも、スプレッド/手数料/借株料/スワップが高い銘柄はPFが伸びません。コストの安い銘柄・口座タイプへ移すだけで改善するケースは多いです。

フィルタ設計:やる取引・やらない取引を数式で決める

ピボットで見つけた条件を、実運用で使えるIF式に落とします。

// Excelの例(許可ゾーンの時だけエントリーOK)
=IF( AND(PF_weekday_hour >= 1.2, WinRate_weekday_hour >= 0.55), "OK", "SKIP")

この「OK」以外は見送るだけで、無駄打ちが激減します。

検証の落とし穴と対策

  • 過剰最適化:条件を細かく切りすぎると偶然に当てはまります。トレード数が各セル30以上になるまで粗く。
  • データ汚染:同じデータで条件探索と検証を行わない。期間を前半/後半で分割し、後半で再確認。
  • コスト無視:手数料・スリッページを必ず含める。バックテストでも固定スリップを上乗せ。

実装フェーズ:少額で現金化するまで

  1. 紙ルール化:入る/入らない、手仕舞い、時間切れ、最大同時ポジション数をA4一枚に。
  2. 少額実装:最小ロットで2〜4週間。毎週同じピボットで再評価。
  3. サイズ調整:期待値がプラスでDDが資金に対して許容内なら、数量を段階的に増やす。

MT4/MQL4で「戦略ID付きログ」を残す(テンプレEA)

裁量でも、EAを「記録係」として使うと後分析が簡単です。下のテンプレはエントリー/イグジット時にコメントへstrategy_idを埋め込み、CSV風のログをExpertsタブへ出力します(必要に応じてファイル出力に拡張できます)。

//+------------------------------------------------------------------+
//|  SimpleLoggerEA.mq4 - ログ専用テンプレ(成行/決済時に記録)      |
//+------------------------------------------------------------------+
#property strict
string strategy_id = "breakout_A"; // ←自分の戦略名
int    magic       = 24680;

int OnInit(){ Print("Logger start: ", strategy_id); return(INIT_SUCCEEDED); }
void OnDeinit(const int reason){ Print("Logger stop"); }

void OnTick(){
  // 例:時間帯フィルタ(日本時間16-23時のみ)
  datetime t = TimeCurrent();
  int hourJST = TimeHour(t + 9*60*60);
  if(hourJST < 16 || hourJST > 23) return;

  // ダミー条件:移動平均クロスで1回だけ試し買い(最小ロット)
  static bool done=false;
  if(done) return;
  double ma_fast = iMA(NULL,0,5,0,MODE_SMA,PRICE_CLOSE,0);
  double ma_slow = iMA(NULL,0,20,0,MODE_SMA,PRICE_CLOSE,0);
  if(ma_fast > ma_slow){
     double lot = MarketInfo(Symbol(), MODE_MINLOT);
     int ticket = OrderSend(Symbol(), OP_BUY, lot, Ask, 2, 0, 0,
                 strategy_id, magic, 0, clrNONE);
     if(ticket>0){ Print("ENTRY,",strategy_id,",",Symbol(),",BUY,",DoubleToStr(Ask,Digits),",",TimeToString(t)); done=true; }
  }

  // 利確/損切り・時間切れなどの実装は任意で追加
}

void OnTrade(){
  // 約定イベントで決済を検出しログ出力
  for(int i=0;i<OrdersHistoryTotal();i++){
    if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)){
      if(OrderMagicNumber()==magic && StringFind(OrderComment(),strategy_id)>=0){
        if(OrderCloseTime()==TimeCurrent()){
           Print("EXIT,",strategy_id,",",Symbol(),",",OrderType()==OP_BUY?"BUY":"SELL",
                 ",",DoubleToStr(OrderClosePrice(),Digits),",",TimeToString(OrderCloseTime()),
                 ",NET_PL,",DoubleToStr(OrderProfit()-OrderSwap()-OrderCommission(),2));
        }
      }
    }
  }
}
//+------------------------------------------------------------------+

実運用では、EAが成績の「タグ付け」とログ出力を担い、エントリー/決済自体は裁量でも構いません。重要なのは戦略IDごとに後から切り分けられることです。

週次レポートのフォーマット(テンプレ)

毎週末に同じフォーマットで記録・振り返りを行います。以下をテンプレ化してreports/に保存します。

  • 総損益、PF、最大DD、トレード数。
  • トップ3の貢献要因(時間帯/銘柄/方向など)。
  • ワースト3の足を引っ張る要因と、翌週からやらないルール。
  • 次週の実験(例:利益確定トレーリングを+3pips延長)。

実例シナリオ:初心者Aさんの2週間改善

仮想の履歴から、改善プロセスを示します。

  1. 初期状態:総損益 -18,000円、勝率54%、RR 0.7、PF 0.83、最大DD -24,000円。
  2. ピボット分析:月〜木の21〜23時のBUYがPF 1.35、金曜深夜のSELLがPF 0.6。
  3. ルール化:21〜23時BUYのみ実施、その他は原則スキップ。時間切れ30分の自動決済を追加。
  4. 結果(2週目):総損益 +12,600円、勝率58%、RR 1.1、PF 1.32、最大DD -9,800円。

「やらないこと」を決めただけでDDが半分以下になり、期待値がプラスに転じました。

資金管理:致命傷を避けるサイズの決め方

1トレードの想定損失(R)を口座残高の0.5〜1.0%以内に制限します。期待値Eと勝率pが分かれば、近似ケリーで上限サイズの目安を得られます。

近似ケリー f* ≈ p - (1 - p) / RR   (RR = 平均利益 / 平均損失)
実運用は f*/2 〜 f*/3 程度に抑える

また、最大DDに対して資金の何%を許容するかをあらかじめ決め、その範囲でしかサイズを上げないことが長期生存の鍵です。

Q&A:よくある詰まりポイント

Q. データが少なくて結論が出ません。

A. 粗い分類(例:時間帯は4区分、曜日は平日/金曜/週末)にしてサンプル数を確保します。十分に溜まるまで「やらないこと」の発見に集中しましょう。

Q. 裁量のメモが面倒です。

A. 事前に戦略IDを3つだけに絞り、ボタン一発でコメントへ挿入できるスクリプトを作ると続きます。

Q. 手数料の影響が見積もれません。

A. ブローカーの約定明細から手数料とスリッページを別列に切り出し、トレードごとの負担額を平均・中央値で把握しましょう。

まとめと次の一手

「トレード日誌のデータ化」は、初心者が最初に取り組むべきローリスク・ハイリターンの自己投資です。勝っている時間帯・銘柄・保持時間だけに集中し、やらない取引を明確にするだけで、成績は目に見えて改善します。テンプレを使って、今日から小さく始めてください。

付録:Sheets関数スニペット集

// 勝率(範囲に1/0のis_winがあるとき)
=AVERAGE(FILTER(is_win, 条件式))

// 期待値(net_plの平均値)
=AVERAGE(FILTER(net_pl, 条件式))

// 持ち時間(分)
=(exit_timestamp - entry_timestamp) * 24 * 60

// 特定時間帯抽出(21〜23時)
=FILTER(A:Z, (HOUR(timestamp)>=21) * (HOUR(timestamp)<=23))

// 平均損益比(RR)
=AVERAGE(FILTER(profit, profit>0)) / ABS(AVERAGE(FILTER(profit, profit<0)))

コメント

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