SQLを使って株にテクニカル指標を出す⑤ 一目均衡表

SQLを使って株にテクニカル指標を出す⑤ 一目均衡表

Twitter LINEで送る Facebook はてなブログ

株のテクニカル指標をまとめる

SQLを使って株にテクニカル指標を出す④に続き5個目 今回は、一目均衡表(one glance on a single chart)を解説 英語でもIchimoku Kinko Hyo analysisと記載されたりもする分析手法です。

今回のは前回のMACDに比べればマシな計算式ですが未来の日付に線を引く必要があるため 日付の概念があるのが注意です。

利用するデータは こちらにSQLを準備 2023年分の情報を出すのに2022年のデータが必要ですので入れています。

一目均衡表の算出方法

  1. 基準線(赤線)=(26日間の最高値 + 26日間の最安値)/ 2
  2. 転換線(青線)=(9日間の最高値 + 9日間の最安値)/ 2
  3. 先行スパン1(水色線)=(基準線 + 転換線)/ 2を26日間先行させたもの
  4. 先行スパン2(橙線)=(52日間の最高値 + 52日間の最安値) / 2を26日間先行させたもの
  5. 遅行スパン(黄色線)=当日の終値を26日遅行させたもの

一目均衡表をSQLで求める

今回のSQLを作るにあたり前提条件を作る事にします。

  1. 未来の日付には祝日は考慮しないものとする
  2. 土日については除外する
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関数さえ把握していれば良いのでハードルは低いかなと思いました。