本稿では、個人投資家が取り組める「月末リバランス(Month-End Rebalancing)に伴う為替フロー」を活用したFX戦略を、初心者でも再現できるレベルまで分解して解説します。月末最終営業日前後は、機関投資家が株式や債券の月次リバランスに伴い外貨・自国通貨の需給を調整するタイミングであり、主要通貨ペアでは特定の時間帯に特徴的な値動き(ボラティリティ上昇や一方向の短期トレンド、あるいは過剰な一方向フロー後の急速な反転)が観測されやすくなります。本記事ではその前提・リスク・売買ルール・検証手順・自動化までを丁寧に示します。
この戦略の狙いと前提
月末リバランスとは、年金基金・アセットマネージャー・保険会社などがポートフォリオの資産配分を基準比率に戻す(株式が上がり過ぎた月は売り、下がった月は買い)際に、通貨のヘッジや現物の決済にともなう資金フローが発生する現象です。株式市場のパフォーマンスが大きく正負どちらかに偏った月ほど、為替市場では月末の特定時間帯(一般にロンドン16:00のWM/Reuters Fix周辺)が注目されます。個人はこの時間帯の「一時的な需給の偏り」を、明確な時間ルールと簡易な方向判定で狙います。
対象通貨と時間帯
- 通貨ペア:EUR/USD、GBP/USD、USD/JPY(流動性・スプレッドの観点から初心者向け)
- 時間帯:ロンドン時間16:00(日本時間はサマータイム期間中で00:00、冬時間で01:00付近。ブローカーサーバー時刻に合わせて設定)
- 日付:月末「最終営業日」を基本(最終カレンダー日が土日なら直近の金曜などが該当)
戦略の骨子(2パターン)
月末フローは一方向に伸びることも、直前にオーバーシュートして「Fix通過後に逆噴射」することもあります。そこで相互排他的に動かせる2パターンを定義します。慣れるまではどちらか一方を選んで運用し、ルールが守れるようになってから分散を検討してください。
パターンA:プレ・フィックス・モメンタム追随
狙い:Fix直前30〜10分で形成される方向性に追随し、Fix直前〜直後で利確。
ルール(例:USD/JPY):
- 対象日か確認(「翌日の月が変わる」=月末と判定)
- ロンドン15:30(サーバー時刻換算)から15:50の間、15分足で上昇幅が20pips以上なら買い目線、下落幅が20pips以上なら売り目線。
- 15:50〜15:55に成行で方向にエントリー。
- 利確:+12〜18pips、損切:-14〜20pips、タイムアウト:16:05で強制クローズ。
- スリッページ上限を設定(例:最大1.0pips)。
メリット:単純明快で約定管理が容易。
デメリット:直前のフェイク方向に釣られるリスク。
パターンB:ポスト・フィックス・リバース(逆張り)
狙い:Fix直前の一方向フローが過熱した場合の「反転」だけを狙う。
ルール(例:EUR/USD):
- 対象日か確認。
- 15:30〜15:59の高値・安値を計測し、Fix直前(15:58〜15:59)の終値が同区間レンジの端から0.1%以内に張り付いているかを判定(例:上端張付き)。
- 16:00の1分足がさらに同方向に伸びた後、直前1分足の安値/高値を反対方向にブレイクしたら逆張りで成行。
- 利確:レンジの0.5倍、損切:レンジの0.35倍、タイムアウト:16:10。
メリット:過熱時に限定するためダマシが比較的少ない。
デメリット:条件が厳しめで「ノートレード日」が増える。
準備:ブローカー時刻とサマータイムへの対応
MT4/MT5のサーバー時刻はブローカーによって異なります。ロンドン16:00がサーバーで何時かを必ず確認し、EAパラメータで外部入力できるようにします。サマータイム(BST)と冬時間(GMT)で1時間ずれる点にも注意が必要です。記事末尾のEAでは、FixHourServer
とFixMinuteServer
で柔軟に指定できるようにしています。
資金管理と想定ドローダウン
- 1トレードのリスクは口座残高の0.5%以内(初心者は0.25%)。
- 最大同時ポジションは1(AとBは同時に走らせない)。
- 想定DD:連敗8〜10回のケースを許容できるロットに抑える。
- 重要指標(FOMC・米雇用統計・CPIなど)がFix付近に重なる場合は休む判断が有利。
検証(バックテスト)手順:初心者向け
最低限のデータ
- 1分足または5分足のヒストリカルデータ(少なくとも過去3〜5年)。
- ブローカーのスプレッド変動データ(理想だが、なければ平均値で代替)。
- サマータイム切替のカレンダー。
Excelだけでの簡易検証(パターンAの例)
- 対象月の最終営業日をリスト化(週末・祝日補正)。
- 該当日の15:30〜16:05(ロンドン時刻換算)の高値・安値・終値を抽出。
- 条件(直前上昇/下落pips)を満たす日のみ抽出。
- 16:05終値 vs エントリー価格で損益算出(スプレッド+0.2pipsの滑りを控えめに加算)。
- 勝率、平均損益、PF、最大DDを集計。
TradingViewによる半自動検証(パターンB)
以下は条件検知用のPine Script(v5)サンプルです。最終営業日の厳密判定は簡略化し、「翌日が月初になる日(=カレンダー最終日ベース)」を近似に用いています。週末シフトは手動で除外してください。
// Pine Script v5(条件検知用)
indicator("Month-End Fix Reversal Detector", overlay=true)
inLondon = time(timeframe.period, "Europe/London")
isMonthEnd = ta.change(month(inLondon)) // 翌バーで月が変わる=前バーが月末
hh = ta.highest(high, 30) // 30分レンジ近似
ll = ta.lowest(low, 30)
nearTop = math.abs(close - hh) <= (hh - ll) * 0.001 // 0.1%相当の近接
nearBottom = math.abs(close - ll) <= (hh - ll) * 0.001
isPreFix = hour(inLondon) == 15 and minute(inLondon) >= 58
plotshape(isMonthEnd and isPreFix and nearTop, title="Near Top pre-fix", style=shape.labelup, text="Top")
plotshape(isMonthEnd and isPreFix and nearBottom, title="Near Bottom pre-fix", style=shape.labeldown, text="Bottom")
この検知スクリプトをベースに、成行エントリーと利確・損切を追加すれば戦略テストが可能です。精緻化のポイントは「週末・祝日補正」「サマータイム」「スプレッド拡大時のフィルタ」です。
MT4用・時間指定EA(サンプル)
以下は、月末判定とFix前後の時間帯で売買を行うMQL4のサンプルEAです。パターンA(モメンタム)を想定しています。学習用の最小構成として実装しているため、実運用前に必ずストラテジーテスターで検証し、スプレッド・滑り・手数料・DST差を加味して調整してください。
//+------------------------------------------------------------------+
//| MonthEndFix.mq4 |
//| (c) Sample for Education |
//+------------------------------------------------------------------+
#property strict
input string SymbolToTrade = "USDJPY";
input int FixHourServer = 22; // ブローカーサーバーでのFix時刻(例)
input int FixMinuteServer = 55; // 例:15:55〜エントリー
input int LookbackMin = 20; // 直前の計測分数
input int MomentumPips = 20; // モメンタム判定(pips)
input double RiskPerTradePct = 0.25; // 口座に対するリスク%
input int SL_Pips = 14;
input int TP_Pips = 16;
input int CloseHour = 23; // タイムアウト(例:Fix直後)
input int CloseMinute = 5;
input double MaxSlippagePips = 1.0;
datetime lastTradeDay = 0;
bool IsMonthEndDay(datetime t){
// 「翌日が次の月」なら当日を月末と判定(営業日補正は別途)
datetime tomorrow = t + 24*60*60;
return (TimeMonth(tomorrow) != TimeMonth(t));
}
double PipValue(string sym){
int digits = (int)MarketInfo(sym, MODE_DIGITS);
if(StringFind(sym, "JPY") >= 0) return 0.01;
return (digits == 5 || digits == 3) ? 0.00010 : 0.0001;
}
double LotsByRisk(string sym, double sl_pips, double risk_pct){
double bal = AccountBalance();
double risk_money = bal * risk_pct / 100.0;
double tickval = MarketInfo(sym, MODE_TICKVALUE);
double lotstep = MarketInfo(sym, MODE_LOTSTEP);
double minlot = MarketInfo(sym, MODE_MINLOT);
double pip = PipValue(sym);
double lots = risk_money / (sl_pips * pip * (tickval / MarketInfo(sym, MODE_TICKSIZE)));
// 丸め
lots = MathFloor(lots / lotstep) * lotstep;
if(lots < minlot) lots = minlot;
return NormalizeDouble(lots, 2);
}
int OnInit(){ return(INIT_SUCCEEDED); }
void OnTick(){
if(Symbol() != SymbolToTrade) return;
datetime now = TimeCurrent();
// 既に当日トレード済みなら何もしない
if(TimeDayOfYear(now) == TimeDayOfYear(lastTradeDay)) return;
// 月末日か(簡易判定)
if(!IsMonthEndDay(now)) return;
int h = TimeHour(now);
int m = TimeMinute(now);
// エントリー判定時間:FixHourServer:FixMinuteServer
if(h == FixHourServer && m == FixMinuteServer){
// 直近モメンタム判定
int bars = MathMax(1, LookbackMin);
int tfsec = PERIOD_M1;
int shiftA = iBarShift(Symbol(), tfsec, now, true);
int shiftB = iBarShift(Symbol(), tfsec, now - LookbackMin*60, true);
if(shiftA < 0 || shiftB < 0) return;
double priceNow = NormalizeDouble(Ask, Digits);
double pricePast = iClose(Symbol(), tfsec, shiftB);
double pip = PipValue(Symbol());
double move_pips = (priceNow - pricePast)/pip;
int dir = 0;
if(move_pips >= MomentumPips) dir = 1; // 上昇=買い
else if(move_pips <= -MomentumPips) dir = -1; // 下落=売り
else return;
double sl = SL_Pips * pip;
double tp = TP_Pips * pip;
double lots = LotsByRisk(Symbol(), SL_Pips, RiskPerTradePct);
int slippage = (int)MathRound(MaxSlippagePips / PipValue(Symbol()));
if(dir == 1){
int ticket = OrderSend(Symbol(), OP_BUY, lots, Ask, slippage, Ask - sl, Ask + tp, "MonthEndA", 0, 0, clrBlue);
if(ticket > 0){ lastTradeDay = now; }
} else if(dir == -1){
int ticket = OrderSend(Symbol(), OP_SELL, lots, Bid, slippage, Bid + sl, Bid - tp, "MonthEndA", 0, 0, clrRed);
if(ticket > 0){ lastTradeDay = now; }
}
}
// タイムアウトクローズ
if(h == CloseHour && m == CloseMinute){
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
if(OrderSymbol() == Symbol()){
if(OrderType() == OP_BUY) OrderClose(OrderTicket(), OrderLots(), Bid, 3);
if(OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), Ask, 3);
}
}
}
}
}
//+------------------------------------------------------------------+
パラメータ設計のコツ
- MomentumPips:対象ペアのボラに合わせる。USD/JPYは15〜25pips、GBP/USDは20〜35pipsなど。
- SL/TP:リスクリワード1:1〜1:1.3が目安。フィルタ強化で勝率60%超を狙うなら1:0.8も選択肢。
- タイムアウト:Fix通過後のノイズを避け、長引く保有は避ける(発注厚が薄い時間帯は急変動リスク)。
- 重要イベント除外:経済指標カレンダーを前日までに確認。重なる場合は「取らない」のが最適解になる場面が多いです。
フィルタ例(精度向上)
- 月間株式リターン連動フィルタ:当月の株式指数(例:S&P500)が+3%以上上昇なら、米株連動のUSD需要/供給を仮説化し、ドル買い/売りの事前バイアスを設定(あくまでバイアス)。
- 日中の方向一貫性:Fix当日の欧州前場〜後場の高安ブレイク方向が一致しているか。
- スプレッド・板厚:15:45以降にスプレッドが平常時の2倍超で推移なら見送り。
- 週・月のATR位置:当日のPriceが月間ATRの上限/下限付近にある時は反転しやすい。
ケーススタディ(シナリオ別)
シナリオ1:月間で株高・当日もドル売り基調
欧州後場にかけてUSD/JPYがジリ安(円高)で推移。15:30〜15:50で-25pipsの下落が出たためパターンAの売り条件を満たす。15:53で成行ショート、16:03に+14pipsで利確。スプレッドは1.0pips以内。
シナリオ2:直前に過熱上昇→Fix通過後に反転
EUR/USDが15:30〜15:59で+0.35%急伸。16:00の1分足でさらに上に振れたが、その直後に直前1分足安値を割り込んだためパターンBの売り発動。16:07に0.18%利確。
シナリオ3:イベント衝突でボラ極大化
Fix直前に米CPI。指標起点の乱高下でモメンタムの意味が崩れるため、事前ルールで休むに切替。ノートレードは立派な戦略の一部です。
よくある失敗と回避策
- 時刻ズレ:ブローカー時刻の誤設定で「30分早い/遅い」トレードをしてしまう。まずはデモ口座でログを確認。
- ルール外裁量:「今日は伸びそう」と裁量でロットを上げる。固定リスクに統一。
- イベント無視:経済指標を見ずにエントリーして大きく狩られる。必ずカレンダー確認。
- 連敗後の取り返し病:ロット増はさらに破綻確率を上げます。淡々と継続。
発注・実務Tips
- 成行よりも成行+スリッページ上限を設定(MT4の
OrderSend
第5引数)。 - 「指値の置きっぱなし」はFix瞬間のギャップに弱い。最初は成行中心。
- 複数ペア同時運用は初心者には推奨しません。まずは1ペアで十分。
- 月末が祝日の国カレンダーは自動化が難しいため、最初は手動で対象日フラグを立てる運用が現実的。
発展:ポートフォリオ化とロバスト性検証
最初は1ペア・1パターンで十分ですが、慣れたら同条件を他ペアに水平展開し、ペア間の相関の低さでポートフォリオ化(同時に走らせず、月ごとに入替)を検討してください。また、以下でロバスト性をチェックします。
- パラメータを±20%ずらしてもPF>1.1が維持されるか。
- スプレッドを2倍、滑りを+1.0pipsにしても破綻しないか。
- 2020年3月のような極端相場を含めてもDDが口座残高の5〜8%以内か。
Q&A
Q:必ず勝てますか?
A:いいえ。相場に「必勝」はありません。本戦略は月末特有のフローに着目した統計的優位性が期待される時間帯ルールに過ぎません。リスクは常に存在します。
Q:どのペアが初心者向け?
A:まずはUSD/JPYを推奨します。スプレッドが安定しやすく、滑りの許容度も取りやすいからです。
Q:バックテスト期間は?
A:最低3年、理想は5年以上。サマータイム切替の影響が複数回含まれる長さが望ましいです。
まとめ
月末リバランスFX戦略は、明確な時間帯×簡潔なルールで実装でき、初心者でも再現可能です。まずはデモ口座で「時刻・条件・約定」の3点を検証し、資金管理を徹底した上で小ロットから始めてください。ノートレードを恐れず、守備的に積み上げる姿勢が長期的な生存率を高めます。
コメント