SQLを使って株にテクニカル指標を出す② ストキャスティクス / 加重移動平均
株のテクニカル指標をまとめる
SQLを使って株にテクニカル指標を出す①に続き2個目 今回は、ストキャスティクスの計算式、加重移動平均を解説 特に、加重移動平均の方がSQLを組む上で今後の複雑な指標を計算する際に 必要な物なので実際の活用頻度というよりSQLの組み方を重視するため入れています。
参照するデータは前回同様、2023年の日経平均を利用します。
利用するデータは こちらにSQLを準備
2023年分の情報を出すのに2022年のデータが必要ですので入れています。
ストキャスティクスの単純移動平均を出す。
計算式自体はシンプル(n = 5, m = 3で考えます)
・「%K」=(直近の終値-過去n日間の最安値)÷(過去n日間の最高値-過去n日間の最安値)×100
・「%D」=(直近の終値-過去n日間の最安値)のm日間の合計 ÷(過去n日間の最高値-過去n日間の最安値)のm日間の合計×100
SELECT
date,
ROUND(denominator / numerator * 100, 2) AS k,
ROUND(SUM(denominator) OVER w2 / SUM(numerator) OVER w2 * 100, 2) as d
FROM (
SELECT
date,
(close - MIN(low) OVER w) AS denominator,
(MAX(high) OVER w - MIN(low) OVER w) AS numerator
FROM
nikkei225
WINDOW
w AS (ORDER BY date ASC ROWS BETWEEN 4 PRECEDING AND current ROW)
) AS T1
WINDOW
w2 AS (ORDER BY date ASC ROWS BETWEEN 2 PRECEDING AND current ROW)
ORDER BY
date DESC;
途中計算をしてから次の値を計算する必要があるため少し変わった形のSQLになりましたが計算できました。
加重移動平均の計算
加重移動平均(weighted moving average)にも何パターンか計算方法があるのですが 今回はシンプルな「線形的」な重みで 5日分の移動平均とします。
WITH RECURSIVE wr_calc_wma(date, num, close) AS (
SELECT
T1.date,
5 AS num,
close AS close
FROM
nikkei225 AS T1
UNION ALL
SELECT
date,
num - 1 AS num,
CAST(LAG(close) OVER (ORDER BY date ASC ROWS BETWEEN 4 PRECEDING AND current ROW) AS NUMERIC(20, 4)) AS close
FROM
wr_calc_wma
WHERE num > 1
)
SELECT date, ROUND(SUM(num * close) / SUM(num), 2) AS wma5 FROM wr_calc_wma GROUP BY date ORDER BY date DESC;
WITH RECURSIVEにて再起的にレコードを作り作ったレコードに対して同じ日付でGORUP BYすることで 加重移動平均を再現しています。 もう少し良いやり方もありそうなのですがわからずです。
まとめ
加重移動平均の方法はもう少しブラッシュアップをしたいです。 指数移動平均を作りMACDの計算をしたいと考えているのですが模索が必要な状態です。 SQLも結構色々なことができるので工夫次第だとは改めて思い知らされました。