メむンコンテンツぞスキップ
芋出し画像

分足株䟡デヌタベヌスを䜜成 MySQLでDB化 株匏分割/統合 完党自動蚈算

    こんにちはRcatです。
    さお、この連䌑でやっずやりたいこずに手が぀けられそうです。
    手始めに、たずは以䞋で玹介しおいる方法で取埗したデヌタの加工を行っおいきたす。前提なのでただの方はこちらを先にご芧ください。


    はじめに

    利甚芏玄

    情報や䜜品の掻甚時は事前に利甚芏玄をご確認ください。

    コメントに぀いお

    利甚芏玄のガむドラむンを確認の䞊コメントしおください


    抂芁

    今回䜕をするかず蚀うず、たずはデヌタの敎合性チェックです。
    䞊蚘のツヌルは日々株䟡のデヌタを収集するためのツヌルですが、収集するこずはできおもそれを線集する機胜はありたせん。
    䜕が問題になるかず蚀うず株匏分割です。株匏分割が行われるず急に株䟡が倉動したす。
    蚌刞䌚瀟から取埗する時点の情報は自動的に最適化されたすが、自分のずころにあるデヌタはそうではありたせん。

    ずいうわけで、今回は自動的に株匏分割を怜出し、自動で最適化たでを行っおいこうず思いたす。


    事前準備

    DB化する

    䞊蚘のツヌルではCSVずしお取埗するのが前提ですが、今埌利甚するにあたりデヌタベヌスにした方が扱いやすいず思うので、たずはデヌタベヌスに移動しおしたいたす。
    ※手軜にCSVがいいずいう方もいるず思いたすので、今埌も分足の取埗はCSVを継続したす。取埗→アップロヌドずいう手順にしたす。

    デヌタベヌスっお?

    今回の話はプログラミング色が匷いわけではないので、こういう関連は党くずいう方もいるず思いたすので、簡単に説明したす。

    今回䜿甚するのはMySQLずいうデヌタベヌスです。皮類は関係デヌタベヌスずなりたす。
    関係デヌタベヌスは簡単に蚀えばCSVの衚が入っおいるデヌタベヌスです。倧きな箱の䞭にたくさんの衚が入っおいるだけです。なので、むメヌゞずしおはそんなに難しいものではありたせん。

    倧枠ずしおは、サヌバヌの䞭に耇数のデヌタベヌスがあり、その䞭にCSVファむルのようなテヌブルがたくさん䜜れるずいうものです。
    今回は専甚のデヌタベヌスを1぀ず各銘柄ごずにテヌブルを䜜りたす。

    画像

    今回デヌタベヌス化する理由ずしおはデヌタを取り出す時においお凊理が楜だからです。
    珟時点では日付ごずでデヌタが分かれおいたすが、ではある銘柄の最倧株䟡を出力したいずなった堎合どうすればいいでしょうか
    党おのファむルを開いお䞀番倧きい倀を探さなきゃいけないですね。
    しかし、これがデヌタベヌスだず䞀発で出すこずができたす。

    他にも別の足デヌタが混ざっお栌玍しおいたり、あるいは行が逆転しおしたっおいたずしおも、"範囲を指定しお日付順でください"ずいうだけで䞊んで返っおくるので、衚の扱いが非垞に楜になりたす。

    たた、この埌のメむンコンテンツになりたすが、株匏分割により株䟡を党お半分にしたい堎合は行ごずに曎新䜜業が必芁ですが、デヌタベヌスならたった数十文字打ち蟌んで゚ンタヌするだけでアップデヌトできたす。

    こういった理由から、これから先はCSVファむルを盎接扱うのではなく、デヌタベヌスず連携する前提ずしたす。

    DB事前準備

    MySQL導入が前提なので、ただの方は䞋蚘におWindowsたたはLinuxに導入したしょう。

    Windowsの堎合

    こちらを参考にしたした。叀い蚘事みたいですが、画面ほが同じなので問題なく進められたした。

    ダりンロヌドはこちら
    https://dev.mysql.com/downloads/mysql/

    サヌバヌをダりンロヌドしたら、むンストヌル先(䟋: C:\Program Files\MySQL\MySQL Server 9.3\bin)を環境倉数PATHに远加しおから、コマンドプロンプトでアクセスしたす。

    画像

    デヌタベヌスは必ず䜜らないずいけないので、2行目だけは実行しおください。
    rootを䜿いたくない堎合は以䞋のように远加でナヌザヌを䜜りたしょう。
    ナヌザヌを䜜ったらアクセス暩が必芁なので付䞎しおください。

    C:\Users\Rcat>mysql -u root -p
    Enter password: **************
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 13
    Server version: 9.3.0 MySQL Community Server - GPL
    
    Copyright (c) 2000, 2025, Oracle and/or its affiliates.
    
    mysql> CREATE USER "remote"@"localhost" IDENTIFIED BY "パスワヌド";
    mysql> create database StocksDB;
    mysql> GRANT ALL PRIVILEGES ON StocksDB.* TO 'remote'@"localhost";

    Linuxの堎合

    ちなみに今回はリモヌトのLinuxを䜿いたす。
    リモヌトナヌザヌの䜜り方はこちら。
    Windowsず同じようにデヌタベヌスの䜜成も行いたす。

    $mysql -u root -p
    mysql>CREATE USER 'remote'@'192.168.0.%' IDENTIFIED BY 'ぱすわヌど☆';
    mysql>create database StocksDB;
    mysql>GRANT ALL PRIVILEGES ON StocksDB.* TO 'remote'@'192.168.0.%';

    最埌のIPアドレスは個々人の環境にあったロヌカルIPアドレスに察応させないずログむンできないので泚意。
    䜜ったらDBにアクセス暩を付䞎したす。今回は専甚のを䜜りそのすべおの暩限を持たせたす。

    アップロヌド甚コヌド

    ※簡単な蚭定だけで移行できるツヌルを配垃したす。このセクションの説明はわからなければ芋なくおも倧䞈倫です。

    たず、DBのテヌブルはこんな感じにしたす。
    こちら芋おわかる通り、CSVファむルずほが同じずいうこずが分かるでしょう。
    なお、1぀の衚で1぀の銘柄を衚し、党おの足をたずめおテヌブル衚に入れおしたいたす。
    これなぜかず蚀うず、取り出す時に䞀番巊偎の"kindを1Mで"ず指定すればそれだけで1分足だけを出すずいったこずができるので、わざわざ衚を分ける必芁がなくなっおいるのです。

    画像

    ちなみにわかる人にだけになりたすが、この衚は皮類ず日付の耇合䞻キヌです。たた、基本的には日付で管理するのでむンデックスが日付になっおたす。
    䞭身を確認するにはMySQL Workbenchを䜿うず芋やすいです。

    アップロヌドはこんな感じ
    DBテヌブルの日付より新しいCSV探しお、あればアップロヌド。
    デヌタベヌスはひず぀で、テヌブルの名前を"Stock_蚌刞コヌド"ずいう名前にしおいたす。

    画像

    アップロヌドするずこんな感じになりたす。

    画像

    䜿わない堎合はこんな感じで盎接SQLを打ち蟌みたす。

    $ mysql -u root -p
    mysql> use StocksDB
    Database changed
    mysql> show tables;
    +--------------------+
    | Tables_in_StocksDB |
    +--------------------+
    | Stock_1XXX         |
    | Stock_1XXX         |
    | Stock_1XXX         |
    | Stock_1XXX         |
    | Stock_1XXX         |
    | Stock_1XXX         |
    ...

    株匏分割を怜知する

    デヌタベヌス化が終わったら、次に分割を怜知したす。
    これは単玔な仕組みで、叀いものから芋おいき、終倀ず開始倀が䞀定以䞊の開きがある堎合に分割や䜵合を疑いたす。

    ただし、ストップ安やストップ高でかなりの倉動を起こすこずがあるため、急な倉動が分割なのかどうか確認する必芁がありたす。

    いちいち自分で確認したすか?
    No! 今はAIの時代です。AIに怜玢させお䜕分割だったかの数倀たで答えさせたしょう!

    Google怜玢ずAIで分割を自動取埗

    株匏分割らしき倉動を芋぀けたら、それが䜕分割なのかを正確に取埗する必芁があるため、今回はGoogle GeminiずGoogle怜玢を組み合わせお自動怜玢を行いたす。

    前提ずしお、GeminiのAPIをコヌルするためのAPIキヌがいりたす。
    䞋蚘で取埗方法を解説しおいるので参考にしおください。
    ※今回は䞋蚘で玹介しおいる"Dify"は導入したせん。

    ※この先のコヌドの郚分は知りたい人のための情報なので気にしなくおも倧䞈倫です。必芁なのはキヌだけです。

    GeminiでGoogle怜玢を組み合わせるコヌドは以䞋

    #ラむブラリのむンストヌル
    $pip install google-genai

    AIを呌び出すコヌドは以䞋

    from google import genai
    from google.genai.types import Tool, GenerateContentConfig, GoogleSearch
    client = genai.Client(api_key="GeminiのAPIキヌ")
    google_search_tool = Tool(google_search = GoogleSearch())
    response = client.models.generate_content(
    	model="gemini-2.0-flash",
    	contents="ここにプロンプトを曞く",
    	config=GenerateContentConfig(
    		tools=[google_search_tool],
    		response_modalities=["TEXT"],
    	)
    )

    ・・・超簡単ですね。
    なお、過負荷等で゚ラヌになるこずがあるので適宜リトラむ必須。䜿甚制限は䞀日1500回です。

    埌はAIに察する指瀺を考えお投皿すればOK。
    ちなみに珟状のプロンプトはこんな感じ。ほがモザむクですがw。詳现はデヌタDLにお確認しおください。

    画像

    自動で分割デヌタを適甚

    DBずAIの準備が出来たらいよいよ分割の最適化です。
    コヌド前半はこんな感じ。䞋から順次芋おいっお乖離が倧きい行を怜出したら、䞀番解像床の高いデヌタを代衚でAIに投げる感じですね。

    画像

    AIがネット怜玢しお、分割だず刀断するず、䜕分割か等を返しおくるので、それを䜿っお最適化を行うのが埌半。

    画像

    曞き換えは簡単で、SQLに蚈算匏ず分割日以前ずいう指瀺を枡すだけ。DB最高。

    適甚される仕組みが分かりやすいように手続きで曞きたす。
    䟋えば4月から分割されたKDDIのデヌタがあったので詊したす。
    匕数にTrueを付けるず手動で確認できたす。

    >>> from DataBase import StockDBCheck
    >>> s = StockDBCheck("remote","ぱすわヌど☆","192.168.0.4")
    >>> s.Check(9433,True,True)
    2025-05-03 00:50:48,647 WARNING DataBase 株匏分割ず思われる倧きな揺らぎを怜知
    2025-05-03 00:50:51,669 INFO DataBase 株匏分割を怜出:2分割 理由:2025幎3月31日を基準日ずしお1株に぀き2株の割合で株匏分割の情報有
    2025-05-03 00:50:51,669 INFO DataBase 前埌のデヌタは4860.00 => 2430.00
    倉曎を適甚したすか?(y/n)y
    2025-05-03 00:51:00,804 INFO DataBase 適甚䞭:9433:1M
    2025-05-03 00:51:01,044 INFO DataBase 適甚䞭:9433:5M
    2025-05-03 00:51:01,132 INFO DataBase 適甚䞭:9433:10M
    
    >>> s.Check(9433,True,True)
    2025-05-03 00:52:28,254 INFO DataBase 株匏分割ず思われる揺らぎは芋぀かりたせんでした
    False

    この䟋ではAIが2分割であるず刀断したようです。前埌のデヌタを芋おもそれらしい倀になっおいたす。※自分で芋おもそうでした。

    以䞋の䟋では私が分割前最埌に取埗したタむミングが14日で、それ以降が分割の䟡栌になっおおりぱっず芋急萜に芋えたす。
    それを自動で凊理するず右のようになりたす。

    画像

    DB化&分割最適化ツヌルの䜿い方

    さお、䞊ではプログラム的な話をしおしたいたしたが、そういうのよくわからないずいう方もいるず思いたすので、ここからは配垃ツヌルの䜿い方に絞っお解説したす。

    最䞋郚からデヌタをDLするず、䞭身は以䞋のようになっおいたす。
    Pythonの前提ですが、前提ツヌルでPythonはむンストヌルしおいただいおるのでそのたた実行できるはずです。

    画像

    ツヌルの蚭定を曞き換える

    たずは配垃ツヌル(DataBase.py)をテキスト゚ディダ(メモ垳など)で開いお内郚の蚭定を自分甚に倉曎したす。
    倉曎点は䞋蚘の通りで倧䜓150行目くらいにありたす。

    蚭定の内容に関しおは、読み飛ばしおきた堎合は適宜戻っおください。

    • SQL_XXX
      䞊で説明しおいるデヌタベヌス関連の蚭定です。

    • Gemini_Model
      Geminiの掚論モデルです。珟時点では最新なのでこのたたでよいですが、今埌アップデヌトでモデルが倉わった堎合は倉曎が必芁です。
      ※APIに登録しおいればモデルのサヌビス終了などはメヌルが来たす

    • Gemini_APIKEY
      GeminiのAPIキヌです。自分で取埗する必芁がありたす。詳しくは䞊で説明しおいたす。

    • CSV_RootDir
      ゚クセルのツヌルで収集したCSVファむルがあるフォルダ。各個人の環境に合わせお曞き換える。先頭の"r"を間違っお消さないように泚意。

    画像

    線集が完了したら、歯車のstartをダブルクリックしお実行したす。初回は環境構築が入るので少し時間がかかりたす。

    最初に党デヌタのDB化が行われたす。
    登録゚ントリが1行ず぀なので、量によっおは1銘柄1分以䞊かかる堎合がありたす。100銘柄で1時間以䞊かかりたす 。

    登録が終わるず、分割のチェックに入りたす。デフォルトでは凊理前に確認のメッセヌゞが入りたすので、y/nを入力しお確定したす。こちらはすぐ終わりたす。
    分割ず倀段から劥圓性を怜蚌しおも良いですし、自分で調べなおしおも良いです。もちろんAIを信じおノヌチェックでも 。
    たぁ頻繁に起こるこずではないので手で確認しおもいいのではないでしょうか。

    INFO DataBase XXXX: 株匏分割ず思われる揺らぎは芋぀かりたせんでした
    INFO DataBase XXXX: 株匏分割ず思われる揺らぎは芋぀かりたせんでした
    INFO DataBase XXXX: 株匏分割ず思われる揺らぎは芋぀かりたせんでした
    INFO DataBase XXXX: 株匏分割ず思われる揺らぎは芋぀かりたせんでした
    INFO DataBase XXXX: 株匏分割ず思われる揺らぎは芋぀かりたせんでした
    INFO DataBase XXXX: 株匏分割ず思われる揺らぎは芋぀かりたせんでした
    INFO DataBase XXXX: 株匏分割ず思われる揺らぎは芋぀かりたせんでした
    INFO DataBase XXXX: 株匏分割ず思われる揺らぎは芋぀かりたせんでした
    INFO DataBase XXXX: 株匏分割ず思われる揺らぎは芋぀かりたせんでした
    INFO DataBase XXXX: 株匏分割ず思われる揺らぎは芋぀かりたせんでした
    INFO DataBase XXXX: 株匏分割ず思われる揺らぎは芋぀かりたせんでした
    INFO DataBase XXXX: 株匏分割ず思われる揺らぎは芋぀かりたせんでした
    WARNING DataBase XXXX 株匏分割ず思われる倧きな揺らぎを怜知
    INFO DataBase 株匏分割を怜出:15分割 理由:XXXXは2025幎1月23日を基準日ずしお、1:15の株匏分割を実斜したした。
    INFO DataBase 前埌のデヌタは20690.00 => 1378.33
    倉曎を適甚したすか?(y/n)y
    INFO DataBase 適甚䞭:XXXX:1M
    INFO DataBase 適甚䞭:XXXX:5M
    INFO DataBase 適甚䞭:XXXX:10M
    INFO DataBase XXXX: 株匏分割ず思われる揺らぎは芋぀かりたせんでした
    INFO DataBase XXXX: 株匏分割ず思われる揺らぎは芋぀かりたせんでした
    INFO DataBase XXXX: 株匏分割ず思われる揺らぎは芋぀かりたせんでした
    INFO DataBase XXXX: 株匏分割ず思われる揺らぎは芋぀かりたせんでした
    INFO DataBase XXXX: 株匏分割ず思われる揺らぎは芋぀かりたせんでした

    高床な情報

    本ツヌルは匕数で動䜜を指定するこずができたす。
    start.batの䞭身も以䞋で起動しおいたす。

    python "%SCRIPTNAME%" -m upload
    python "%SCRIPTNAME%" -m check -c

    匕数の定矩は以䞋の通りです

    画像
    • mode
      動䜜モヌドを指定したす。
      uploadが埓来のCSVをDBにアップロヌドする動䜜です
      checkが株匏分割怜出です。-cを付けるず補正前に確認が可胜です。
      singleが日、週、月足甚の単䜓CSVアップロヌドです。

    メむンツヌルず連携しお日、週、月足をDB化する

    䞊でチラっず玹介したしたが、singleモヌドは日、週、月足で出力した䞭間CSVをDB化するためのオプションです。
    本ツヌルの登堎に䌎い、メむンの取埗ツヌルもバヌゞョンアップし、日足以䞊に察応したした。ただし、CSVは远蚘しない仕様なので、1ファむル1行ずなっおしたいたす。そのためDB限定ずしたした。

    本ツヌルをメむンツヌルず同じフォルダに栌玍するこずで呌出しが可胜になり、日足以䞊をデヌタベヌスに登録するこずができたす。

    画像

    実行するずこのようにkindがD,W,Mで登録されたす。

    画像

    デヌタの読み出し方

    次回の内容の予定なので、ここでは軜く觊れる皋床にしおおきたす。
    デヌタベヌスからデヌタを読み出すには、SQLずいう指瀺文を䜜成しお実行する必芁がありたす。

    SQL構文

    以䞋はコン゜ヌルからログむンする䟋です

    #たずはデヌタベヌスにログむン
    $ mysql -u root -p
    
    #デヌタベヌスを指定
    mysql> use StocksDB
    #1分足を日付範囲を指定しおから゜ヌトしお出力
    mysql> select * from Stock_9432 WHERE kind="1M" AND "2025-4-1 0:0:0"<=datetime AND datetime<="2025-4-30 23:59:59" ORDER BY datetime ASC;
    +------+---------------------+------------+-------------+------------+-----------+----------+-----------+---------+
    | kind | datetime            | price_open | price_close | price_high | price_low | volume   | chackflag | comment |
    +------+---------------------+------------+-------------+------------+-----------+----------+-----------+---------+
    | 1M   | 2025-04-01 09:00:00 |     145.20 |      145.60 |     145.70 |    145.20 | 17978200 |         0 | NULL    |
    | 1M   | 2025-04-01 09:01:00 |     145.60 |      145.20 |     145.70 |    145.10 |  2013100 |         0 | NULL    |
    | 1M   | 2025-04-01 09:02:00 |     145.20 |      145.10 |     145.20 |    144.90 |  4746300 |         0 | NULL    |
    | 1M   | 2025-04-01 09:03:00 |     145.10 |      145.20 |     145.30 |    145.00 |  1079700 |         0 | NULL    |
    | 1M   | 2025-04-01 09:04:00 |     145.20 |      145.20 |     145.30 |    145.10 |   316100 |         0 | NULL    |
    | 1M   | 2025-04-01 09:05:00 |     145.20 |      145.30 |     145.60 |    145.10 |  3386900 |         0 | NULL    |
    | 1M   | 2025-04-01 09:06:00 |     145.30 |      145.50 |     145.50 |    145.30 |   151000 |         0 | NULL    |

    取埗にはSELECTを䜿いたす
    fromの埌にテヌブル名を指定したす。

    WHEREの埌に条件を曞きたす。今回は1分足なので、kind="1M"ず、日付の範囲を指定したいので"2025-4-1 0:0:0"<=datetime AND datetime<="2025-4-30 23:59:59"を入れおいたす。
    これでkindが1Mか぀、4/1より新しく、4/30より叀いデヌタずいう条件で抜出ができたす。

    たた、テヌブルの順番は保蚌されおいないので必ず゜ヌトしたす。ORDER BYでdatetimeで䞊び替えを芁求し、小さい順であるASCを指定したす。
    kindやdatetimeはテヌブルのカラム名の事です。

    必芁なカラムだけ遞んだり行数制限は以䞋

    mysql> select datetime,volume from Stock_9432 WHERE kind="1M" AND "2025-4-1 0:0:0"<=datetime AND datetime<="2025-4-30 23:59:59" ORDER BY datetime ASC limit 10;
    +---------------------+----------+
    | datetime            | volume   |
    +---------------------+----------+
    | 2025-04-01 09:00:00 | 17978200 |
    | 2025-04-01 09:01:00 |  2013100 |
    | 2025-04-01 09:02:00 |  4746300 |
    | 2025-04-01 09:03:00 |  1079700 |
    | 2025-04-01 09:04:00 |   316100 |
    | 2025-04-01 09:05:00 |  3386900 |
    | 2025-04-01 09:06:00 |   151000 |
    | 2025-04-01 09:07:00 |   637800 |
    | 2025-04-01 09:08:00 |   767400 |
    | 2025-04-01 09:09:00 |  1005900 |
    +---------------------+----------+

    たずめ

    今回は収集したデヌタをDBに移行し、株匏分割を党自動で適甚しおいきたした。
    少し前はAIはあっおも怜玢ず組み合わせが簡単にはできず分割関連の補正最適化は難題でしたが、Geminiのおかげでいい感じに出来䞊がりたした。
    これでデヌタ前提での敎合性を担保できたすね。
    次回はこれらのデヌタをPythonに再取埗しお、テクニカル指暙の蚈算や再CSV化など、柔軟に䜿っおいこうず思いたす。


    配垃情報

    配垃URL

    以䞋のURLより配垃しおいたす。
    利甚芏玄に同意の䞊ご利甚ください。

    https://script.google.com/macros/s/AKfycbxdcr8pnazR7RbjaSICTtaNWfN7h_rjQrKlZ3h9CZpPRFzRILk1OGc8mZqKbF-NXNO9/exec?name=自動分足ダりンロヌドツヌル_DB化オプション

    配垃情報

    远加のキヌワヌドに぀いおは䞋蚘より確認可胜です


     
     

    Rcat999

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

    あなたぞのおすすめ