結論から言います。ロング・ショート戦略は、良い銘柄を買い(ロング)、悪い銘柄を売る(ショート)ことで、市場全体の値動き(β)を抑えつつ超過リターン(α)を狙う手法です。初心者でも、銘柄選定とヘッジの基本さえ押さえれば実装は可能です。本稿は、シンプルな設計からリスク管理、実運用の落とし穴、さらにMQL4
によるEAテンプレートまでを一気通貫で解説します。
ロング・ショートとは何か(1分で要点)
買いと売りを同時に持つことで市場方向の影響を減らし、銘柄間の優劣から収益を狙います。ポートフォリオリターンは概念的に、
R_p = w_L cdot R_L - w_S cdot R_S
(wは建玉比率)。β中立を目指すなら、β_L cdot w_L ≈ β_S cdot w_S
となるように調整します。
なぜ機能するのか(直線的なロジック)
αの源泉は主に3つです。
- バリュー(PER・PBR・EV/EBITDAなどが相対的に低い)
- クオリティ(ROE・マージン・安定成長・財務健全性)
- モメンタム(過去の相対強弱の継続性、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 + ε_L
、R_S = α_S + β_S R_M + ε_S
。β中立ならw_L β_L - w_S β_S ≈ 0
⇒ w_S = w_L (β_L/β_S)
。
サイズ決定(ボラ目標のスケーリング)
直近60営業日の年率ボラをσ_p
とし、目標ボラσ*
に合わせてレバレッジλ = σ*/σ_p
で建玉を全体スケール。これで過度なリスク変動を抑制。
エントリー/エグジット(明確化)
- エントリー:月次(もしくは週次)にスコア上位をロング、下位をショート。
- エグジット:スコア順位が閾値外に出たら入替。損切りは
個別-5%/日
やバスケット-2σ
など複層。 - トレーリング:
ATR×k
や最高値からの乖離率で追随。
ケーススタディ(同業種ペアで始める)
初心者は同業種・同セクターのペアが無難です。例として、同じ業種Aの銘柄XとYの価格比ratio = Close(X)/Close(Y)
を見ます。過去200本で平均・標準偏差を算出し、
z = (ratio - mean)/std
。z > 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. システムに従い損切りとポジション縮小。例外運用をしない。
まとめ(実装順序)
- ユニバース選定(同業種・流動性・借株可)。
- Value/Quality/Momentumの複合スコア構築。
- 上位ロング・下位ショート、β中立化。
- ボラ目標スケーリング、損切り・トレーリング。
- 月次リバランスとイベント前縮小、コスト徹底控除。
- 小さく始めてルール準拠を守る。これが最速の上達です。
コメント