分足株価から指標計算やプロット ~DBとの連携クラスの作成~

こんにちはRcatです。
今回は分足株価のデータベース化の続きです。
前回データベースにCSVのデータをアップロードし、自動的に株式分割を適用しました。
今回は逆CSV化やテクニカル指標の計算、グラフのプロットなどを行っていこうと思います。

前回はこちら

初回はこちら

sita やることはこちら



はじめに

利用規約

情報や作品の活用時は事前に利用規約をご確認ください。

コメントについて

利用規約のガイドラインを確認の上コメントしてください


機能の整理

まずどんな機能が必要なのか、先に情報を整理します。

機能の列挙

  • 逆CSV化
    データベース化は管理が楽なので必要ですが、人間が直接データを見ることを考えると、やはりCSVとして扱える方が楽な場合もあります。

    • 保存先と証券コードを指定して、CSVとして保存する機能

    • 全てのCSVをまとめてダウンロードして圧縮する機能

  • データベース探索機能
    データベースに入れてしまうと、いつものようにフォルダがみたいな感じで見ることはできません。そうなるとパッと見探しづらくなってしまうので、探索する機能をつけます。

    • 全ての証券コードを返す機能

    • 銘柄の情報を返す機能

      • 登録されている足種とデータ数

      • 一番古いデータと新しいデータの日時

      • 最高値と最安値

  • データ取得機能
    今後の計算でベースとなってくる機能です。

    • 指定した証券コードと足で指定したスパンのデータを取得

    • 出来高の取得

  • 演算機能
    取得したデータからテクニカル指標を計算する機能

    • 各テクニカル指標の計算(移動平均など)

    • テクニカル計算ができるかどうかチェックする機能
      例えば100日線であれば100日前のデータがなければ計算できないので、全データから100日分後のデータが正常に計算できる一番古いデータとなります。

  • グラフのプロット
    数値で見れたところで本当にそれ正しいのか絶対わからないので、チャート形式のグラフを出力して、視覚的に確認できるようにします。


逆CSV化

まず、最初にCSVに戻す部分を見ていきます。

SaveCSV 指定した銘柄をCSVとしてダウンロードする

コードとしてはこんな感じです。
保存先のパスと証券コード足、日付のスパンを選択することで、CSVとしてのダウンロードが可能です。

今まで全く使ってこなかったんですが、データベースで連携する場合pandasを活用すると色々楽みたいなので、今回から使い始めることにします。
ちなみにここで呼び出しているゲットデータに関しては取得のセクションで説明します。

CloneDB_ZIP 全てのデータを圧縮してダウンロードする

この機能はデータベースに存在する全てのテーブルをサーチし、その全ての中身をダウンロードしていく機能です。
また保存する時にZIPファイルを作成し、圧縮しながら書き込んでいきます。
CSVデータなので圧縮率が80%を超えるため、大体サイズが1/5程度になります。
データベースのバックアップという意味でも利用ができる関数です。

にしてもpandasってSQL実行もできるんですね。まあヘッダーが違うので書き込みには使えないんですが。


データベース探索系

GetDBCodes 全ての証券コードを返す

まず大事なのが何のデータが入っているのかを調べる関数です。
こちらを実行することで、データベースに入っている全ての証券コードを取得することができます。

GetInfomation 銘柄の情報を取得する

次に銘柄の取得です。
証券コードと足を指定すれば、そのデータについて詳しい情報を>取得することができます。

コードだけだとちょっと分からないと思うので、実際に実行してみるとこんな感じになります。
以下のように、まず最初に今回の足についての情報、次にデータベース全体でのデータについて、最後に種類が何個あるかというリストが返ってきます。

>>> db = DBStockClient_Cal("remote","XXXXXXXXXXXX","192.168.0.X")  
>>> pprint.pprint(db.GetInfomation("9432","5M"))
{'kindinfo': {'code': '9432',
              'count': 7370,
              'date_last': datetime.datetime(2025, 5, 2, 15, 30),
              'date_old': datetime.datetime(2024, 11, 19, 9, 0),
              'kind': '5M',
              'price_high': Decimal('159.50'),
              'price_low': Decimal('135.20')},
 'table': {'count': {'10M': 3852,
                     '15M': 3302,
                     '1M': 28773,
                     '5M': 7370,
                     '60M': 3364,
                     'D': 2442,
                     'M': 361,
                     'W': 1042},
           'kind': ['10M', '15M', '1M', '5M', '60M', 'D', 'M', 'W']}}

GetData 指定した銘柄のデータを取得する

こちらは他で呼び出されることが多い範囲内のデータを返す関数です。
とはいえ、SQL構文で日付をいくつ以上、いくつ以下のスパンで返してくれというだけなので、Pythonのコードは非常にすっきりしています。

これを実行することで、データベースに登録されているテーブルの形でそのまま取得ができます。

GetDayVolume 1日あたりの出来高を取得

次は出来高関連です。
出来高が少ない銘柄だと窓ばっかりになってしまうことがあります。
それを避けるために、こちらの関数ではコードと足種、そして日付を指定することで、その日の出来高を返すことができます。
例えば1分あたりなら1000以上の出来高がなければやめるといった判断材料にできます。

演算機能関連

Check_AvailableDate テクニカル指標の計算ができる最も古い日付を返す

演算関連、最初に紹介するのがこちら。

公式ツールとかでも上場したばかりのデータだと移動平均線がなかったり、本数が少なかったりしますよね?こういうのは過去のデータを使って計算するので、それ以上古いデータがないとエラーになります。

それでもいいならいいんですが、全てのデータが揃ってないと困るよ。といった場合は、この関数を使ってどこまでだったら戻ってもいいのかという日付を取得することができます。

ちなみに移動平均線が一番長いと思うので、移動平均線の一番最後の日付で計算してます。
逆に言えば、あんまり長い移動平均線を登録してしまうとデータ数が減ります。

GetData_Teck テクニカル指標付きでデータを返す

データ取得関数のテクニカル版です。
データ取得関数では、ただデータベースからデータを引っ張るだけでしたが、こちらはそのデータにプラスしてテクニカル指標を計算した上で返すことができます。

こちらの工夫した点としては、データを取得する際に移動平均線の本数分余計に取得することです。
例えば100日であれば指定した日から100本前のデータまで取得するようにして、正常に計算できるようにしています。

ちなみに無料で書くとこじゃないかなと思ったのでモザイクにしてますが、他のテクニカル指標に関してはtaライブラリを用いて計算しています。
なので、さすがにこのテクニカル指標付きのクラスまで配布するかどうかは未定です。

グラフ関連

Plot 指定されたデータフレームをプロットする

ベースクラスにて定義しているシンプルなプロットについて説明します。

こちらの関数は読み込んだデータを渡すことで、シンプルなグラフをプロットすることができます。

コードの方はこんな感じで、事前にGetDataで取得したデータを受け取り、タイトルと保存先などが指定可能というものです。

ここではチャートを描写するためのライブラリである、mplfinanceを利用しています。

株価前提などでデータフレームの中に株関連のデータは名前が決まっているので名前を直します。
次に忘れてはいけないのが、インデックスでこれを日付のところにします。これやらないと落ちます。

コード中盤からはスタイルを決定してプロットしていきます。
一番大事なのが一番上です。ここでフォントを指定します。日本語が使えるフォントでないと日本語が□□□になってしまいますので、銘柄の名前とかを載せたい人は必須です。

株価と出来高の比率はpanel_ratiosの部分で調整が可能です。
画像の大きさはfigsizeで調整が可能です。

最後の保存の部分はパスをしてすれば画像として保存します。バイトIOで返すこともできるので、他の関数からの呼び出しもできます。

ちなみにこの関数はコマンドラインからの呼び出しに対応させているので、使い方は以下のようなサンプルになります。

Plot 指定されたデータフレーム(テクニカル指標付き)をプロットする

こちらの関数は上で定義しているテクニカル指標付きであることが前提ですが、グラフとしてプロットすることができます。

実際にプロットするとこんな感じになります。
ここで全て表示してしまうと何の指標計算してくれるのか、バレちゃうんで消しちゃいますけど…。
こちらは先ほどから表示しているNTTの5分足株価ですね。

このような形で自分の計算した指標が本当に正しいのか、公式のトレーディングツールと照らし合わせて確認という意味でも使うことができます。

コード前半はこんな感じ。
シンプルと違って一番上の関数はリサイズ用の関数で余白が結構大きいので、自動的にカットする関数が追加されています。

次に線の色とを追加ですね。移動平均線は自動で計算できるらしいですが、私の場合は自分で後で追加しています。
事前に設定されている移動平均線の設定で追加をしていきます。その時に色が変わるように上で色も定義しています。

他のテクニカル指標に関しても名前で絞り込みつつ線を追加しています。
この時、一番上のチャートに重ねたい場合はパネルを0に設定し、出来高に重ねたい場合はパネルを1、それ以降分けたい場合はパネルを2以上で設定していきます。
こうすることで、今回の画像のようにテクニカル指標が分離されて表示されます。

次の行からが細かいスタイルの設定です。
公式のドキュメントを見て、自分の気に入ったベーススタイルを設定しましょう。なお、ベーススタイルによっては自動的に日本語フォントが当たることがあるみたいです。
その下で陰陽線の色やエッジなどを細かく設定していきます。

スタイルの準備ができたら表示していきます。
プロットの中で調整するべきはpanel_ratiosよりも下ですね。
panel_ratiosは、各パネルの大きさの割合を表し、今回はチャートが4、それ以外が1の割合になるようにしています。
タイトルは自由につけてください。
サイズについてはこれx100ピクセルで出てくるみたいです。

そして凡例ですね。
これに関しては一度プロットして中身を見ないとどこに何のグラフが当たっているのか分かりません。
基本的には偶数のインデックスが各パネルに当たっているみたいですが、最後の7番だけ、なぜか7番が当たってたりします。本当に意味が分かりません。

また、パネルの中にローソク足と移動平均線の2つが入っている場合は、そのままラベルを当てようとすると、移動平均線用の凡例がローソク足に当たるという意味のわからない状態になります。
なので、種類がいくつかある場合は"handles=axes[0].lines"のように明示的にラインズなどを指定する必要があります。
もしも種類が同じ場合は・・・多分分離できません。

余計な余白のトリミングです。PILLOWを使って自動的にバウンディングボックスを計算し、ミニマムサイズ+10ピクセルでトリムします。
なので、この時点で最初に設定したPixelよりも少し小さくなります。

このプロット関数を呼び出すまでの一連のコードがこちら
テクニカル指標計算済みのデータフレームを取得した後、単純にこのプロット関数に渡すだけという簡単なお仕事です。

d = DBStockClient_Cal("remote","XXXXXXXXXX","192.168.0.X")   
c = d.GetData_Teck("9432","5M","2025-5-2 0:0:0","2025-5-3 0:0:0")     
d.Plot(c,"","test.png")

まあ、この記事の内容の関数を作るのに3日かかってるんですけどね。


ここまでの内容でアップデート

前回の記事の配布についているCSVをデータベース化するためのスクリプトですが、今回の内容でアップデートします。

CSVとして取得する使い方

前回はアップロードだけで終わってしまいましたが、CSVとして再取得するためのコマンドラインオプションを追加しました。

例えば、5月1日  - 2日の5分足を取得する例は以下です。

>py DataBase2.py -m getcsv -f "ntt.csv" --code 9432 -k 5M --span1 "2025-5-1 0:0:0" --span2 "2025-5-2 23:0:0"
2025-05-06 15:34:21,724 INFO DataBase2 計134件のデータを取得しました

取得したCSVを開くとこんな感じです。元々エクセルのツールで扱っていた形式として取得が可能です。

データベースのバックアップとして全て取得する

次にデータベースから全てのCSVを取得して圧縮する例です。こちらは簡単でモードをクローンにして保存先を指定するだけ

py DataBase2.py -m clone -f "bak.zip"
2025-05-06 15:37:06,427 INFO DataBase2 Stock_XXXXを処理中(1/627)
2025-05-06 15:37:06,946 INFO DataBase2 Stock_XXXXを処理中(2/627)
2025-05-06 15:37:07,865 INFO DataBase2 Stock_XXXXを処理中(3/627)

出来上がったZIPファイルを開くとこんな感じ
元々は1.2gbくらいあったはずなんですが、これだと200MBくらいまでちっちゃくできます。まあデータベースは5GBくらいあるんですけど。

ちなみに中身は以下のようで、データベースと全く同じになってます。

シンプルなプロット

上で少し説明したシンプルなプロットのコマンドの使い方です。
構文は以下の通りでファイルが出力されます。

>py DataBase2.py -m plot -f "ntt.png" --code 9432 -k 5M --span1 "2025-5-1 0:0:0" --span2 "2025-5-2 23:0:0"

画像データを開くと以下のようになっています。

まとめ


配布情報

前回の記事で配布しているものをアップデートしています
updateフォルダの中身の方をご利用ください


いいなと思ったら応援しよう!

Rcat999 情報が役に立ったと思えば、僅かでも投げ銭していただけるとありがたいです。