線形回帰の傾きと決定係数R²を組み合わせる考え方 — トレンドの向きと直線性を分けて測る設計

トレンドを判定する道具といえば移動平均やADXが定番ですが、もう一つ別の切り口があります。直近N本の価格の並びに1本の直線を当てはめる線形回帰です。ここから取り出せる値は2つあります。直線の傾き(Slope)と、価格がその直線にどれだけ沿っているかを示す決定係数(R²)です。傾きは向きと急さを、R²は動きの素直さを数値にします。この2つを分けて持つと、同じ「上向き」でも整然と上がっているのか、大きく往復しながら結果として上がっているのかを区別する材料になります。順張りロジックのフィルターを設計している方、しきい値の根拠を感覚ではなく数値で持ちたい方に向けた内容です。

回帰直線に対して価格が大きくばらつく左側と、直線に沿って進む右側を対比し、下部に決定係数の高低をバーで示した模式図

線形回帰の傾きの役割

線形回帰(Linear Regression)は、直近N本の終値の並びに対して、上下方向の誤差が最も小さくなる直線を1本当てはめる手法です。その直線の傾きは、1本あたり平均してどれだけ価格が動いたかを表します。符号が向きを、絶対値が急さを示す形です。

移動平均との違いは、扱っている量そのものにあります。移動平均は価格の水準を平滑化した値で、向きを知るには前の値と比べるという一手間が必要です。対して傾きは、はじめから変化の度合いを直接計算した値です。そのぶん向きの読み取りは素直で、上向きから下向きへの切り替わりも符号の反転として一度に扱えます。

単独使用時の限界は2つあります。第一に、傾きは当てはまりの良さを一切含みません。価格が乱高下していても、期間全体として上がっていれば傾きは正の値になります。第二に、値が価格のスケールに依存します。同じ「傾き0.5」でも、値動きの大きい銘柄と小さい銘柄では意味がまったく違うため、絶対値をそのまましきい値に使うと銘柄や時間足をまたいだ流用ができません。

決定係数R²の役割

決定係数(R²)は、当てはめた直線が価格の動きをどれだけ説明できているかを0から1の範囲で示す値です。1に近いほど価格が直線の近くに並び、0に近いほど直線から外れて散らばっている状態を表します。言い換えれば、その期間の値動きがどれだけ直線的だったかの採点表です。

特徴的なのは、方向を持たないことです。R²が高いという事実は「規則的に動いている」ことを示すだけで、上向きか下向きかは何も語りません。この点は強さだけを取り出すADXと似た性質ですが、ADXが方向性の強さを平滑化して測るのに対し、R²は直線からのばらつきの小ささを測る、という違いがあります。

単独使用時の弱点もはっきりしています。R²が高くても傾きがほぼ0であれば、それは「きれいな横ばい」でしかありません。また、当てはめる期間の取り方に敏感で、期間を変えると値が大きく動く場面があります。過去N本を見ている以上、直近の変化への反応も一拍遅れます。

なぜこの組み合わせか

2つの値は、同じ直線から取り出しながら、まったく別の側面を測っています。傾きが受け持つのは方向と急さ、R²が受け持つのは規則性です。独立した二軸になるため、組み合わせると4つの状態に整理できます。

このように、傾きの弱点である「暴れているかどうかを区別できない」点をR²が埋め、R²の弱点である「方向がわからない」点を傾きが埋める、相互補完の関係になります。一般論として、同じ方向のシグナルでも質の差を見分ける材料が一つ増える形です。トレンドとレンジの見分けを、目視の印象ではなく2つの連続値として扱えるようになる点も、ロジック化の観点では扱いやすさにつながります。

一方でトレードオフもあります。直線近似は曲がりを表現できないため、加速や減速、そして転換そのものの検出には向きません。当てはめる窓の端に大きな値が入ると両方の値が揺さぶられる点も承知しておく必要があります。この組み合わせは「いま整然としているか」を測る道具であって、転換点を先回りする道具ではない、と位置づけるのが安全です。

パラメータをどう考えるか

調整対象は、当てはめ期間N、傾きのしきい値、R²のしきい値の3つです。

期間Nは、短くすると直近の変化に敏感になる代わりにR²が跳ねやすく、長くすると滑らかになる代わりに反応が遅れます。上位足で環境を確認する用途なら長め、エントリー判定に近い用途なら短めという方向性が出発点になります。

傾きのしきい値は、値をそのまま使わない工夫が要点です。ATRなどの変動幅で割って無次元化しておくと、価格スケールの違いを吸収でき、同じしきい値を複数の銘柄で試せるようになります。

R²のしきい値は、0.5や0.7といった切りの良い数字が話題になりがちですが、適した水準は時間足や対象によって変わります。決め打ちにする前に、対象データでR²がどう分布しているかを一度集計し、上位何割にあたるかという分位点の発想で置くほうが根拠を持たせやすくなります。いずれの値も唯一の正解はありませんので、狙う時間軸でのバックテストで挙動を確かめてから採用してください。

cBot化する際の考慮点

実装面では、2つの値の性質の違いがそのまま注意点になります。

cTraderには線形回帰系の内蔵インジケーターが用意されており、傾きと決定係数をそれぞれ取得できます。名称や引数はバージョンによって異なる場合があるため、実装前にAPIリファレンスで確認してください。

// OnStart: 傾き・決定係数・変動幅を用意する
_slope = Indicators.LinearRegressionSlope(Bars.ClosePrices, _period);
_rSquared = Indicators.LinearRegressionRSquared(Bars.ClosePrices, _period);
_atr = Indicators.AverageTrueRange(_atrPeriod, MovingAverageType.Exponential);

// OnBar: 確定足の値だけを使って二軸で評価する
if (Bars.Count < _period + _warmupMargin) return;

double atr = _atr.Result.Last(1);
if (atr <= 0) return;

double slopeNorm = _slope.Result.Last(1) / atr;   // 変動幅で割って無次元化
double fit = _rSquared.Result.Last(1);            // 直線への当てはまり
if (double.IsNaN(slopeNorm) || double.IsNaN(fit)) return;

bool linear = fit >= _fitThreshold;               // 規則性の条件(方向は問わない)
bool upward = slopeNorm >= _slopeThreshold;       // 向きと急さの条件
// linear && upward を「整然とした上向き」の判定材料として扱う

ここから先は、状態が崩れたときに即座に手仕舞いを検討するのか数本の猶予を置くのか、ロットや損切り幅をどう決めるのかといった設計を重ねていくことになります。

実装の流れ

処理は分岐の少ない一方向の流れに整理できます。

  1. 計算: 確定足で傾き、R²、変動幅を取得する
  2. 直線性の判定: R²がしきい値以上かを先に確認し、満たさなければ以降の判定に進まない
  3. 向きの判定: 変動幅で割った傾きの符号と大きさから、上向き・下向き・どちらでもないを分類する
  4. 発注・管理: 両方がそろった場合のみ候補とし、損切りは独立したルールとして必ず併設する
  5. 記録: 判定時の傾きとR²の値を残し、後からしきい値の妥当性を数え直せるようにする

確定足での計算から直線性の判定、向きの判定、発注・管理、記録へと進み、条件を満たさない場合は見送りへ分岐する処理フロー図

判定順序を「直線性が先、向きが後」にしているのには理由があります。方向から入ると、荒れた値動きの中で出た向きにも仕掛けの候補が立ってしまうためです。先に土俵を選び、その上で向きを決める並びにしておくと、フィルターとしての役割が明確になります。記録したR²の分布を後から眺めれば、しきい値が厳しすぎたのか緩すぎたのかを実データで確認できます。

どう活用するか

「規則性を測る軸と、方向を測る軸を分けて持つ」という骨格は、この2つの値に限った話ではありません。規則性をADXやAroonに、方向を移動平均の向きに置き換えても同じ形で組み立てられます。自作される方は、Claude Codeと併走してcBotを書く際の設計メモとして、本記事の二軸の整理をそのまま下敷きにしてみてください。実装を任せたい方は、ai-programming.xyzで個別の開発相談を承っています。体系的に学びたい方に向けては、スクールでフィルター設計を含む判定ロジックの組み立てを順を追って学べます。

本記事は一般的な情報提供を目的としています。投資助言ではありません。 取引判断はご自身の責任で行ってください。