pagetakaBlog

最近リフォームと鳥取県日南町の記事多め。写真、PC、ネット等の話題も

MySQL:DataFrameへ一度に読みこんでスピードアップ(Python, pandas)

【98%程度時間を節約:DataFrame使いSQL回数減らした】

パソコン環境。

  • intel i5-9600K
  • Ram 32GB
  • SSD 480GB
  • Windows11Home
  • Visual Sutudio Code 1.74.2
  • Python 3.9.13(base conda)
  • XAMPP 3.3.0 →MySQL 15.1(MariaDB)
※MySQL内に日ごとの銘柄別データ(前場後場の四本値、出来高ほか)が、76万行以上(容量60MB程度)あります。

実現すること:株で儲ける準備…。

MySQLからデータを読みこみ、設定範囲内の日別データから、標準偏差、相関係数などを計算取得し、条件を満たす銘柄CDと関連データをCSVに書きだします。 具体的には、市場日付、銘柄コード、寄値、加重平均、出来高などを使いました。加工結果として、標準偏差、相関係数、曜日数、寄値の前日差、出来高前日差を1日シフト、などを得て、DataFrame経由でCSVに保管しました。 「出来高前日差を1日シフト」は、ネット徘徊して見かけた「出来高は株価に先行する」「逆時計曲線」などから、出来高を一日シフトし、本当に「先行」しているのか相関を調べたのがきっかけでした。 結論から言えば、「出来高先行」云々は銘柄によって異なり、一律には言えそうもないこと、逆時計曲線もきれいに描かれるのはまれであるということなどがわかりました。もっとも、爺が得られるデータは日別ですので、それより短期で区切りるとどうなのか不明のままです。

行程概要。

大まかな行程は次の通りです。
  1. 最近市場日現在の銘柄コードを取得
  2. 設定範囲N日分データを取得
  3. N日内で新規上場・上場廃止などN日分に満たないデータ数の銘柄コードとそのデータ排除
  4. N日内で寄値が無い、出来高が無いなど商いが薄い銘柄コードとそのデータ排除
  5. 標準偏差、相関係数、曜日数、寄値の前日差など条件を満たす銘柄コードとそのデータをCSV保管
  6. CSV保管したデータを、Excelで開き、関数、グラフを使いさらに検討

銘柄コードごとにSQLしてたら、1,050秒かかった。

MySQLから銘柄コードを取得後、その銘柄コード順にSQL実行したら17分以上かかりました。前項「行程概要」だと「2 設定範囲N日分データを取得」のとき銘柄CDごとにSQL実行、という…。 東証が前市場日データ(PDF)をOPENするのは、前市場日の次の市場日の午前8時半ころです。これをDLし解析したうえ、市場が始まる午前9時までに自前のMySQLにデータとしてUPしたうえで、売買判断に使って証券会社サイトに発注するのは、なかなか至難なことです。寄付までに間に合わない、という…。

MySQLから設定範囲N日分データをDataFrameにしてみたら、14秒くらいで完了。

時間短縮をしようと、MySQLへのアクセス回数を減らすことを考えました。 DataFrameは、pandasで使う表形式データで、これを使おうという爺の妄想です。 最近市場日現在の銘柄コードを取得したのち、全銘柄の設定範囲N日分データ取得を一回のSQLでおこない、DataFrame形式にしました。この結果、前項の手順では銘柄コードの数だけSQLを繰り返していましたが、今回はMySQLからのデータ取得は一回で終了です。 N日分必要データをDataFrameにしてしまえば、その後SQLは必要ありません。N日分全データのDataFrameから、分析したい銘柄コードだけを別DataFrameとしてとりだし、あとは前項の手順に変更なし、という横着をしました。 この結果、14秒程度でCSV保管まですみました。98%程度時間を節約することができた計算になります。

問題は、これでもうけを出せるか、株の売買…。

株価の動きが、標準偏差、相関係数で直接割り出せるはずもなく、線形回帰に落ち着くはずもありません。「逆時計曲線」のきれいな示現もほぼありません。 今回、時間短縮はできたものの、バックテストは未実施で成果不詳、つまり、実戦投入はまだまだ先の話です。今回の時間短縮でほぼその手の作業はできたと考え、バックテストを蓄積データでやれるよう、今回のスクリプトを改良したいと思います。幸い、次の市場日は1月4日、正月に予定はなく、Pythonと株価データで時間つぶしとなりそうです。 良い夢をみながら新年…となりますよう。