まえがき
こんにちは!CTF大好き大学生のスナックです!
今回はセキュリティやCTF関連ではなく、高校時代からやっている機械学習のプロジェクトについて書いていこうと思います。
この記事では、高校時代の探究活動から作り始めた株価予測モデルに、GUIを実装した際に直面した問題と、その解決策について共有します。
もともとこのプロジェクトは、「翌日の株価が上がるか下がるか」を予測するモデルを作るところからスタートしました。最初はLSTMを使っていたのですが、Transformerを試したところ精度が格段に向上し、その面白さにのめり込んでいきました。
ただ、このモデルはCUIでしか使えず、自分以外の人にはなかなか触ってもらえません。せっかくなので、もっと多くの人に手軽に試してもらえるように、GUI化に挑戦してみました!
今回のプロジェクト概要
実装済みの部分
予測モデル自体はすでに完成しています。
- 予測モデル: Transformerアーキテクチャ。過去の株価データや経済指標を学習し、翌営業日の株価の騰落を予測します。
- データ: 現状は、加工済みのCSVファイルを自分で用意する必要があります。(将来的にはこのデータ準備も自動化したいと考えています!)
GUI化で目指したこと
今回は、このプログラムとユーザーを繋ぐ「見た目」の部分を、Python標準ライブラリのtkinterを使って構築します。
(GUIの基本的なテンプレート作成には、一部AIも活用しました)
具体的な実装ステップは以下の通りです。
- パラメータを定義している変数をコードから読み込み、GUIに表示する
- GUIで値を変更し、「変更確定」でパラメータの変数を更新する
- GUIからモデルの実行関数を呼び出す
- 実行した関数から精度やグラフのデータをGUIに返す
- (重要) 学習処理がGUIを固まらせないように、別スレッドで実行する
課題発生:モデルを実行するとGUIがフリーズする!
ステップ4までは順調に進んだのですが、いざ「予測開始」ボタンを押してみると…
見事にフリーズしてしまいました。
これは、時間のかかる予測モデルの処理(重い処理)をGUIと同じメインスレッドで実行しているため、モデルの処理が終わるまでGUIの描画更新が完全に止まってしまうのが原因です。
解決策:threadingとqueueで処理を分離する
この問題を解決するために、threadingとqueueという2つのモジュールを使いました。
レストランの厨房に例えると分かりやすいかもしれません。
-
threading:新しい作業員(スレッド)を雇うこと。- 重い計算(料理)を専門の作業員(サブスレッド)に任せることで、レジ係(GUI/メインスレッド)はフリーズせずにお客さんへの対応を続けられます。
-
queue:作業員同士の連絡通路(キュー)。- 料理人(サブスレッド)が完成した料理(計算結果)をこの通路に置くと、レジ係(メインスread)が好きなタイミングで安全に受け取れます。これがないと、お互いの状況がわからず、データの受け渡しがうまくいきません。
この2つを組み合わせることで、「重い処理は裏でやりつつ、結果が出たら安全にGUIに表示する」という仕組みが実現できます。
完成したGUI
そして、フリーズ問題を解決して完成したGUIがこちらです!
(※デモ用にほとんど加工していないデータを使用しているため、予測結果は参考にならないと思います)
テキストボックスに株価CSVのパスを入力して「予測開始」ボタンを押すと、裏でTransformerモデルが走り、結果が画面に表示されます。
CUIのままよりも、格段に使いやすくなったのではないでしょうか!
次回以降の展望
無事にGUI化はできましたが、まだまだ改良したい点はたくさんあります。
-
プログラムの改良
- データの加工処理をGUI上で完結させる
- 複数の銘柄を一度に予測できるようにする
- 過去の予測結果の履歴を見られるようにする
-
モデルの解説記事
- 今回背景で動いていたTransformerモデルの仕組みについても、いずれ記事にできればと考えています!
私自身、初学者でまだまだわからないことも多々あります。
この記事が面白いと思っていただけたり、改善点などあれば、ぜひご意見やご感想をいただけると嬉しいです!
最後まで読んでいただきありがとうございました!

