SQLを使って株にテクニカル指標を出す⑤ 一目均衡表
株のテクニカル指標をまとめる
SQLを使って株にテクニカル指標を出す④に続き5個目 今回は、一目均衡表(one glance on a single chart)を解説 英語でもIchimoku Kinko Hyo analysisと記載されたりもする分析手法です。
今回のは前回のMACDに比べればマシな計算式ですが未来の日付に線を引く必要があるため 日付の概念があるのが注意です。
利用するデータは こちらにSQLを準備 2023年分の情報を出すのに2022年のデータが必要ですので入れています。
一目均衡表の算出方法
- 基準線(赤線)=(26日間の最高値 + 26日間の最安値)/ 2
- 転換線(青線)=(9日間の最高値 + 9日間の最安値)/ 2
- 先行スパン1(水色線)=(基準線 + 転換線)/ 2を26日間先行させたもの
- 先行スパン2(橙線)=(52日間の最高値 + 52日間の最安値) / 2を26日間先行させたもの
- 遅行スパン(黄色線)=当日の終値を26日遅行させたもの
一目均衡表をSQLで求める
今回のSQLを作るにあたり前提条件を作る事にします。
- 未来の日付には祝日は考慮しないものとする
- 土日については除外する
WITH RECURSIVE DateTable(i, date) AS (
SELECT
1 AS i,
MAX(date)::timestamp AS date
FROM
nikkei225
UNION ALL
SELECT
i + 1 AS i,
CASE WHEN date_part('dow', date + '1 days') = 6 THEN
date + '3 days'
ELSE
date + '1 days'
END AS date
FROM
DateTable
WHERE
i <= 25
)
SELECT
date,
ROUND(lagging, 2) AS lagging,
ROUND(standard, 2) AS standard,
ROUND((FIRST_VALUE(lagging) OVER w4 + FIRST_VALUE(standard) OVER w4) / 2, 2) AS first_leading,
ROUND((FIRST_VALUE(second) OVER w4), 2) AS second_leading
FROM (
SELECT
date,
CASE WHEN (high IS NOT NULL AND COUNT(high) OVER w1 = 26) THEN
(MAX(high) OVER w1 + MIN(low) OVER w1) / 2.0
ELSE
NULL
END AS lagging,
CASE WHEN (high IS NOT NULL AND COUNT(high) OVER w2 = 9) THEN
(MAX(high) OVER w2 + MIN(low) OVER w2) / 2.0
ELSE
NULL
END AS standard,
CASE WHEN (high IS NOT NULL AND COUNT(high) OVER w3 = 52) THEN
(MAX(high) OVER w3 + MIN(low) OVER w3) / 2.0
ELSE
NULL
END AS second,
close
FROM (
SELECT
date,
NULL AS high,
NULL AS low,
NULL AS close
FROM
(SELECT date AS date FROM DateTable WHERE i <> 1) AS S1
UNION ALL
SELECT
date,
high,
low,
close
FROM
nikkei225
) AS T1
WINDOW
w1 AS (ORDER BY date ASC ROWS BETWEEN 25 PRECEDING AND current ROW),
w2 AS (ORDER BY date ASC ROWS BETWEEN 8 PRECEDING AND current ROW),
w3 AS (ORDER BY date ASC ROWS BETWEEN 51 PRECEDING AND current ROW)
) AS L1
WINDOW
w4 AS (ORDER BY date ASC ROWS BETWEEN 25 PRECEDING AND current ROW)
ORDER BY date ASC
;
上記のSQLで一目均衡表の集計が行えます。 未来の日付をWITH句で作りそれを既存のテーブルにUNION ALLが行われるそれを元に格日付の最大値や最小値を取り 計算を行うことで対処しています。 未来の日付には、26日前の値をあらかじめ計算して置きFIRST_VALUEで参照することで対応
まとめ
思ったより複雑なSQLになってしまいました。もう少しスマートにしたいが思い浮かばず
SQLの構文自体はWINODW関数さえ把握していれば良いのでハードルは低いかなと思いました。