メむンコンテンツぞスキップ

分足株䟡から指暙蚈算やプロット 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

     
     
    モノづくりが趣味。 "売っおないなら自分で䜜ればいいじゃない"をコンセプトに、機械/電気/AI/プログラム/ネットワヌク 党郚やりたす。 蚘事執筆はAI䞍䜿甚。 ご連絡や利甚芏玄はプロフィヌル蚘事参照。

    あなたぞのおすすめ