
デイトレードLarry Connors RSI2平均回帰戦略
はじめに
Larry Connorsは著名なトレーダー兼著者であり、特に2期間RSI (RSI2)などのクオンツトレーディングや戦略で知られています。RSI2は短期的な買われすぎ・売られすぎの市場状況を識別するのに役立ちます。本記事では、まず私たちの研究の動機を説明し、その後Connorsの代表的な3つの戦略をMQL5で再現し、S&P 500指数CFDのデイトレードに適用していきます。次に、それぞれの戦略の結果を分析し、取引におけるモデルシステム構築の概念を紹介します。最後に、これらの戦略の将来的な改善案も提案します。
動機
Larry Connorsはキャリアを通じて数多くの小口投資家向けクオンティティブ戦略を開発し、その研究成果を自身のWebサイトで公開しています。彼の多くの戦略は米国株式市場の日足を使って検証・取引されており、詳細なバックテストにより収益性が証明されています。しかし、彼のアイデアをより短期の時間枠に適用し、デイトレードに活用しているトレーダーは少数です。
本記事では、Connorsの代表的な3つの戦略をMQL5で実装し、米国株式市場のボラティリティを反映するためにUS500 CFDの30分足でテストします。このアプローチの目的は、ノイズが増加する一方で取引機会やサンプルサイズが拡大する高頻度取引において、彼の平均回帰コンセプトが価値をもたらすかどうかを検証することです。 US500指数CFDを選んだのは、Connorsがもともと株式向けに設計した戦略の市場環境を再現するためです。30分足の時間枠は、過剰なノイズを抑えつつ十分な取引活動を提供するバランスの取れた選択です。バックテストは過去1年間のデータを使用し、最新の市場環境を反映させます。
RSIの計算は次のとおりです。
RSIは、一定期間内の上昇バー数と下降バー数を計測し、移動平均などの平滑化手法を用いて、市場の相対的な勢いを示します。期間が短いほどRSIは感度が高くなりますが、その分ノイズも増えやすくなります。Connorsはこの高感度を活かし、2期間のRSI (RSI2)を使って短期的な売られすぎや買われすぎの状態を把握し、全体トレンドに沿った平均回帰取引のシグナルとして利用しています。
従来の平均回帰戦略であるボリンジャーバンドと比較すると、この手法にはいくつかの重要な相違点があります。
- RSI2はシンプルかつ迅速で、ボリンジャーバンドの多段階計算よりも短期的な反転に素早く反応します。
- RSI2は明確な買われすぎ(90超え)と売られすぎ(10未満)のレベルを提供しますが、ボリンジャーバンドのバンド接触シグナルは精度がやや劣ります。
- RSI2は価格のレンジやトレンドの文脈を考慮しませんが、ボリンジャーバンドはトレンドやボラティリティの変化を視覚的に捉えます。
総じて、この手法は極端な価格変動よりも、瞬間的なプルバックを捉えることに重点を置いています。
戦略1:Connors RSI2クラシック
Connors RSI2クラシック戦略は平均回帰の原理に基づいており、確立されたトレンド内の一時的なプルバックを利用します。強いトレンドにある資産でも、利益確定や市場のノイズによって短期的な下落を経験するという直感に基づいています。2期間のRSIを使い、たった2本の30分足で極端な売られすぎ/買われすぎ(5未満/95超え)を識別し、反発の可能性を示すシグナルを出します。広いトレンドに沿うために移動平均線を用いており、プルバックがトレンドの転換ではなく一時的なものである可能性を高めます。
この戦略は「Short-Term Trading Strategies That Work (2008)」で詳述されており、当時Connorsと研究パートナーであったCesar Alvarezによって厳密にバックテストされました。数年経った今でも有効かどうかを検証します。
シグナルルール
- 買いシグナルは、RSI2が5未満、直近の終値が200期間移動平均線より上、かつ現在ポジションなしの場合に発生します。
- 売りシグナルは、RSI2が95超え、直近の終値が200期間移動平均線より下、かつ現在ポジションなしの場合に発生します。
- 買いポジションの決済は、直近終値が5期間移動平均線を上回るか、200期間移動平均線を下回る場合におこないます。
- 売りポジションの決済は、直近終値が5期間移動平均線を下回るか、200期間移動平均線を上回る場合におこないます。
- ストップロスの距離は現在価格から0.15%に設定します。
MQL5コード
//US500 M30 #include <Trade/Trade.mqh> CTrade trade; input int Magic = 0; input double lot = 0.1; int barsTotal = 0; int handleMa; int handleMaFast; int handleRsi; const int Max = 5; const int Min = 95; const int MaPeriods = 200; const int MaPeriodsFast = 5; const double slp = 0.0015; int OnInit() { trade.SetExpertMagicNumber(Magic); handleMa =iMA(_Symbol,PERIOD_CURRENT,MaPeriods,0,MODE_SMA,PRICE_CLOSE); handleMaFast = iMA(_Symbol,PERIOD_CURRENT,MaPeriodsFast,0,MODE_SMA,PRICE_CLOSE); handleRsi = iRSI(_Symbol,PERIOD_CURRENT,2,PRICE_CLOSE); return(INIT_SUCCEEDED); } void OnDeinit(const int reason) { } void OnTick() { int bars = iBars(_Symbol,PERIOD_CURRENT); if (barsTotal!= bars){ barsTotal = bars; bool NotInPosition = true; double ma[]; double ma_fast[]; double rsi[]; CopyBuffer(handleMa,BASE_LINE,1,1,ma); CopyBuffer(handleMaFast,BASE_LINE,1,1,ma_fast); CopyBuffer(handleRsi,0,1,1,rsi); double lastClose = iClose(_Symbol, PERIOD_CURRENT, 1); for(int i = PositionsTotal()-1; i>=0; i--){ ulong pos = PositionGetTicket(i); string symboll = PositionGetSymbol(i); if(PositionGetInteger(POSITION_MAGIC) == Magic&&symboll== _Symbol){ NotInPosition = false; if((PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY&&(lastClose>ma_fast[0]||lastClose<ma[0])) ||(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL&&(lastClose<ma_fast[0]||lastClose>ma[0])))trade.PositionClose(pos); }} if(rsi[0]<Max&&NotInPosition&&lastClose>ma[0])executeBuy(); if(rsi[0]>Min&&NotInPosition&&lastClose<ma[0])executeSell(); } } void executeSell() { double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); bid = NormalizeDouble(bid,_Digits); double sl = bid*(1+slp); sl = NormalizeDouble(sl, _Digits); trade.Sell(lot,_Symbol,bid,sl); } void executeBuy() { double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); ask = NormalizeDouble(ask,_Digits); double sl = ask*(1-slp); sl = NormalizeDouble(sl, _Digits); trade.Buy(lot,_Symbol,ask,sl); }
典型的な取引は次のようになります。
2024年1月1日から2025年3月1日までのUS500 (M30)のバックテスト結果は次のとおりです。
ここでの取引頻度は、他のデイトレード戦略と比べてかなり高く、年間252営業日で平均1~2回の取引となります。これはRSI2が非常に反応が早く、極端なエントリー条件にも関わらず頻繁にシグナルを出すためと考えられます。平均利益は平均損失とほぼ同等であり勝率が通常50%を超える平均回帰戦略としては堅実な結果です。取引ルールは完全に対称的ですが、ショートトレードとロングトレードの勝率には差がありました。2024年の強気相場においてはショートトレードの勝率が高く、取引回数も少なめであったことから、この戦略では強気のプルバックを捉えるのがやや難しいことが示唆されます。
戦略2:RSI2プルバック
RSI2プルバック戦略は、複数の連続した極端なRSI値を条件とすることで平均回帰トレードを改善します。長期トレンドにある資産が、急激かつ複数本のバーによるプルバックに直面した場合、その反発の可能性が高まるという考え方です。従来のRSI2よりやや高めの閾値を設定し、その閾値を上回るか下回るRSI値が3本連続することを組み合わせることで、シグナルが強化され、降伏を示唆し、短期反転の確率を高めます。
この戦略はLarry Connorsのフレームワークを基にしていますが、連続した複数の極端なRSI読み値の条件を追加し、独特なエグジットルールを導入するなど改良を加えています。エグジットは、ポジションが直前のローソク足の高値または安値を超えた時点でおこないます。このエグジット方法は、短期反転の際に前のローソク足の高値・安値を突破する反転バーがよく現れることに着目し、これにより素早く決済して小さな利益を素早く確定できるようにしています。
シグナルルール
- 買いシグナルは、過去3本のRSI2値がすべて10未満で、直近終値が200期間移動平均線より上にある、かつ現在ポジションなしの場合に発生します。
- 売りシグナルは、過去3本のRSI2値がすべて90超えで、直近終値が200期間移動平均線より下、かつ現在ポジションなしの場合に発生します。
- 買いポジションの決済は、直近終値が2本前のローソク足の高値を上回るか、200期間移動平均線を下回る場合におこないます。
- 売りポジションの決済は、直近終値が2本前のローソク足の安値を下回るか、200期間移動平均線を上回る場合におこないます。
- ストップロスの距離は現在価格から0.15%に設定します。
MQL5コード
//US500 M30 #include <Trade/Trade.mqh> CTrade trade; input int Magic = 0; input double lot = 0.1; int barsTotal = 0; int handleMa; int handleRsi; const int Max = 10; const int Min = 90; const int MaPeriods = 200; const double slp = 0.0015; int OnInit() { trade.SetExpertMagicNumber(Magic); handleMa =iMA(_Symbol,PERIOD_CURRENT,MaPeriods,0,MODE_SMA,PRICE_CLOSE); handleRsi = iRSI(_Symbol,PERIOD_CURRENT,2,PRICE_CLOSE); return(INIT_SUCCEEDED); } void OnDeinit(const int reason) { } void OnTick() { int bars = iBars(_Symbol,PERIOD_CURRENT); if (barsTotal!= bars){ barsTotal = bars; bool NotInPosition = true; double ma[]; double rsi[]; CopyBuffer(handleMa,BASE_LINE,1,1,ma); CopyBuffer(handleRsi,0,1,3,rsi); double lastClose = iClose(_Symbol, PERIOD_CURRENT, 1); double lastlastHigh = iHigh(_Symbol,PERIOD_CURRENT,2); double lastlastLow = iLow(_Symbol,PERIOD_CURRENT,2); for(int i = PositionsTotal()-1; i>=0; i--){ ulong pos = PositionGetTicket(i); string symboll = PositionGetSymbol(i); if(PositionGetInteger(POSITION_MAGIC) == Magic&&symboll== _Symbol){ NotInPosition = false; if((PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY&&(lastClose>lastlastHigh||lastClose<ma[0])) ||(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL&&(lastClose<lastlastLow||lastClose>ma[0])))trade.PositionClose(pos); }} if(rsi[0]<Max&&rsi[1]<Max&&rsi[2]<Max&&NotInPosition&&lastClose>ma[0])executeBuy(); if(rsi[0]>Min&&rsi[1]>Min&&rsi[2]>Min&&NotInPosition&&lastClose<ma[0])executeSell(); } } void executeSell() { double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); bid = NormalizeDouble(bid,_Digits); double sl = bid*(1+slp); sl = NormalizeDouble(sl, _Digits); trade.Sell(lot,_Symbol,bid,sl); } void executeBuy() { double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); ask = NormalizeDouble(ask,_Digits); double sl = ask*(1-slp); sl = NormalizeDouble(sl, _Digits); trade.Buy(lot,_Symbol,ask,sl); }
典型的な取引は次のようになります。
2024年1月1日から2025年3月1日までのUS500 (M30)のバックテスト結果は次のとおりです。
この戦略は、前の戦略に比べて取引頻度が低くなっています。これは、エントリー条件として3本連続の極端なRSI値が要求されるためです。ロングトレードの勝率は、正直なところ特筆すべきほど高くありません。前の戦略でも触れたように、私たちは基本的にわずか2~3本のローソク足による小さな反発をスキャルピングしているため、2024年の強気トレンドにおける大きなボラティリティを十分に活かしきれていない可能性があります。これについては、複数年にわたってテストをおこない、異なる市場環境からのデータを蓄積することで、バランスが取れるかもしれません。
戦略3:RSI2買われすぎ/売られすぎ
RSI2買われすぎ/売られすぎ戦略は、資産のトレンド性に応じてエグジットレベルが調整されるため、より柔軟性があります。この戦略も、極端なRSI2の数値が「行きすぎた動き」であり、反転が近いことを示すと仮定しており、トレーダーは押し目(売られすぎ)での買い、または戻り(買われすぎ)での売りを狙うことができます。前の2つの戦略と異なり、この戦略はチューニング可能なRSI閾値に基づく、より動的なエグジットを特徴としています。ただし注意点として、RSIは2期間であっても平滑化されており、価格アクションよりも遅れて反応するため、「ファットテールリスク(急激な価格変動)」にさらされやすく、もし取引がすぐに逆行した場合はストップロスだけが損失を抑える手段となります。
また、200期間移動平均線は一般的に強気の株式市場における長期トレンドの判定に使用されます。そのため、前の2つの戦略ではConnorsはロングオンリーに設計していました。しかし、今回私たちはCFDを使ったデイトレードであるため、すべての戦略をロング・ショートの両方に対応させています。この戦略については、Connors自身が株式の空売りを含む両サイドで機能するものとして紹介しており、50期間移動平均線をトレンド判定に用いることで、より短期的なトレンド変化に対応できる設計になっています。ショートポジションは長期トレンドよりも短期的な急変に結びつくことが多いためです。
この戦略はLarry Connorsの研究に基づいており、彼の著作やセミナーの中で、インジケーターを柔軟に活用する方法として紹介されており、市場の状況に応じてロング・ショートの両方に適用可能です。
シグナルルール
- 買いシグナルは、RSI2が5未満、直近終値が50期間移動平均線より上、かつ現在ポジションなしの場合に発生します。
- 売りシグナルは、RSI2が95超え、直近終値が50期間移動平均線より下、かつ現在ポジションなしの場合に発生します。
- 買いポジションの決済は、RSI2が70を超えたときにおこないます。
- 売りポジションの決済は、RSI2が30を下回ったときにおこないます。
- ストップロスの距離は現在価格から1%に設定します。
MQL5コード
//US500 M30 #include <Trade/Trade.mqh> CTrade trade; input int Magic = 0; input double lot = 0.1; const int Max = 5; const int Min = 95; const int MaPeriods = 50; const double slp = 0.01; int barsTotal = 0; int handleMa; int handleRsi; int OnInit() { trade.SetExpertMagicNumber(Magic); handleMa =iMA(_Symbol,PERIOD_CURRENT,MaPeriods,0,MODE_SMA,PRICE_CLOSE); handleRsi = iRSI(_Symbol,PERIOD_CURRENT,2,PRICE_CLOSE); return(INIT_SUCCEEDED); } void OnDeinit(const int reason) { } void OnTick() { int bars = iBars(_Symbol,PERIOD_CURRENT); if (barsTotal!= bars){ barsTotal = bars; bool NotInPosition = true; double ma[]; double rsi[]; CopyBuffer(handleMa,BASE_LINE,1,1,ma); CopyBuffer(handleRsi,0,1,1,rsi); double lastClose = iClose(_Symbol, PERIOD_CURRENT, 1); for(int i = PositionsTotal()-1; i>=0; i--){ ulong pos = PositionGetTicket(i); string symboll = PositionGetSymbol(i); if(PositionGetInteger(POSITION_MAGIC) == Magic&&symboll== _Symbol){ NotInPosition = false; if((PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY&&rsi[0]>70) ||(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL&&rsi[0]<30))trade.PositionClose(pos); }} if(rsi[0]<Max&&NotInPosition&&lastClose>ma[0])executeBuy(); if(rsi[0]>Min&&NotInPosition&&lastClose<ma[0])executeSell(); } } void executeSell() { double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); bid = NormalizeDouble(bid,_Digits); double sl = bid*(1+slp); sl = NormalizeDouble(sl, _Digits); trade.Sell(lot,_Symbol,bid,sl); } void executeBuy() { double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); ask = NormalizeDouble(ask,_Digits); double sl = ask*(1-slp); sl = NormalizeDouble(sl, _Digits); trade.Buy(lot,_Symbol,ask,sl); }
典型的な取引は次のようになります。
2024年1月1日から2025年3月1日までのUS500 (M30)のバックテスト結果は次のとおりです。
前の2つの戦略と比べて、この戦略は勝率が高い一方で、エクイティカーブ上の緑色の線に見られるように、浮動ドローダウンが大きくなる傾向があります。これは、先に述べたファットテールリスク(英語)と、それに対応するために通常より広めのストップロスが必要であるという点に関連しています。 ファットテールリスクとは、分布の中で極端な事象が発生する確率が通常よりも高いことを意味し、平均回帰戦略ではこれが大きな損失につながることがあります。価格が過去の平均に戻ると想定しているこれらの戦略において、予期しない大きな価格変動(ファットテール分布で頻発する)が起こると、想定していた反転が発生せず、通常の分布では予測できないようなリスクや損失が拡大する可能性があります。この戦略はプロフィットファクターが高いという利点を持っているものの、実運用可能な戦略とするためには、このドローダウンへの対応が必要不可欠です。
振り返り
今回紹介した3つの戦略を振り返ってみると、コードやシグナルルールの構造はかなり似通っていることがわかります。これは主に、これらすべてが「RSI2平均回帰モデルシステム」に基づいているためです。一度堅牢なモデルシステムが構築されていれば、そこからルールを少し調整するだけで複数の戦略を生み出すことは比較的容易になります。では、CTA取引におけるモデルシステムと単一戦略の違いを明確にしておきましょう。
単一戦略は、特定の時間枠と銘柄に結びついており、シグナルルールも詳細で、他の条件に簡単に使い回すことはできません。一方、モデルシステムは、平均回帰、トレンドフォロー、モメンタム、ブレイクアウトといった歴史的に実証済みのコンセプトに基づいて、自分の優位性を見出すための汎用的な出発点です。そして、特定のモデルシステムとは、その大枠の中に主要なシグナルソースを組み合わせたものであり、本記事におけるRSI2平均回帰がその一例です。モデルシステムは、時間枠、銘柄、シグナルルールを問わず適用できる柔軟性があり、複数の戦略を効率よく生成して、分散されたポートフォリオを構築しやすくなります。
モデルシステムをベースに戦略を開発するには、以下のようなことを意識するのが有効です。
- すべてのシグナルや価格差は正規化することで定常的に扱うか、価格に対するパーセンテージで計算し、異なる銘柄や時間枠にスケーラブルに適用できるようにする。
- 時間枠や銘柄をコード内でハードコーディングせず、_SymbolやPERIOD_CURRENTを使って、バックテスト中でも条件に応じて自動的に調整されるようにする。
- 戦略はエントリーとエグジットのルールを明確に分けて整理し、それぞれについて同じ優位性をとらえる別の代替ルールを検討する。
- 再利用可能なロジックは関数化し、コードの可読性とメンテナンス性を高め、シグナルの微調整をしやすくする。
戦略ではなくモデルとして思考するという考え方を理解したところで、ここからはRSI2平均回帰モデルをより取引可能な戦略に改善するための提案をいくつか紹介します。
- US500のM30以外の時間枠や銘柄で戦略をテストし、現在よりも良い条件が存在するか検証すること。先読みバイアスを避けるために、すべての発見はインサンプルデータ上でおこなうこと。
- RSIの代わりにROCやVIXといった他のモメンタムトレンド指標を使ってみたり、移動平均をカルマンフィルターなどに置き換えてみること。
- エントリーとエグジットのルールを他の平均回帰系戦略と組み合わせてみること。例えば、ボリンジャーバンドでエントリーを判断し、本記事のエグジットルールをそのまま使うといった工夫。
こうしたアプローチは、経験豊富なCTA系クオンツ研究者が戦略をより効率的に構築するために日常的に用いているテクニックです。新しい戦略のアイデアを出すことは、まったく新しい発明をすることではなく、既存で実証済みのモデルを組み合わせたり、わずかに改良したりすることに本質があります。この分野の作業は抽象的であるため、機械には任せきれない一方で、明確なプロセスがあるため、人間が手順を追いながらデータを掘り出していくことができるのです。
結論
本記事では、まずRSI2平均回帰のコンセプトから、なぜイントラデイ戦略を構築しようと考えたのか、その理由を説明しました。次に、Larry Connorsによる有名な3つの戦略を取り上げ、それぞれのシグナルルールの背景にある考え方を解説し、正確なエントリーおよびエグジット条件を明示しながら、MetaTrader 5上でバックテストを実施しました。その後、単一戦略ではなく「モデルシステム」から戦略を構築するという発想を紹介し、このアプローチを実践に活かすための具体的なヒントや、RSI2平均回帰モデルをさらに収益性の高いものに発展させるための改善案も提案しました。まとめると、本記事はトレーダーにとって明快なフレームワークを提示するものです。つまり、ネット上で公開されている有名な戦略を出発点にし、それを少しアレンジしてMQL5でテストすることで、より洗練された戦略へと進化させるという手法です。このプロセスは習得が容易であり、戦略開発の効率を大きく向上させることができます。
ファイルの表
ファイル名 | 説明 |
---|---|
RSI2_V1.mq5 | 最初の戦略用のEA |
RSI2_V2.mq5 | 2番目の戦略用のEA |
RSI2_V3.mq5 | 3番目の戦略用のEA |
MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/17636
警告: これらの資料についてのすべての権利はMetaQuotes Ltd.が保有しています。これらの資料の全部または一部の複製や再プリントは禁じられています。
この記事はサイトのユーザーによって執筆されたものであり、著者の個人的な見解を反映しています。MetaQuotes Ltdは、提示された情報の正確性や、記載されているソリューション、戦略、または推奨事項の使用によって生じたいかなる結果についても責任を負いません。





- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索