包括的なスクリーニングフレームワークを構築します。計算資源を最大限活用して、各理論を統合した時系列分析システムを設計します。
| ステージ | 特徴 | 価格位置 | 移動平均線の配置 | 出来高特性 |
|---|---|---|---|---|
| Stage 1 | ベース構築・底値圏 | 30週MA周辺で横ばい | 30週MAが水平、価格を横断 | 減少傾向 |
| Stage 2 | 上昇トレンド | 30週MA・200日MAの上 | 上向き、正配列 | 上昇時に拡大 |
| Stage 3 | 天井圏・分配 | 高値付近で横ばい | 平坦化、価格を横断 | 不規則 |
| Stage 4 | 下降トレンド | 30週MA・200日MAの下 | 下向き、逆配列 | 下落時に拡大 |
Stage 2上昇トレンドの確認には、以下の8つの基準すべてを満たす必要があります:
| # | 基準 | 詳細 |
|---|---|---|
| 1 | 現在価格 > 150日MA & 200日MA | 両方の長期MAを上回っていること |
| 2 | 150日MA > 200日MA | 中期MAが長期MAより上 |
| 3 | 200日MAが上昇トレンド | 最低1ヶ月、理想的には4-5ヶ月 |
| 4 | 50日MA > 150日MA & 200日MA | 短期MAが中長期MAより上 |
| 5 | 現在価格 > 50日MA | 短期MAの上で取引 |
| 6 | 52週安値から30%以上上 | 底値から十分に回復 |
| 7 | 52週高値の25%以内 | 高値に近いほど良い |
| 8 | RS Rating ≥ 70 | 理想的には80-90 |
移動平均線の対応関係:
- 10週MA ≈ 50日MA(短期)
- 30週MA ≈ 150日MA(中期)
- 40週MA ≈ 200日MA(長期)
Stage 1のサブステージ:
- Stage 1A: ベースの開始、さらに時間が必要
- Stage 1: ベース形成期、蓄積を開始してもよい
- Stage 1B: ベース構築の後期、ブレイクアウトを監視
Stage 2のサブステージ:
- Stage 2A: 上昇トレンド初期、積極的に購入する理想的な時期
- Stage 2: 上昇段階の中期
- Stage 2B: 上昇トレンド後期、警戒が必要
Stage 3のサブステージ:
- Stage 3A: 天井が形成され始め、厳格なストップで保有を保護
- Stage 3: 天井エリア、ポジションの削減を開始
- Stage 3B: 天井感が強まる、反発を利用して売却
Stage 4のサブステージ:
- Stage 4A: 下降トレンド段階に入った、残りのポジションを閉じる
- Stage 4: 下降段階、ロング側では避ける
- Stage 4B: 下降トレンド後期、購入を検討するのはまだ早い
- Stage 4B-: まだ正式にStage 1Aではないが、安値を見た可能性
ベースの種類と条件:
| ベースタイプ | 最小期間 | 最大期間 | 深さ(修正率) | 特徴 | 成功率 |
|---|---|---|---|---|---|
| Cup with Handle | 7週 | 65週 | 12-35% | 最も信頼性高い | 95% (強気市場) |
| Double Bottom (W) | 7週 | 65週 | 20-30% | W字型、2番目の安値が重要 | 88% |
| Flat Base | 5週 | 65週 | 10-15% | 浅い調整、二次段階 | - |
| High Tight Flag | 3週 | 8週 | 10-25% | 8週間で2倍+急騰後 | 極めて稀 |
| Saucer with Handle | 7週+ | 長期 | 12-30% | カップより長期 | - |
| Ascending Base | 5週 | 20週 | 10-20% | 段階的上昇 | - |
| Square Box | 4週 | 7週 | - | 迅速な統合、二次段階 | - |
ベースの質的評価項目:
-
期間要件
- William O'Neilの原則:「極めて稀なハイタイトフラッグ、5-6週間のフラットベース、4-7週間のスクエアボックスを除き、最も信頼できるベースパターンは最低7-8週間の価格統合を必要とする」
- 理想的な期間:7-12週間
- 長すぎる(>30週):エネルギーの消散リスク
-
深さ基準
- 理想的:15-30%
- カップウィズハンドル:12-35%
- 深すぎる(>40%):ダメージが大きい、警戒が必要
-
ハンドル形成
- 期間:1-2週間が理想
- 深さ:カップ全体の高さの1/3以下
- 配置:カップの上半分に形成
- 下向きに傾斜することが理想
-
ベース内の価格行動
- ベース右側が左側より高い(健全な蓄積)
- 価格変動幅が徐々に縮小
- タイトな価格行動(最終段階で1-3%の狭いレンジ)
-
出来高パターン
- ベース左側:高い(売り圧力)
- ベース中期:徐々に減少
- ベース右側:極めて低い(Dry Up、供給の枯渇)
- ブレイクアウト時:急増(平均の2-3倍以上)
ベースカウンティング(Mark Minervini):
| ベース番号 | 推奨度 | 特徴 | 失敗率 |
|---|---|---|---|
| ベース1-2 | ★★★★★ 最優先 | まだ一般大衆に知られていない | 低い |
| ベース3 | ★★★☆☆ 許容可能 | 一般大衆に明らかになり始める | 中程度 |
| ベース4以降 | ★☆☆☆☆ 非推奨 | 深い押し下げが起こりやすい | 高い |
重要原則:
- Stage 2上昇トレンド内で1番目または2番目のベース中にエントリーすることを推奨
- 最高のスーパーパフォーマンス株式は、通常、Stage 2サイクル中に6つ以上のベースを構築しない
- 4-5個のベースがより一般的で、その後Stage 3が始まる
基本定義: 重要な高値更新時点を起点として計算される出来高加重平均価格であり、その時点から現在までの市場参加者の平均コストと市場心理を表す動的な基準線。
計算式:
Anchored VWAP = Σ(価格 × 出来高) / Σ(出来高)
起点:高値更新日から累積的に計算
アンカーポイント設定の原則:
-
ベースブレイクアウト日からのVWAP
- Stage 1→Stage 2移行時の高値
- その後の上昇トレンドでのサポート/レジスタンス
-
52週高値更新日からのVWAP
- 重要な心理的節目
- 機関投資家の平均コスト
-
Stage 3の天井からのVWAP
- 前回の分配レベル
- バッグホルダーの損益分岐点
判定基準:
| 条件 | 解釈 | 意味 |
|---|---|---|
| 価格 > VWAP | 買い需要優勢 | 機関投資家が利益圏内 |
| 価格 < VWAP | 売り圧力優勢 | 供給圧力が継続 |
| VWAPでの反発 | サポート機能 | 蓄積の兆候 |
| VWAPでの拒否 | レジスタンス機能 | 分配の兆候 |
| VWAPからの乖離 | +5%以内が健全 | 過度の乖離は警戒 |
| VWAP上昇角度 | 30度以上が理想 | トレンドの強さ |
IPO株における特別な応用:
システムアクティブ化条件:
- IPO後に高値を更新(H)
- その後50日間、新高値を更新できない
- この時点で高値固定VWAPが意味を持ち始める
理論的根拠:
- IPOは需要と供給を分析するのに十分な価格履歴ができるまで待つのが最善
- 大きなStage 1ベースほどレジスタンスが少なくなる
- より多くの売り手が株を離れることで、株はより強い手(機関投資家)に渡る
ステージ理論との統合:
Stage 1での役割:
- 前回の分配レベル(Stage 3の天井)の特定
- バッグホルダーの損益分岐点
- 主要なレジスタンスゾーンの可視化
- 価格が高値固定VWAPを50日以上上抜けできない → Stage 1の延長
Stage 3での役割:
- 分配フェーズの検出
- 価格が高値固定VWAPで3回以上拒否される → 分配の兆候
- 各テスト時の出来高減少 → 買い圧力の枯渇
- Last Point of Supply (LPSY)の客観的測定
基本定義: 株価が移動平均線からどれだけ乖離しているかを、ATR(Average True Range)のパーセンテージで正規化し、その乖離がATR%の何倍に相当するかを測定する指標。
計算方法:
ステップ1: ATR%の計算
ATR% = (ATR / 終値) × 100
ステップ2: 移動平均線からの乖離率の計算
乖離率(%) = ((終値 - MA) / MA) × 100
ステップ3: ATR Multipleの計算
ATR Multiple = 乖離率(%) / ATR%
パラメータ設定:
- ATR期間: 14日(Wilder推奨)、短期は7-10日、長期は20-50日
- 移動平均線: 50日SMA(最も一般的)、他に21日EMA、200日SMA
判定基準(50日MAベース):
| ATR Multiple | 状態 | アクション | ステージとの関係 |
|---|---|---|---|
| -3.0以下 | 極度の売られすぎ | Stage 4末期、Stage 1移行監視 | Stage 4B末期 |
| -2.0 ~ -1.0 | 大きな調整 | ベース形成の可能性 | Stage 1初期 |
| -0.5 ~ +0.5 | ベース内、正常範囲 | エントリー準備 | Stage 1後期 |
| 0 ~ +3.0 | 健全な上昇 | トレンド継続、ホールド | Stage 2前期 |
| +3.0 ~ +5.0 | 軽度の過剰拡張 | 注意深く監視 | Stage 2中期 |
| +5.0 ~ +7.0 | 中程度の過剰拡張 | 部分利確を検討 | Stage 2後期 |
| +7.0 ~ +10.0 | 高度な過剰拡張 | 利確開始(重要!) | Stage 2B |
| +10.0以上 | 極度の過剰拡張 | 積極的な利確 | Stage 3移行リスク |
重要原則:
- 「トレーダーがポジションが50日MAからATR%の7-10倍を超えたときに利益確定を開始することで、感情的な決定や機会損失を防ぐ」
- Stage 2上昇トレンド内でも、ATR Multiple 7-10倍は過熱の兆候
- 各銘柄には歴史的なATR倍数の傾向があるため、過去のデータ分析が重要
市場環境による調整:
強気市場:
標準閾値 × 1.2-1.5倍:
- 通常時: 7倍で利確開始
- ブル市場: 8.5-10倍で利確開始
- 理由: モメンタムが強く、過剰拡張が持続
弱気市場:
標準閾値 × 0.6-0.8倍:
- 通常時: 7倍で利確開始
- ベア市場: 4-5.5倍で利確開始
- 理由: モメンタムが弱く、反転が早い
銘柄カテゴリー別の調整:
| カテゴリー | 最適閾値 | 特徴 |
|---|---|---|
| 大型成長株 | 8-12倍 | モメンタム持続 |
| 中型成長株 | 7-10倍 | バランス型(標準) |
| 小型株 | 5-8倍 | ボラティリティ高 |
| ディフェンシブ株 | 4-6倍 | 低ボラティリティ |
ステージ別の実践:
Stage 2での活用:
- ATR Multiple 0-3倍: ベース形成、エントリー準備
- ATR Multiple 3-5倍: 健全な上昇、ホールド
- ATR Multiple 5-7倍: 後期Stage 2、警戒
- ATR Multiple 7-10倍: Stage 2B可能性、部分利確
- ATR Multiple 10倍以上: Stage 3移行リスク、積極的利確
Stage 3での活用:
- 新高値試行時のATR Multiple低下 → モメンタム減衰
- 継続的なATR Multiple低下 → 分配フェーズ確認
- マイナス圏への突入 → Stage 4移行、完全撤退
ベースカウンティングとの関連:
| ベース番号 | 典型的なATR Multiple範囲 | 解釈 |
|---|---|---|
| ベース1 | 5-8倍でピーク | 最も健全、大きな上昇余地 |
| ベース2 | 6-10倍でピーク | 依然として強い、参加推奨 |
| ベース3 | 7-12倍でピーク | 注意が必要、選択的参加 |
| ベース4以降 | 8-15倍以上 | リスク高、新規参入非推奨 |
理論的説明: 後期ステージベースほど、価格は移動平均線からより大きく拡張する必要がある。これは:
- 累積的な利益確定圧力の増加
- モメンタムの枯渇
- Stage 3への移行リスクの高まりを示す
理論的基盤:
Wyckoffの三大法則:
- 供給と需要の法則: 出来高は供給と需要のバランスの強度を測定
- 原因と結果の法則: 蓄積・分配フェーズ(原因)の規模が、その後のトレンド(結果)の大きさを決定
- 努力と結果の法則: 出来高(努力)と価格変動(結果)の関係を分析
評価項目:
| 指標 | 計算方法 | 理想値 | 理論的背景 |
|---|---|---|---|
| 相対出来高 | 当日出来高 / 50日平均出来高 | ブレイク時 >2.0 | O'Neil: 機関投資家の参入確認 |
| ブレイク時出来高 | BO日の出来高増加率 | +100%以上(2-3倍) | Wyckoff: 需要が供給を圧倒 |
| Dry Up | ベース後半の出来高 | 平均の30-50%以下 | Minervini: 供給の枯渇 |
| 出来高トレンド | ベース内での推移 | 右肩下がり | 売り圧力の減少 |
出来高パターン分析:
1. Accumulation(蓄積)パターン:
特徴:
- 下落時: 出来高減少
- 上昇時: 出来高増加
- 比率: Up Volume > Down Volume
解釈: 機関投資家が蓄積中
Stage: Stage 1後期、Stage 2
2. Distribution(分配)パターン:
特徴:
- 上昇時: 出来高減少
- 下落時: 出来高増加
- 比率: Down Volume > Up Volume
解釈: 機関投資家が分配中
Stage: Stage 3、Stage 4初期
3. Climax Volume(クライマックス):
Selling Climax:
- 出来高: 極めて高い(過去60日間で最高)
- 価格: 広いレンジ、急激な下落
- 終値: レンジ**以上(重要!)
- 意味: 弱気筋の降伏、強気筋の大量吸収
- Stage: Stage 4末期 → Stage 1へ
Buying Climax:
- 出来高: 極めて高い
- 価格: 広いレンジ、急激な上昇
- 終値: レンジ**以下(重要!)
- 意味: 強気筋の降伏(遅れて参入)、分配
- Stage: Stage 2末期 → Stage 3へ
4. Pocket Pivot(O'Neil/Minervini):
定義: ベース内で機関投資家の買いの足跡を示す出来高シグネチャー
条件:
- その日の出来高 > 過去10日間のすべての下落日の出来高
- 価格が8EMAの上または付近
意味: ベース内での静かな蓄積
Stage: Stage 1後期、Stage 2内の押し目
Wyckoffの蓄積フェーズ:
| フェーズ | イベント | 出来高 | 意味 |
|---|---|---|---|
| Phase A | Selling Climax (SC) | 極めて高い | パニック売りの頂点 |
| Secondary Test (ST) | SCより大幅に低い | 売り圧力の枯渇確認 | |
| Phase B | 横ばい取引 | 下落時減少、上昇時増加 | 供給の枯渇 |
| Phase C | Spring/Shakeout | 中〜高 → 低 | 最後の弱気筋の一掃 |
| Phase D | Sign of Strength (SOS) | 高い(1.5-2倍以上) | 需要が供給を圧倒 |
| Last Point of Support (LPS) | 低い | 上昇準備完了 | |
| Phase E | Markup | 非常に高い | ブレイクアウト、上昇継続 |
出来高指標:
On-Balance Volume (OBV):
計算:
- 当日終値 > 前日終値: 現在のOBV = 前日のOBV + 当日の出来高
- 当日終値 < 前日終値: 現在のOBV = 前日のOBV - 当日の出来高
強気ダイバージェンス:
- 価格: 新安値を付ける
- OBV: 前回の安値を維持または上昇
- 意味: 底打ちと反転の可能性
弱気ダイバージェンス:
- 価格: 新高値を付ける
- OBV: 前回の高値を下回る
- 意味: 天井形成と反転の可能性
Volume Profile:
Point of Control (POC): 最も多くの出来高が取引された価格レベル
- 意味: 市場の「公正価値」ゾーン
- 機能: 価格はPOCに引き寄せられる(磁石効果)
Value Area (VA): 総出来高の70%が取引された価格範囲
- VAH (Value Area High): VAの上限
- VAL (Value Area Low): VAの下限
High Volume Node (HVN): 強いサポート/レジスタンス
Low Volume Node (LVN): 弱いサポート/レジスタンス、素早く通過
基本定義: 特定の株式の価格パフォーマンスを全市場の他の株式と比較して相対的な強さを測定する指標で、1から99のスケールで表される。
計算方法(IBD式):
StrengthFactor = 0.4 × ROC(C, 63) + 0.2 × ROC(C, 126) +
0.2 × ROC(C, 189) + 0.2 × ROC(C, 252)
ここで:
- ROC = Rate of Change(変化率)
- 63日 ≈ 1四半期(約3ヶ月) - 40%ウェイト
- 126日 ≈ 2四半期(約6ヶ月) - 20%ウェイト
- 189日 ≈ 3四半期(約9ヶ月) - 20%ウェイト
- 252日 ≈ 4四半期(約12ヶ月) - 20%ウェイト
パーセンタイルランクに変換:
RS Rating = 該当銘柄のStrengthFactorが全銘柄中で何パーセンタイルか
重み付けの理論的根拠: 直近の四半期に40%の最大ウェイトを置くことで、最新のモメンタムを重視しながらも長期的なトレンドも考慮する。
判定基準:
| RS Rating | 評価 | 意味 | アクション |
|---|---|---|---|
| 90以上 | トップ10% | 最強のリーダー | 最優先候補 |
| 80-89 | トップ20% | 強い | 買い候補 |
| 70-79 | トップ30% | 平均以上 | 監視リスト |
| 50-69 | 中程度 | 平均的 | 通常は除外 |
| 50未満 | 平均以下 | 弱い | 避ける |
重要な基準:
CANSLIM戦略(O'Neil):
- 最低基準: RS Rating 80以上
- 歴史的実績: 1950-2008年の最高パフォーマンス銘柄の平均RS Rating = 87(大きな上昇前)
Mark Minervini基準:
- 最低基準: RS Rating 70以上
- 理想的: RS Rating 80-90
- トレンドテンプレートの8番目の基準
RS LineとRS Ratingの統合:
RS Line(相対強度線):
計算式: RS Line = (株価 / S&P500) × 100
特性:
- 連続的なライン(リアルタイム)
- トレンドが視覚的に明確
- 用途: トレンド確認
重要シグナル:
RS Lineが新高値を更新する銘柄は、価格が新高値に達していなくても、
機関投資家の蓄積と強いリーダーシップの可能性を示す
相互補完性:
| 特性 | RS Line | RS Rating |
|---|---|---|
| 表現形式 | 連続的なライン | 離散的な数値(1-99) |
| 時間軸 | リアルタイム | 12ヶ月の集計 |
| 視覚性 | トレンドが明確 | 比較が容易 |
| 用途 | トレンド確認 | ランキング |
ステージ理論との統合:
Stage 2A + RS Rating 80以上 = 最も強力な買いシグナル
- Stage 2銘柄: 明確な上昇トレンド、RS Ratingが高い傾向
- Stage 4銘柄: RS Ratingが70未満に低下する傾向
- ベア市場でのRS強度: 市場が下落中に横ばいまたは上昇している銘柄は、
その後の回復時に劇的にアウトパフォームする傾向
マルチタイムフレーム分析:
最も信頼性の高いシグナルは、複数の時間枠でRS Ratingが一貫して高い場合:
- 1ヶ月RS、3ヶ月RS、6ヶ月RS、12ヶ月RSすべてで80以上
- 時間軸収束 = 持続的な強さの確認
基本定義: Mark Minerviniが体系化したブレイクアウト取引戦略。価格のボラティリティと出来高が徐々に減少する一連の価格収縮により、「最小抵抗線(Line of Least Resistance)」を作り出すパターン。
理論的基盤:
- Wyckoff理論: re-accumulation構造の一例
- Stage Analysis: Stage 2(上昇トレンド期)中に形成される小規模なベース構造
- 供給と需要: 機関投資家が静かにポジションを蓄積する蓄積フェーズ
VCPの5つの主要特徴:
| 特徴 | 詳細 | 判定基準 |
|---|---|---|
| ① 価格収縮 | 各連続する価格レンジがより狭くなる | 収縮n > 収縮n+1(段階的に縮小) |
| ② 出来高減少 | 各収縮フェーズで取引出来高も減少 | V1 > V2 > V3 > ... > Vn |
| ③ ピボットポイント | 明確なブレイクアウトレベルの形成 | 抵抗が明白となる価格レベル |
| ④ より高い安値 | 各収縮中のより高い安値 | 「テニスボール・アクション」 |
| ⑤ 上昇トレンド継続 | Stage 2中に現れる継続パターン | Stage 2でのみ有効 |
VCPの3つの要素(T1, T2, T3修正):
| 要素 | 詳細 | 判定基準 | 理想的な数値 |
|---|---|---|---|
| T1修正 | 第1波の調整 | 最初のプルバック | 15-30%の下落 |
| T2修正 | 第2波の調整 | T1より明確に小さい | 7-20%の下落(T1の30-70%程度) |
| T3修正 | 第3波の調整 | T2より明確に小さい | 3-10%の下落(T2の30-70%程度) |
重要原則:
- 各修正が前回より明確に小さいこと(段階的縮小)
- 理想的には各修正が前回の30-70%程度に縮小
- 例: 第1収縮20% → 第2収縮10%(50%) → 第3収縮5%(50%)
- 例: 第1収縮25% → 第2収縮15%(60%) → 第3収縮8%(53%)
VCP完成条件:
- ✓ 最低2-3回の修正波(通常2-6回)
- ✓ 各修正が前回より明確に縮小(段階的な収縮パターン)
- ✓ 最終修正が10%以下
- ✓ 出来高が段階的に減少
- ✓ 最終段階で出来高が極小(平均の30%以下)
段階的縮小の目安:
- 理想的には各修正が前回の30-70%程度に縮小
- 重要なのは明確な縮小トレンドであり、厳密な比率ではない
- 収縮が不十分(90%以上)の場合はVCPパターンとして弱い
時間枠:
- 典型的: 6-12週間
- 3-4回の明確な価格収縮を伴う
Mark MinerviniのSEPA統合:
VCPは、SEPA(Specific Entry Point Analysis)方法論の中核要素:
| SEPA柱 | VCPとの関係 |
|---|---|
| リスク管理 | 最終収縮の安値にストップロス設定 |
| 銘柄選択 | 強力なファンダメンタルズ + VCP |
| マーケットタイミング | Stage 2での参入 |
| エントリーポイント | VCPブレイクアウトでの参入 |
トレンドテンプレート確認:
VCPが有効であるためには、Mark Minerviniのトレンドテンプレート8つの基準を満たす必要がある:
- 現在価格 > 50日、150日、200日MA
- 50日MA > 150日MA > 200日MA
- 200日MAが上昇トレンド(最低1ヶ月)
- RS Rating > 70(理想的には80-90)
- 価格が52週高値の25%以内
- 価格が52週安値の30%以上上
- 強力なセクター/業界グループ
- EPS成長率の加速
心理学的メカニズム:
段階1: 蓄積と売り手の枯渇
- 当初、売り手が優勢で急激なプルバック
- 各プルバックで売り手が減少
段階2: 圧力構築
- より狭い価格と出来高の収縮が「圧力鍋効果」を生み出す
- 供給が最小限に
段階3: ブレイクアウトと需要確認
- 需要が供給を明確に上回り、強い上昇移動が発生
リスク・リワード比:
- 典型的: 3:1以上
- 理想的: 5:1以上
- ストップロス: 最終収縮の安値の下(リスク5-8%程度)
- 目標: 15%以上の利益
実装基準:
エントリー条件:
必須:
1. ピボットポイントを上抜ける
2. 高出来高での突破(平均の1.5-2倍以上)
3. 終値がピボットポイントの上
タイミング:
- ブレイクアウト当日
- または翌日の最初の押し目
ストップロス設定:
- 前回の収縮の安値のすぐ下
- または: 20日MAの下
- リスク: 購入価格の5-8%以下
イグジット戦略:
- 株価が上昇する際に、強さに乗じて売却
- スケールアウト: 段階的な利確
- またはストップロスを上方に調整して利益を確保
理論的制約:
必要条件:
- Stage 2上昇トレンド内でのみ有効
- 少なくとも2-3回の明確な収縮が必要
- 1回のプルバックだけでは不十分
弱いVCPの兆候:
- 時間圧縮: ベースの右側で株価が急速に上昇しすぎる
- 出来高異常: 収縮中に出来高が増加
- MA違反: 50日MAを大きく割る
歴史的実績: Mark Minerviniは、VCP戦略を使用して:
- 2021年米国投資チャンピオンシップで334%超のリターンを達成
- 長期的に33,000%超のリターンを記録
基本方針:
- 全銘柄に対してすべての理論を適用
- すべての指標を計算し、スコアリングにより優先順位付け
ステップ1:移動平均線の計算
├─ 50日SMA、150日SMA、200日SMA
├─ 21日EMA、8EMA(補助的)
├─ 10週MA、30週MA、40週MA
└─ 移動平均の傾き計算(12週間基準)
ステップ2:価格レベルの計算
├─ 52週高値・安値
├─ 52週高値からの距離(%)
├─ 52週安値からの距離(%)
└─ 現在価格と各MAとの乖離率
ステップ3:ATR関連指標
├─ 14日ATR計算(True Rangeの14日移動平均)
├─ ATR%計算(ATR/終値×100)
├─ 50日MAからのATR Multiple
└─ 200日MAからのATR Multiple
ステップ4:出来高関連指標
├─ 50日平均出来高
├─ 相対出来高(当日/50日平均)
├─ 10日間の上昇日・下落日の出来高分析
└─ OBV計算
ステップ1:Minerviniトレンドテンプレート8基準の評価
For each 銘柄:
基準1: 価格 > 150日MA and 価格 > 200日MA
基準2: 150日MA > 200日MA
基準3: 200日MAが上昇トレンド(20日前比較)
基準4: 50日MA > 150日MA and 50日MA > 200日MA
基準5: 価格 > 50日MA
基準6: (価格 - 52週安値) / 52週安値 > 0.30
基準7: (52週高値 - 価格) / 52週高値 < 0.25
基準8: RS Rating ≥ 70
トレンドテンプレートスコア = 満たした基準数 / 8 × 100
ステップ2:Stage分類
If トレンドテンプレート8基準すべて満たす:
Stage = 2(上昇トレンド)
サブステージ判定(後述)
Else If 150日MA・200日MA横ばい(±2%/20日) and 価格が両MA±15%以内:
Stage = 1(ベース形成)
サブステージ判定(後述)
Else If 150日MA傾き < -0.02 and 価格 < 150日MA:
Stage = 4(下降)
Else If 150日MA横ばい and 価格 > 150日MA:
Stage = 3(天井)
Else:
Stage = Undefined
出力:各銘柄のStageとトレンドテンプレートスコア
ステップ1:ベースパターン識別
For each Stage 1または Stage 2銘柄:
1. 価格レンジの特定
- 過去3-12ヶ月の高値・安値を探索
- 横ばい期間の検出(標準偏差が小さい期間)
2. ベースタイプの分類
- Cup with Handle: U字型 + ハンドル
- Flat Base: 横ばい、深さ10-15%
- Double Bottom: W字型
- VCP: 段階的収縮(後述)
3. ベース品質評価
期間スコア(25点):
- 7-12週: 25点
- 5-7週 or 12-20週: 20点
- 20-30週: 15点
- その他: 5点
深さスコア(25点):
- 15-30%: 25点
- 12-15% or 30-35%: 20点
- 10-12% or 35-40%: 15点
- その他: 5点
出来高パターンスコア(25点):
ベース右側出来高 / 50日平均 = Dry Up比率
- < 0.30: 25点
- 0.30-0.50: 20点
- 0.50-0.70: 15点
- > 0.70: 5点
形状スコア(25点):
- 右側平均 > 左側平均: 15点
- ハンドル品質(深さ1/3以下): 10点
4. ベースカウント
Stage 2内でのベース数をカウント
- Stage 2開始からの主要なベース(7週以上)を数える
- カウント1-2: 優先度高
- カウント3: 中程度
- カウント4以上: 低
総合ベーススコア = 期間 + 深さ + 出来高 + 形状(100点満点)
For each Stage 2銘柄:
ステップ1: ピーク・トラフの検出
- 過去52週のローカル高値(ピーク)を検出
- 各ピーク間のローカル安値(トラフ)を検出
ステップ2: 収縮の計算
For each 連続するピーク・トラフペア:
収縮深さ = (ピーク - トラフ) / ピーク × 100
収縮期間の平均出来高
ステップ3: VCP基準の評価
If 収縮回数 ≥ 2:
各収縮比率 = 収縮n+1 / 収縮n
# VCP品質の評価(段階的)
contraction_quality = 0
for ratio in 各収縮比率:
if ratio < 0.60:
contraction_quality += 30 # 優れた縮小
elif ratio < 0.75:
contraction_quality += 25 # 良好な縮小
elif ratio < 0.90:
contraction_quality += 15 # 許容できる縮小
else:
contraction_quality += 0 # 縮小不十分
# 出来高と最終収縮の評価
volume_decreasing = all(vol[i+1] < vol[i] for i in range(len(vol)-1))
final_contraction_small = contractions[-1] < 10
final_volume_low = vol[-1] < 平均の30%
# VCPスコアの計算
If contraction_quality >= 50 and volume_decreasing and final_contraction_small and final_volume_low:
VCP検出 = True
VCPスコア = min(100, contraction_quality)
Else If contraction_quality >= 30:
VCP検出 = False(部分的パターン)
VCPスコア = min(50, contraction_quality)
Else:
VCP検出 = False
VCPスコア = 0
出力:VCP検出フラグ、収縮回数、各収縮深さ、VCPスコア
For each 銘柄:
ステップ1: 出来高トレンド分析
過去20日間:
上昇日の出来高合計
下落日の出来高合計
Up/Down出来高比率
ステップ2: ポケットピボット検出
For each 日:
If 当日出来高 > 過去10日間のすべての下落日出来高:
And 価格が8EMA付近:
ポケットピボット検出
ステップ3: Wyckoff蓄積/分配フェーズ判定
過去60日の価格・出来高パターンから:
Selling Climax検出:
- 出来高 > 過去60日最大
- 価格レンジ > 平均の2倍
- 終値がレンジ**以上
Secondary Test検出:
- Selling Climax後の安値再テスト
- 出来高 < Selling Climax
Sign of Strength検出:
- レジスタンス突破
- 出来高 > 平均の1.5倍
ステップ4: OBV計算とダイバージェンス検出
OBV更新:
If 終値 > 前日終値:
OBV += 当日出来高
Else:
OBV -= 当日出来高
強気ダイバージェンス:
価格が新安値 and OBVが前回安値より高い
弱気ダイバージェンス:
価格が新高値 and OBVが前回高値より低い
ステップ5: 出来高総合スコア(100点満点)
- Up/Down比率スコア(40点):
* 比率 > 1.5: 40点
* 比率 1.2-1.5: 30点
* 比率 1.0-1.2: 20点
* 比率 < 1.0: 10点
- ポケットピボット(20点):
* 過去20日に3回以上: 20点
* 過去20日に1-2回: 10点
* なし: 0点
- Wyckoff蓄積確認(20点):
* Phase D-E: 20点
* Phase C: 15点
* Phase B: 10点
* Phase A以前: 5点
- OBV状態(20点):
* 強気ダイバージェンス: 20点
* OBV上昇トレンド: 15点
* OBV横ばい: 10点
* 弱気ダイバージェンス: 0点
出力:出来高総合スコア、各サブスコア、検出イベント
ステップ1: 全銘柄のROC計算
For each 銘柄:
ROC_63 = (現在価格 / 63日前価格 - 1) × 100
ROC_126 = (現在価格 / 126日前価格 - 1) × 100
ROC_189 = (現在価格 / 189日前価格 - 1) × 100
ROC_252 = (現在価格 / 252日前価格 - 1) × 100
StrengthFactor = 0.4×ROC_63 + 0.2×ROC_126 + 0.2×ROC_189 + 0.2×ROC_252
ステップ2: パーセンタイルランク計算
全銘柄のStrengthFactorを昇順ソート
For each 銘柄:
順位 = 該当銘柄のソート後の位置
RS Rating = (順位 / 全銘柄数) × 99 + 1(1-99スケール)
ステップ3: RS Line計算
For each 銘柄:
RS Line = (株価 / S&P500指数価格) × 100
RS Line新高値検出:
If 現在RS Line > 過去52週RS Line最大値:
RS Line新高値 = True
出力:RS Rating(1-99)、RS Line値、RS Line新高値フラグ
ステップ1: アンカーポイント判定
For each 銘柄:
システムアクティブ化条件:
1. 過去52週で高値更新(H)を検出
2. 高値更新日から50日以上経過
3. その間、新高値を更新していない
If 条件満たす:
システムアクティブ = True
アンカー日 = 高値更新日
Else:
システムアクティブ = False
VWAP計算スキップ
ステップ2: Anchored VWAP計算
If システムアクティブ:
累積価格×出来高 = 0
累積出来高 = 0
For each 日 from アンカー日 to 現在:
典型価格 = (高値 + 安値 + 終値) / 3
累積価格×出来高 += 典型価格 × 出来高
累積出来高 += 出来高
Anchored VWAP = 累積価格×出来高 / 累積出来高
ステップ3: VWAP関連指標
- VWAPからの乖離率 = (価格 - VWAP) / VWAP × 100
- VWAP角度 = arctan((現在VWAP - 20日前VWAP) / 20)×180/π
- VWAPテスト回数(価格がVWAPに接近した回数)
ステップ4: VWAP判定
If 価格 > VWAP:
VWAP状態 = "Above"(買い需要優勢)
Else If 価格 < VWAP:
VWAP状態 = "Below"(売り圧力優勢)
VWAPスコア(20点満点):
- 価格 > VWAP and 角度 > 30度: 20点
- 価格 > VWAP and 角度 > 0: 15点
- 価格 ≈ VWAP(±2%): 10点
- 価格 < VWAP: 5点
出力:VWAP値、乖離率、角度、状態、VWAPスコア
Stage 1銘柄のスコアリング(100点満点):
総合スコア = ベース品質(25点) + VCP完成度(25点) + RS Rating(25点) +
出来高(15点) + ATR位置(10点)
詳細計算:
1. ベース品質(25点)
= ベーススコア × 0.25
2. VCP完成度(25点)
If VCP検出:
25点
Else If 2回以上の収縮あり:
15点
Else:
5点
3. RS Rating(25点)
If RS ≥ 90:
25点
Else If RS ≥ 85:
23点
Else If RS ≥ 80:
20点
Else If RS ≥ 70:
15点
Else:
10点
4. 出来高(15点)
= 出来高スコア × 0.15
5. ATR位置(10点)
If -0.5 < ATR Multiple < 0.5:
10点
Else If -1.0 < ATR Multiple < 1.0:
8点
Else If -2.0 < ATR Multiple < 2.0:
5点
Else:
2点
分類:
- 90点以上:最優先監視(即座に買い準備)
- 80-89点:優先監視リスト
- 70-79点:監視継続
- 70点未満:除外
Stage 2銘柄のスコアリング(100点満点):
総合スコア = トレンド強度(20点) + ベース品質(20点) + RS Rating(20点) +
出来高(20点) + ATR位置(10点) + MA配列(10点)
詳細計算:
1. トレンド強度(20点)
= トレンドテンプレートスコア × 0.20
2. ベース品質(20点)
= (過去のベーススコア + ベースカウント評価) × 0.10
ベースカウント評価:
- カウント1-2: 10点
- カウント3: 5点
- カウント4以上: 0点
3. RS Rating(20点)
= RS Ratingスコア × 0.20(Stage 1と同じ計算)
4. 出来高(20点)
= 出来高スコア × 0.20
5. ATR位置(10点)
If 0 < ATR Multiple < 3.0:
10点
Else If 3.0 ≤ ATR Multiple < 5.0:
8点
Else If 5.0 ≤ ATR Multiple < 7.0:
5点
Else If 7.0 ≤ ATR Multiple < 10.0:
3点(利確検討)
Else:
0点(即座利確)
6. MA配列(10点)
If 50日MA > 150日MA > 200日MA and すべて上向き:
10点
Else If 50日MA > 150日MA > 200日MA:
7点
Else:
3点
分類:
- 90点以上:即座に買い
- 85-89点:押し目待ち
- 75-84点:監視継続
- 75点未満:見送り
Stage 1詳細サブステージ:
For each Stage 1銘柄:
ベース期間 = (現在日 - ベース開始日) / 7(週数)
ベース内位置 = (価格 - ベース安値) / (ベース高値 - ベース安値)
If ベース期間 < 10週:
サブステージ = "1C"(初期安定化)
Else If ベース期間 < 20週:
If 出来高Dry Up < 0.50:
サブステージ = "1D"(ベース中期)
Else:
サブステージ = "1C"
Else If ベース期間 < 30週:
If 出来高Dry Up < 0.30 and RS Rating > 70:
サブステージ = "1E"(ベース後期)
Else:
サブステージ = "1D"
Else:
If 出来高Dry Up < 0.30 and RS Rating > 85 and ベース内位置 > 0.8:
サブステージ = "1F"(ブレイク直前)
Else:
サブステージ = "1E"
Stage 2詳細サブステージ:
For each Stage 2銘柄:
ブレイクアウトからの週数 = (現在日 - ブレイクアウト日) / 7
ブレイクアウトからの上昇率 = (価格 - ブレイクアウト価格) / ブレイクアウト価格 × 100
If ブレイクアウトからの週数 < 1:
サブステージ = "2A"(ブレイクアウト)
Else If ブレイクアウトからの週数 < 4:
サブステージ = "2B"(初期上昇)
Else If ブレイクアウトからの週数 < 8:
If 現在調整中(価格が5日前より5%以上低い):
サブステージ = "2C"(第1押し目)
Else:
サブステージ = "2B"
Else If ブレイクアウトからの週数 < 20:
If ATR Multiple < 3.0 and ベースカウント = 2:
サブステージ = "2E"(第2押し目)
Else:
サブステージ = "2D"(再加速)
Else If ブレイクアウトからの週数 < 40:
サブステージ = "2F"(主要上昇)
Else:
サブステージ = "2G"(後期上昇)
必須条件(すべて満たす):
1. ステージ転換確認(Minerviniトレンドテンプレート)
✓ 現在価格 > 50日MA > 150日MA > 200日MA
✓ 150日MA > 200日MA
✓ 200日MAが上昇トレンド(最低1ヶ月、理想4-5ヶ月)
✓ 52週安値から30%以上上
✓ 52週高値の25%以内
2. ベース完成(O'Neil基準)
✓ 7週間以上のベース形成(理想7-12週)
✓ 深さ15-35%(カップウィズハンドルは12-35%)
✓ Handleまたは最終タイトニング完了
✓ ベース右側が左側より高い
✓ ベースカウント:1番目または2番目(最優先)
3. VCP完成(Minervini基準)
✓ 2-4回の明確な修正波
✓ 各修正が前回より明確に小さい(段階的縮小)
理想的には各修正が前回の30-70%程度
例:20% → 12%(60%) → 6%(50%)
✓ 最終修正<10%
✓ より高い安値を形成(テニスボールアクション)
4. 出来高パターン(Wyckoff + O'Neil)
✓ ベース内でDry Up(平均の30-50%以下)
✓ Wyckoff蓄積Phase D-E確認
✓ BO日の出来高が平均の2-3倍以上
✓ 価格上昇時に出来高増加
✓ ポケットピボット検出(過去10日の下落日出来高超)
5. RSレーティング(IBD基準)
✓ RS Rating ≥ 85(理想90以上)
✓ RS Lineが上昇トレンド
✓ RS Lineが新高値更新(理想的)
✓ セクター相対強度も高い
6. 移動平均配置(確認)
✓ 50日MA > 150日MA > 200日MA
✓ すべて上向き
✓ 価格がすべてのMAを上回る
✓ 150日MAと200日MAの乖離拡大
7. ATR位置(適切なタイミング)
✓ BO時:-0.5 ~ +1.0 ATR Multiple
✓ 過熱していない
✓ Stage 2Aの健全な範囲
8. 高値VWAP(供給圧力確認)
✓ 価格がBO点VWAPを上回る
✓ VWAP角度が上向き(30度以上理想)
✓ VWAPからの乖離+5%以内
9. 市場環境
✓ S&P500がStage 2
✓ セクターが強い
✓ VIXが低い〜中程度
10. ファンダメンタル確認(CANSLIM)
✓ EPS成長率 > 25%
✓ 売上成長率 > 25%
✓ 新製品・新サービス
✓ 機関投資家保有増加
買い実行タイミング:
優先順位1:Pivot突破の瞬間(BO日)
- 高出来高確認後、即座にエントリー
- ポジションサイズ:ポートフォリオの2-5%
優先順位2:BO後3-5日以内のプルバック
- 出来高減少確認
- 50日MAでサポート
- ポジションサイズ:2-5%
優先順位3:第1押し目(10-15%調整後)
- VCPパターン形成
- 出来高Dry Up
- ポジションサイズ:追加2-3%(ピラミッディング)
12項目中10項目以上(83%)で買い実行推奨
条件:
1. トレンドテンプレート維持
✓ 8つの基準を継続して満たす
✓ 特に50日MA > 150日MA > 200日MAが重要
✓ RS Rating ≥ 80維持
2. 健全な押し目形成
✓ 5-15%の調整
✓ 3-5週間のFlat BaseまたはVCP
✓ 50日MAまたは21EMA上でサポート
✓ 150日MAを割らない
3. 出来高パターン
✓ 調整中に出来高減少(Dry Up)
✓ Accumulationパターン継続
✓ ポケットピボット検出
4. RS維持
✓ RS Rating ≥ 80維持
✓ RS Lineが高値更新または維持
✓ セクター強度維持
5. ATR位置回復
✓ 押し目で0 ~ +3.0 ATR Multiple
✓ MAに近づく(健全な調整)
✓ 過熱状態(7-10倍)からの冷却
6. 再加速の兆候
✓ 出来高増加で反発
✓ 新高値更新
✓ VWAPサポート確認
7. ベースカウント
✓ 2番目または3番目のベース(許容)
✓ 4番目以降は慎重に(リスク高)
ポジションサイズ計算:
基本公式:
ポジションサイズ = リスク許容額 / (エントリー価格 - ストップロス価格)
例:
- 口座資金:$100,000
- 1取引あたりのリスク:1% = $1,000
- エントリー価格:$50
- ストップロス価格:$46(-8%)
- リスク:$4/株
ポジションサイズ = $1,000 / $4 = 250株
投資金額:$12,500(口座の12.5%)
ATR Multiple統合型ポジションサイジング:
調整版:
ポジションサイズ = リスク許容額 / (現在のATR × ATR Multiple)
例:
- 口座資金:$100,000
- 1取引あたりのリスク:1% = $1,000
- 現在のATR:$2
- エントリー時のATR Multiple:2倍
ストップロス距離 = $2 × 2 = $4
ポジションサイズ = $1,000 / $4 = 250株
ストップロス設定基準:
| エントリータイプ | ストップロス位置 | リスク% | 根拠 |
|---|---|---|---|
| ブレイクアウト | ベース上限または50日MAの下 | 7-8% | O'Neil標準 |
| VCPブレイク | 最終収縮の安値の下 | 5-8% | Minervini標準 |
| ポケットピボット | 8EMAまたは最近の安値の下 | 3-5% | より緊密 |
| 押し目買い | 押し目の安値または50日MAの下 | 5-10% | 調整幅による |
| 段階 | ATR Multiple | 利確割合 | 根拠 | ステージとの関係 |
|---|---|---|---|---|
| 初期 | +5.0倍 | 20-25% | 中程度の過剰拡張 | Stage 2中期 |
| 第1 | +7.0倍 | 25-30% | 高度な過剰拡張(重要閾値) | Stage 2後期 |
| 第2 | +10.0倍 | 30-35% | 極度の過剰拡張 | Stage 2B |
| 残り | トレーリングストップ | 15-20% | さらなる上昇の可能性 | 柔軟対応 |
代替的な利確戦略(%ベース):
| 段階 | 利益率 | 利確割合 | 併用判断 |
|---|---|---|---|
| 第1目標 | +20-25% | 25-50% | ATR Multiple 5-7倍と併用 |
| 第2目標 | +40-50% | 25-30% | ATR Multiple 7-10倍と併用 |
| 第3目標 | +75-100% | 残り | Stage 3兆候または10倍超 |
トレーリングストップの計算:
ロングポジションの場合:
トレーリングストップ = 現在価格 - (ATR × 動的倍数)
動的倍数の計算:
- ATR Multiple < 3倍の場合:2.5 × ATR
- ATR Multiple 3-5倍の場合:2.0 × ATR
- ATR Multiple 5-7倍の場合:1.5 × ATR
- ATR Multiple 7-10倍の場合:1.0 × ATR
- ATR Multiple > 10倍の場合:0.5 × ATR
理由:過剰拡張が大きいほど、より緊密なストップが必要
移動平均線ベースのストップロス:
| Stage | ストップロス基準 | 理由 |
|---|---|---|
| Stage 2A | 50日MAの下 | 初期段階、厳格 |
| Stage 2 | 50日MAまたは150日MAの下 | 中期段階、柔軟 |
| Stage 2B | 50日MA割れで即撤退 | 後期段階、防御的 |
理想的な買い銘柄構成:
Stage 1(ブレイク待ち):30-40%
├─ Stage 1E/1F段階の高スコア銘柄(90点以上)
├─ VCP完成間近(最終収縮中)
├─ Pivot監視、即座に行動可能な準備
└─ 各銘柄:ポートフォリオの3-5%
Stage 2前期(2A~2C):40-50%
├─ 最近ブレイクアウトした銘柄(過去2-4週)
├─ ベースカウント1-2
├─ 第1押し目形成中
├─ 最も期待リターン高い
└─ 各銘柄:ポートフォリオの4-8%
Stage 2中期(2D~2E):10-20%
├─ 既に+30-50%の利益
├─ 第2押し目での追加
├─ 部分利確済み
└─ 各銘柄:ポートフォリオの2-5%
Stage 2後期(2F以降):0-10%
├─ 新規買い避ける
├─ 既存ポジションのみ
├─ 積極的な利確準備
└─ 厳格なトレーリングストップ
キャッシュ:10-20%
├─ 新規機会への備え
├─ 市場環境悪化時の防御
└─ 弱気市場では50%以上に増加
分散の原則:
- 最小銘柄数:8銘柄(分散効果)
- 最大銘柄数:15銘柄(管理可能性)
- セクター分散:単一セクターは30%以下
- 相関:低相関銘柄を選択
| 評価項目 | Stage 1候補(ブレイク待ち) | Stage 2候補(押し目・継続) |
|---|---|---|
| 最優先(即座に買い) | • スコア90+ • RS≥85 • VCP完成(段階的縮小確認) • Pivot付近 • 出来高Dry Up完了(平均の30%以下) • ベースカウント1-2 • トレンドテンプレート8基準満たす |
• サブステージ2A/2C/2E • RS≥85、RS Line新高値 • ATR: 0~+5.0 • 健全な押し目形成中(VCP) • 出来高増加で反発 • ベースカウント1-2 • 50>150>200 MA正配列維持 |
| 優先監視(押し目待ち) | • スコア80-89 • RS 80-84 • VCP形成中(2-3収縮) • ベース後期(1E-1F) • まだPivotから遠い(5%以上) |
• サブステージ2B/2D • RS 80-84 • ATR: +5.0~+7.0 • 押し目待ち • ベースカウント2-3 |
| 監視継続 | • スコア70-79 • RS 70-79 • ベース形成中期(1D) • 出来高パターン発展中 |
• サブステージ2F • RS 70-79 • ATR: +7.0~+10.0 • ベースカウント3 • 新規買いは慎重に |
| 警戒・見送り | • スコア<70 • RS<70 • ベース不明瞭 • 出来高パターン悪い • 150日MA・200日MA下向き |
• サブステージ2G • RS低下傾向 • ATR>+10.0 • Distribution兆候(Down Volume増加) • ベースカウント4以上 • Stage 3兆候 |
強気市場(Bull Market):
特徴:
- S&P500がStage 2
- 多数の銘柄がブレイクアウト
- セクターローテーション活発
調整:
- RS Rating基準:80以上(標準より緩和)
- ATR Multiple閾値:8.5-10倍で利確(標準7-10倍)
- ポジションサイズ:やや大きく(3-8%)
- ベースカウント:3番目まで許容
- 積極的にピラミッディング
弱気市場(Bear Market):
特徴:
- S&P500がStage 4
- ブレイクアウト失敗率高い
- 防御セクターが相対的に強い
調整:
- RS Rating基準:90以上(厳格化)
- ATR Multiple閾値:4-5.5倍で利確(早期)
- ポジションサイズ:小さく(1-3%)
- ベースカウント:1番目のみ
- キャッシュ比率:50%以上
- ショート戦略の検討
レンジ相場(Sideways Market):
特徴:
- S&P500がStage 1またはStage 3
- セクターローテーション激しい
調整:
- 極めて選択的
- RS Rating:85以上必須
- ブレイクアウト出来高:3倍以上要求
- 保有期間短縮
- ストップロスより厳格(5-6%)
# データ取得
import yfinance as yf # またはcurl-cffi併用
import pandas as pd
import numpy as np
# テクニカル計算はpandasとnumpyで実装
# 自作関数(VCP検出、ベース識別、Minerviniトレンドテンプレート)
# 可視化
import matplotlib.pyplot as plt
import plotly.graph_objects as go
import mplfinance as mpf
# スクリーニング
# vectorized operations(pandas)
from multiprocessing import Pooldef calculate_sma(df, period):
"""単純移動平均の計算"""
return df['Close'].rolling(window=period).mean()
def calculate_ema(df, period):
"""指数移動平均の計算"""
return df['Close'].ewm(span=period, adjust=False).mean()
def calculate_atr(df, period=14):
"""ATRの計算"""
high_low = df['High'] - df['Low']
high_close = np.abs(df['High'] - df['Close'].shift())
low_close = np.abs(df['Low'] - df['Close'].shift())
true_range = pd.concat([high_low, high_close, low_close], axis=1).max(axis=1)
atr = true_range.rolling(window=period).mean()
return atr
def check_minervini_trend_template(df):
"""
Mark MinerviniのTrend Template 8つの基準をチェック
"""
checks = {}
# 移動平均の計算
df['SMA_50'] = calculate_sma(df, 50)
df['SMA_150'] = calculate_sma(df, 150)
df['SMA_200'] = calculate_sma(df, 200)
# 現在価格と移動平均
current_price = df['Close'].iloc[-1]
sma_50 = df['SMA_50'].iloc[-1]
sma_150 = df['SMA_150'].iloc[-1]
sma_200 = df['SMA_200'].iloc[-1]
# 基準1: 現在価格 > 150日MA & 200日MA
checks['price_above_150_200'] = (current_price > sma_150) and (current_price > sma_200)
# 基準2: 150日MA > 200日MA
checks['ma_150_above_200'] = sma_150 > sma_200
# 基準3: 200日MAが上昇トレンド(最低1ヶ月)
sma_200_month_ago = df['SMA_200'].iloc[-21]
checks['ma_200_trending_up'] = sma_200 > sma_200_month_ago
# 基準4: 50日MA > 150日MA & 200日MA
checks['ma_50_above_150_200'] = (sma_50 > sma_150) and (sma_50 > sma_200)
# 基準5: 現在価格 > 50日MA
checks['price_above_50'] = current_price > sma_50
# 基準6: 52週安値から30%以上上
low_52w = df['Low'].rolling(window=252).min().iloc[-1]
checks['above_52w_low'] = (current_price - low_52w) / low_52w > 0.30
# 基準7: 52週高値の25%以内
high_52w = df['High'].rolling(window=252).max().iloc[-1]
checks['near_52w_high'] = (high_52w - current_price) / high_52w < 0.25
# 基準8: RS Rating ≥ 70(外部計算)
rs_rating = calculate_rs_rating(ticker, df, universe_data)
checks['rs_rating_70'] = rs_rating >= 70
# すべてTrueか確認
all_pass = all(checks.values())
return {
'stage_2_confirmed': all_pass,
'checks': checks,
'rs_rating': rs_rating,
'score': sum(checks.values()) / len(checks) * 100
}
def identify_stage(df):
"""ステージ判定"""
# 移動平均の計算
df['SMA_50'] = calculate_sma(df, 50)
df['SMA_150'] = calculate_sma(df, 150)
df['SMA_200'] = calculate_sma(df, 200)
# Minerviniトレンドテンプレートをチェック
template_result = check_minervini_trend_template(df)
if template_result['stage_2_confirmed']:
# Stage 2のサブステージを判定
return analyze_stage2_substage(df)
# 150日MA・200日MAの傾きとポジション
sma_150 = df['SMA_150'].iloc[-1]
sma_200 = df['SMA_200'].iloc[-1]
# 傾きの計算(20日前との比較)
sma_150_20d_ago = df['SMA_150'].iloc[-21]
sma_200_20d_ago = df['SMA_200'].iloc[-21]
sma_150_slope = (sma_150 - sma_150_20d_ago) / sma_150_20d_ago
sma_200_slope = (sma_200 - sma_200_20d_ago) / sma_200_20d_ago
current_price = df['Close'].iloc[-1]
# Stage 1判定(ベース形成)
if (-0.02 < sma_150_slope < 0.02) and (-0.02 < sma_200_slope < 0.02):
if 0.85 < current_price/sma_150 < 1.15:
return analyze_stage1_substage(df)
# Stage 4判定(下降)
if sma_150_slope < -0.02 and current_price < sma_150:
return 'Stage 4'
# Stage 3判定(天井)
if abs(sma_150_slope) < 0.02 and current_price > sma_150:
return 'Stage 3'
return 'Undefined'
def detect_vcp(df, lookback=52):
"""
VCPパターン検出(Minervini基準)
段階的縮小を柔軟に評価
"""
# ピークとトラフの検出
peaks_idx = []
troughs_idx = []
# 高値のローカルピークを検出
for i in range(5, len(df)-5):
if df['High'].iloc[i] == df['High'].iloc[i-5:i+6].max():
peaks_idx.append(i)
# 安値のローカルトラフを検出
for i in range(5, len(df)-5):
if df['Low'].iloc[i] == df['Low'].iloc[i-5:i+6].min():
troughs_idx.append(i)
if len(troughs_idx) < 3:
return False, None, None, 0
contractions = []
contraction_volumes = []
# 各収縮の深さと出来高を計算
for i in range(len(troughs_idx)-1):
if i < len(peaks_idx):
peak_price = df['High'].iloc[peaks_idx[i]]
trough_price = df['Low'].iloc[troughs_idx[i]]
correction_depth = (peak_price - trough_price) / peak_price * 100
contractions.append(correction_depth)
# 収縮期間の平均出来高
start_idx = peaks_idx[i]
end_idx = troughs_idx[i]
vol_avg = df['Volume'].iloc[start_idx:end_idx].mean()
vol_50_avg = df['Volume'].rolling(50).mean().iloc[end_idx]
vol_ratio = vol_avg / vol_50_avg if vol_50_avg > 0 else 0
contraction_volumes.append(vol_ratio)
# VCP品質の評価(段階的スコアリング)
contraction_quality = 0
for i in range(len(contractions)-1):
ratio = contractions[i+1] / contractions[i] if contractions[i] > 0 else 1
if ratio < 0.60:
contraction_quality += 30 # 優れた縮小
elif ratio < 0.75:
contraction_quality += 25 # 良好な縮小
elif ratio < 0.90:
contraction_quality += 15 # 許容できる縮小
else:
contraction_quality += 0 # 縮小不十分
# 出来高も段階的に減少しているかチェック
vol_decreasing = all(contraction_volumes[i+1] < contraction_volumes[i]
for i in range(len(contraction_volumes)-1)) if len(contraction_volumes) > 1 else True
# 最終収縮が10%以下
final_contraction_small = contractions[-1] < 10 if contractions else False
# 最終収縮時の出来高が極小
final_volume_low = contraction_volumes[-1] < 0.30 if contraction_volumes else False
# VCPスコアの計算
max_quality = (len(contractions) - 1) * 30 # 理論上の最大スコア
normalized_quality = (contraction_quality / max_quality * 100) if max_quality > 0 else 0
# 総合判定
if contraction_quality >= 50 and vol_decreasing and final_contraction_small and final_volume_low:
is_valid_vcp = True
vcp_score = min(100, normalized_quality)
elif contraction_quality >= 30:
is_valid_vcp = False # 部分的パターン
vcp_score = min(50, normalized_quality)
else:
is_valid_vcp = False
vcp_score = 0
return is_valid_vcp, contractions, contraction_volumes, vcp_score
def calculate_atr_multiple(df, ma_period=50, atr_period=14):
"""
ATR Multiple from MA計算
"""
# ATRの計算
df['ATR'] = calculate_atr(df, atr_period)
# 移動平均の計算
df[f'SMA_{ma_period}'] = calculate_sma(df, ma_period)
current_price = df['Close'].iloc[-1]
ma = df[f'SMA_{ma_period}'].iloc[-1]
atr = df['ATR'].iloc[-1]
# ATR%
atr_pct = (atr / current_price) * 100 if current_price > 0 else 0
# 乖離率
deviation_pct = ((current_price - ma) / ma) * 100 if ma > 0 else 0
# ATR Multiple
if atr_pct > 0:
atr_multiple = deviation_pct / atr_pct
else:
atr_multiple = 0
return atr_multiple
def calculate_rs_rating(ticker, df, universe_data):
"""
RS Rating計算(IBD式)
"""
try:
# ROC計算
roc_63 = (df['Close'].iloc[-1] / df['Close'].iloc[-63] - 1) * 100 if len(df) >= 63 else 0
roc_126 = (df['Close'].iloc[-1] / df['Close'].iloc[-126] - 1) * 100 if len(df) >= 126 else 0
roc_189 = (df['Close'].iloc[-1] / df['Close'].iloc[-189] - 1) * 100 if len(df) >= 189 else 0
roc_252 = (df['Close'].iloc[-1] / df['Close'].iloc[-252] - 1) * 100 if len(df) >= 252 else 0
# 加重平均
strength_factor = (0.4 * roc_63 + 0.2 * roc_126 +
0.2 * roc_189 + 0.2 * roc_252)
# 全銘柄のstrength_factorを計算して順位付け
all_strength = {}
for t, data in universe_data.items():
try:
sf = calculate_strength_factor(data)
all_strength[t] = sf
except:
continue
# パーセンタイルランクに変換
sorted_tickers = sorted(all_strength.items(), key=lambda x: x[1])
rank = next((i for i, (t, _) in enumerate(sorted_tickers) if t == ticker), 0)
percentile = (rank / len(sorted_tickers)) * 99 + 1 if len(sorted_tickers) > 0 else 50
return int(percentile)
except:
return 50 # エラー時はデフォルト値
def calculate_obv(df):
"""On-Balance Volume計算"""
obv = [0]
for i in range(1, len(df)):
if df['Close'].iloc[i] > df['Close'].iloc[i-1]:
obv.append(obv[-1] + df['Volume'].iloc[i])
elif df['Close'].iloc[i] < df['Close'].iloc[i-1]:
obv.append(obv[-1] - df['Volume'].iloc[i])
else:
obv.append(obv[-1])
df['OBV'] = obv
return df
def screen_all_stocks(universe):
"""全銘柄スクリーニング"""
results = []
for ticker in universe:
try:
# データ取得
df = yf.download(ticker, period='1y', progress=False)
if len(df) < 200: # 最低限のデータが必要
continue
# 基本的な流動性チェック
avg_volume = df['Volume'].tail(50).mean()
current_price = df['Close'].iloc[-1]
if avg_volume < 100000 or current_price < 5:
continue
# すべての指標を計算
# 1. ステージ判定
stage = identify_stage(df)
template = check_minervini_trend_template(df)
# 2. ベース分析
base_score = calculate_base_quality_score(df) if stage in ['Stage 1', 'Stage 2'] else 0
# 3. VCP検出
vcp_detected, contractions, vol_ratios, vcp_score = detect_vcp(df) if stage == 'Stage 2' else (False, None, None, 0)
# 4. RS Rating
rs_rating = template['rs_rating']
# 5. ATR Multiple
atr_multiple = calculate_atr_multiple(df)
# 6. 出来高分析
df = calculate_obv(df)
volume_score = calculate_volume_score(df)
# 7. 高値固定VWAP(該当する場合)
vwap_data = calculate_anchored_vwap(df) if should_calculate_vwap(df) else None
# スコアリング
if stage == 'Stage 1':
total_score = (base_score * 0.25 +
vcp_score * 0.25 +
(rs_rating / 100 * 25) +
volume_score * 0.15 +
calculate_atr_position_score(atr_multiple) * 0.10)
elif stage == 'Stage 2':
total_score = (template['score'] * 0.20 +
base_score * 0.20 +
(rs_rating / 100 * 20) +
volume_score * 0.20 +
calculate_atr_position_score(atr_multiple) * 0.10 +
calculate_ma_alignment_score(df) * 0.10)
else:
total_score = 0
# 結果を保存
results.append({
'ticker': ticker,
'stage': stage,
'total_score': total_score,
'rs_rating': rs_rating,
'atr_multiple': atr_multiple,
'vcp_detected': vcp_detected,
'vcp_score': vcp_score,
'base_score': base_score,
'volume_score': volume_score,
'template_score': template['score'],
'current_price': current_price,
'avg_volume': avg_volume
})
except Exception as e:
print(f"Error processing {ticker}: {e}")
continue
# スコアでソート
results_sorted = sorted(results, key=lambda x: x['total_score'], reverse=True)
return results_sortedステップ1:データ取得
必要データ:
- 日次OHLCV(過去1年分、252営業日)
- 全銘柄分を取得(S&P500、NASDAQ、主要取引所)
- セクター分類データステップ2:全銘柄に対する計算
For each 銘柄 in 全ユニバース:
1. 基礎指標計算
- 移動平均(50日/150日/200日)
- ATR(14)
- 52週高値・安値
- 出来高関連指標
2. ステージ判定
- Minerviniトレンドテンプレート評価
- Stage分類(1/2/3/4/Undefined)
- サブステージ判定
3. ベース分析(Stage 1・2のみ)
- ベースパターン識別
- ベース品質スコア
- ベースカウント
4. VCP検出(Stage 2のみ)
- 収縮パターン分析
- 段階的スコアリング
5. RS Rating計算
- 全銘柄のStrengthFactor算出
- パーセンタイルランク変換
6. 出来高分析
- OBV計算
- Wyckoffフェーズ判定
- ポケットピボット検出
7. 高値固定VWAP(該当銘柄のみ)
- システムアクティブ化チェック
- VWAP計算と評価
8. 総合スコアリング
- Stage別のスコア計算
- 優先順位付け
ステップ3:結果の出力と分類
出力カテゴリ:
1. Stage 1最優先候補(スコア90以上)
- トレンドテンプレート準備完了
- VCP完成間近
- RS Rating 85以上
- 出来高Dry Up確認
- ベースカウント1-2
2. Stage 2即座買い候補(スコア90以上)
- 全8基準満たす
- 健全な押し目形成中
- RS Rating 85以上
- ATR Multiple 0-5倍
- ベースカウント1-2
3. 監視継続リスト(スコア80-89)
- 条件がほぼ満たされている
- あと1-2項目で買い条件達成
4. 詳細分析リスト(スコア70-79)
- ポテンシャルあり
- さらなる発展を監視
5. Stage 3・4リスト
- 利確・撤退候補
- 既存ポジションの管理用ステップ4:レポート生成
週次レポート内容:
1. マーケット環境サマリー
- S&P500のステージ
- VIXレベル
- セクター強弱分析
- 推奨ポジションサイズ調整
2. 新規買い候補(優先順位順)
各銘柄について:
- ティッカー、現在価格
- 総合スコアと内訳
- Stage・サブステージ
- RS Rating
- ATR Multiple
- ベースカウント
- VCP状態
- エントリー推奨価格
- ストップロス価格
- 目標価格
3. 既存ポジション状況
- ATR Multiple現況
- 利確タイミング判定
- ストップロス更新提案
4. 来週の注目イベント
- 決算発表予定
- Pivot接近銘柄
- VCP完成間近銘柄
- システムアクティブ化予定(VWAP)買い実行前の必須チェック項目(12項目、10項目以上で買い):
ステージ・MA確認:
- Minerviniトレンドテンプレート8基準すべて満たす ✓
ベース品質:
- ベース期間:7週以上、30週以下 ✓
- ベース深さ:15-35% ✓
- ベースカウント:1番目または2番目 ✓
VCP完成:
- VCP修正波:2-4回の縮小修正 ✓
- 段階的縮小:各修正が前回より明確に小さい ✓
- 最終収縮:10%以下 ✓
出来高確認:
- 出来高Dry Up:ベース右側で平均の30-50%以下 ✓
- ブレイク時出来高:平均の200%以上(2-3倍) ✓
相対強度:
- RS Rating:85以上 ✓
- RS Line:上昇トレンドまたは新高値 ✓
タイミング:
- ATR Multiple:-0.5 ~ +1.0 ✓
環境確認:
- 市場環境:S&P500がStage 2 ✓
- セクター状況:セクター強い ✓
【重要】12項目中10項目以上(83%)で買い実行
この体系は7つの理論を全銘柄に適用し、スコアリングにより最も勝率の高いセットアップを抽出します:
-
ステージ理論(Stan Weinstein & Mark Minervini)
- 大局的な位置づけ
- Minerviniトレンドテンプレート8基準による厳格な確認
- すべての銘柄にステージを割り当て
-
ベース理論(William O'Neil)
- 需給均衡の証拠
- 7-8週間の最低期間要件
- ベースカウンティング
-
VCP理論(Mark Minervini)
- エネルギー圧縮の確認
- 各収縮が前回より段階的に縮小(progressively smaller)
- 理想的には各収縮が前回の30-75%程度に縮小
- Stage 2内でのみ有効
-
出来高理論(Wyckoff + O'Neil + Minervini)
- スマートマネーの動き
- Selling/Buying Climaxの識別
- Dry Up確認
-
RS Rating理論(IBD)
- 相対的優位性
- 全銘柄間での比較ランキング
- パーセンタイル計算
-
ATR Multiple from MA理論
- 適切なタイミング
- 7-10倍で利確開始(重要閾値)
- ボラティリティ正規化
-
高値固定VWAP理論(Brian Shannon)
- 買い需要の持続性
- 機関投資家の平均コスト
- IPO株への特別適用
全銘柄を分析し、条件が揃った銘柄のみを買う。
スコアリングにより客観的に優先順位付け。
完璧なセットアップを待つ忍耐が最大のエッジ。
定量的基準:
- Stage 1候補:スコア90以上(全銘柄から選抜)
- Stage 2候補:スコア90以上、Minerviniテンプレート8基準すべて満たす
このシステムで週に1-3銘柄見つかれば十分です。質が量を圧倒的に上回ります。
1. 全銘柄への適用
- フィルタリングなし、すべての理論を全銘柄に計算
- スコアリングによる自動優先順位付け
- 計算効率を重視(並列処理、ベクトル化)
2. 厳格な基準適用
- Minerviniトレンドテンプレート8基準:妥協なし
- VCP段階的縮小:柔軟な品質評価
- 出来高Dry Up:客観的測定
- RS Rating 85以上:統計的優位性
3. 継続的なモニタリング
- 週次スクリーニング:金曜終値ベース
- 全銘柄の再評価
- スコアの推移追跡
この統合システムは、以下のトレーダーの実績に基づいています:
- William O'Neil: CANSLIM戦略、IBD創設
- Mark Minervini: 33,554%達成、米国投資チャンピオン
- Stan Weinstein: ステージ分析
- Richard Wyckoff: 供給と需要の法則
- Jesse Livermore: 14歳から億万長者へ
共通する成功の鍵:
- ステージ分析による大局的把握
- ベース完成の確認
- 出来高による機関投資家の追跡
- 相対強度による銘柄選択
- 厳格なリスク管理