ロング・ショート戦略入門:初心者でもできる市場中立の超過リターン獲得ガイド

クオンツ

結論から言います。ロング・ショート戦略は、良い銘柄を買い(ロング)、悪い銘柄を売る(ショート)ことで、市場全体の値動き(β)を抑えつつ超過リターン(α)を狙う手法です。初心者でも、銘柄選定とヘッジの基本さえ押さえれば実装は可能です。本稿は、シンプルな設計からリスク管理、実運用の落とし穴、さらにMQL4によるEAテンプレートまでを一気通貫で解説します。

スポンサーリンク

ロング・ショートとは何か(1分で要点)

買いと売りを同時に持つことで市場方向の影響を減らし、銘柄間の優劣から収益を狙います。ポートフォリオリターンは概念的に、

R_p = w_L cdot R_L - w_S cdot R_Swは建玉比率)。β中立を目指すなら、β_L cdot w_L ≈ β_S cdot w_Sとなるように調整します。

なぜ機能するのか(直線的なロジック)

αの源泉は主に3つです。

  1. バリュー(PER・PBR・EV/EBITDAなどが相対的に低い)
  2. クオリティ(ROE・マージン・安定成長・財務健全性)
  3. モメンタム(過去の相対強弱の継続性、12-1など)

「良い指標の上位銘柄を買い、下位銘柄を売る」だけで、方向性の影響を薄めたα抽出が可能になります。

設計の全体像(初心者向けチェックリスト)

  • 投資ユニバース:同一市場・同一業種中心。情報・流動性・借株可否が確保できる範囲。
  • スコアリング:Value(低PER/低PBR/高配当)、Quality(高ROE/安定EPS成長)、Momentum(12-1・6-1)。複合Zスコアで統合。
  • ポジション構築:上位N銘柄ロング、下位N銘柄ショート。Gross(総建玉)とNet(純建玉)を明示。例:Gross=200%、Net=0%
  • β中立化:回帰でヘッジ比率hを推定。R_L - h cdot R_Sのβが0に近づくように調整。
  • リスク目標:年率ボラ10%など。target_vol / realized_volでレバレッジをスケーリング。
  • 売買コスト:スプレッド・手数料・借株料・配当調整を必ず控除シミュレーション。
  • 執行:VWAP/時間分散、板厚・出来高・指値の優先順位を決める。
  • リバランス:月1〜週1。入替頻度↑=コスト↑、だが反応速度↑。

指標の作り方(初心者向けに式で示す)

Value例

各銘柄iのスコア:score_value_i = - z(PER_i) - z(PBR_i) - z(EV/EBITDA_i)(低いほど良いとみなすので符号を反転)。

Quality例

score_quality_i = z(ROE_i) + z(営業利益率_i) + z(EPS成長安定度_i)

Momentum例

score_mom_i = z(リターン_{{t-12→t-1}})(直近1か月は反転回避で除外)。

総合スコア

score_i = 0.4×value + 0.3×quality + 0.3×momentum(配分は任意、過学習に注意)。

β中立の実務(1式で分かる)

市場指数(M)に対するβを線形回帰で推定し、ロングとショートのβが打ち消し合うようにw_L, w_Sを調整します。

例:R_L = α_L + β_L R_M + ε_LR_S = α_S + β_S R_M + ε_S。β中立ならw_L β_L - w_S β_S ≈ 0w_S = w_L (β_L/β_S)

サイズ決定(ボラ目標のスケーリング)

直近60営業日の年率ボラをσ_pとし、目標ボラσ*に合わせてレバレッジλ = σ*/σ_pで建玉を全体スケール。これで過度なリスク変動を抑制。

エントリー/エグジット(明確化)

  • エントリー:月次(もしくは週次)にスコア上位をロング、下位をショート。
  • エグジット:スコア順位が閾値外に出たら入替。損切り個別-5%/日バスケット-2σなど複層。
  • トレーリングATR×kや最高値からの乖離率で追随。

ケーススタディ(同業種ペアで始める)

初心者は同業種・同セクターのペアが無難です。例として、同じ業種Aの銘柄XとYの価格比ratio = Close(X)/Close(Y)を見ます。過去200本で平均・標準偏差を算出し、

z = (ratio - mean)/stdz > 1.5比率が高すぎ⇒X売り/Y買い。z < -1.5でX買い/Y売り。|z| < 0.5で手仕舞い。これだけでシンプルなロング・ショートが成立します。

実務の落とし穴(ここを外すと負ける)

  • コスト軽視:スプレッド・手数料・借株料・配当調整は累積でαを食い尽くす。必ず控除。
  • ネットエクスポージャの漂流:日次でβやNetがズレる。再ヘッジをルール化。
  • イベントリスク:決算・増資・上場廃止・売買停止。カレンダー管理とポジ縮小を徹底。
  • 相関の崩壊:危機局面で相関が一時的に0→1へ。Grossを抑え、証拠金余力を厚く取る。

超実践:MQL4 EAテンプレ(ペア・ロングショート)

以下はMetaTrader4で動く最小構成のEAです。2銘柄(例:株価指数CFDや個別株CFD)で比率のZスコアを用いたロングショートを自動化します。学習・検証用に簡素化しています(スリッページ・例外処理・ロット計算・約定判定などは環境に合わせて拡張してください)。


//+------------------------------------------------------------------+
//|  Pair Long-Short Z-Score EA (Educational)                       |
//|  Disclaimer: For study. Test on demo first.                     |
//+------------------------------------------------------------------+
#property strict
input string  LongSymbol   = "JP225Cash";   // ロング対象
input string  ShortSymbol  = "US30Cash";    // ショート対象
input int     Lookback     = 200;           // Zスコア計算本数
input double  ZEnter       = 1.5;           // エントリー閾値
input double  ZExit        = 0.5;           // 手仕舞い閾値
input double  Lots         = 0.10;          // 基本ロット
input int     Slippage     = 5;
input int     Magic        = 880031;

double Ratio(int shift){
   double cL = iClose(LongSymbol, PERIOD_CURRENT, shift);
   double cS = iClose(ShortSymbol, PERIOD_CURRENT, shift);
   if(cL == 0 || cS == 0) return 0;
   return cL / cS;
}

bool HavePosition(){
   for(int i=OrdersTotal()-1; i>=0; i--){
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
         if(OrderMagicNumber()==Magic) return true;
      }
   }
   return false;
}

void CloseAll(){
   for(int i=OrdersTotal()-1; i>=0; i--){
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
         if(OrderMagicNumber()!=Magic) continue;
         int type = OrderType();
         string sym = OrderSymbol();
         double vol = OrderLots();
         if(type==OP_BUY)  OrderClose(OrderTicket(), vol, MarketInfo(sym, MODE_BID), Slippage, clrNONE);
         if(type==OP_SELL) OrderClose(OrderTicket(), vol, MarketInfo(sym, MODE_ASK), Slippage, clrNONE);
      }
   }
}

int OnInit(){ return(INIT_SUCCEEDED); }

void OnTick(){
   if(Bars<=Lookback+5) return;
   // Z-score 計算
   double m=0, s=0;
   for(int i=1;i<=Lookback;i++) m += Ratio(i);
   m /= Lookback;
   for(int i2=1;i2<=Lookback;i2++){ double d=Ratio(i2)-m; s += d*d; }
   s = MathSqrt(s/Lookback);
   if(s==0) return;
   double z = (Ratio(0)-m)/s;

   // 既存ポジ状態を確認
   bool hasPos = HavePosition();

   // エグジット条件
   if(hasPos && MathAbs(z) <= ZExit){
      CloseAll();
      return;
   }

   // エントリー条件
   if(!hasPos){
      // z>ZEnter: ロング/ショートを逆に(比率高すぎ→LongSymbol売り、ShortSymbol買い)
      if(z >= ZEnter){
         int t1 = OrderSend(LongSymbol, OP_SELL, Lots, MarketInfo(LongSymbol, MODE_BID), Slippage, 0,0, "LS Short L", Magic, 0, clrRed);
         int t2 = OrderSend(ShortSymbol, OP_BUY,  Lots, MarketInfo(ShortSymbol, MODE_ASK), Slippage, 0,0, "LS Long S",  Magic, 0, clrBlue);
      }
      // z<-ZEnter: LongSymbol買い、ShortSymbol売り
      if(z <= -ZEnter){
         int t3 = OrderSend(LongSymbol, OP_BUY,  Lots, MarketInfo(LongSymbol, MODE_ASK), Slippage, 0,0, "LS Long L", Magic, 0, clrBlue);
         int t4 = OrderSend(ShortSymbol, OP_SELL, Lots, MarketInfo(ShortSymbol, MODE_BID), Slippage, 0,0, "LS Short S",Magic, 0, clrRed);
      }
   }
}

リスク管理(数字で縛る)

  • 最大ドローダウン閾値:例)-10%でGross半減、-15%で全決済。
  • 銘柄上限:1銘柄あたりの寄与が総リスクの10%を超えない。
  • 相関監視:日次でロングバスケットとショートバスケットの相関・βを再推定。
  • イベント前縮小:決算前はGross 30%低下。

よくある質問(簡潔に)

Q. 初心者は何から始める?
A. 同業種ペア1〜2組でZスコア手法から。βやボラの理解を優先。

Q. どの頻度で組み替える?
A. 月次を基本。コストと反応速度のトレードオフを意識。

Q. 逆行が続いたら?
A. システムに従い損切りとポジション縮小。例外運用をしない。

まとめ(実装順序)

  1. ユニバース選定(同業種・流動性・借株可)。
  2. Value/Quality/Momentumの複合スコア構築。
  3. 上位ロング・下位ショート、β中立化。
  4. ボラ目標スケーリング、損切り・トレーリング。
  5. 月次リバランスとイベント前縮小、コスト徹底控除。
  6. 小さく始めてルール準拠を守る。これが最速の上達です。

コメント

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