Python&WebSocketによる市場データ保存システムの設計と改良

日経平均株価225銘柄をリアルタイムで見れるページを作りました

ブラウザでリアルタイムに日経平均株価の構成銘柄225社すべての株価を一覧表示できるページを作成しました。指数(日経平均、TOPIX、JPX400)と各銘柄の株価、値動き、業種分類がひと目で分かり、業種別フィルタリングや銘柄検索にも対応しています。スマートフォンからでも見やすいレスポンシブデザインを採用し、価格が更新されると視覚的にお知らせする機能も実装しています。以下は私がPCの電源を入れているときに見れます。

URL: https://nk225.minokamo.xyz

目次

システムの基本的な仕組み

Excelから株価データを読み取り、Webサーバーを経由してブラウザに表示する仕組みになっています。株価が更新されると自動的にブラウザ側も更新されるため、常に最新の情報を確認することができます。

主な機能

  • 日経平均、TOPIX、JPX400の指数表示
  • 225銘柄の株価・騰落率表示
  • 業種別フィルタリング
  • 銘柄名・コードによる検索機能
  • スマートフォン対応のレイアウト
  • 価格更新時の視覚的フィードバック

使い方

  1. ブラウザでページを開く
  2. 画面上部に指数情報が表示される
  3. その下に225銘柄が表示される
  4. 業種フィルターで見たい業種を選択できる
  5. 検索ボックスで特定の銘柄を探すことができる

注意事項

表示される情報は参考値としてお使いください

株価情報の更新頻度はExcelファイルの更新に依存します

日経平均採用銘柄のみ対応しています

補足:データソースについて

実はこのシステムは、証券会社のツールなど株価データをリアルタイムに取得できるソースがあれば、Excelに限らず動作させることが可能です。データを取得して変換・送信する部分と、表示する部分が分かれて設計されているためです。つまり、証券会社が提供するAPIやその他の市場データソースに接続するように改修すれば、より正確でリアルタイム性の高いシステムとして運用することができます。

現在はExcelをデータソースとして使用していますが、これは開発時の検証用として採用したものです。将来的により良いデータソースが見つかれば、表示部分はそのままに、データ取得部分だけを改修することも可能です。

プログラムの構成

このシステムは、大きく分けて2つのPythonプログラムで構成されています。

データ送信プログラム

株価データを取得し、WebSocketサーバーに送信するプログラムです。データに変更があった場合のみ送信することで、サーバーの負荷を軽減しています。

データ受信・配信プログラム

FastAPIを使用したWebSocketサーバープログラムです。受信したデータをブラウザにリアルタイムで配信します。複数のクライアントに同時配信が可能で、スマートフォンなどのモバイル端末からもアクセスできます。

プログラムのソースコードは全てPythonで書かれており、必要最小限のモジュールで実装しています。WebSocketを採用することで、データの更新をリアルタイムに反映することができます。

先物情報モニターも作りました

先物取引の情報をリアルタイムに確認できるページも同様の仕組みで作成しています。このページでは以下の情報がリアルタイムで確認できます:

  • 日経225先物(ラージ、ミニ、マイクロ)の価格と変動
  • TOPIX、JPX日経400、グロース250の先物情報
  • 為替情報(USD/JPY、EUR/JPY)
  • 板情報(売買数量)のビジュアル表示
  • 歩み値(時系列での価格推移)
  • 価格推移のグラフ表示

URL: https://nk225.minokamo.tokyo

見やすさを重視し、ダークモードにも対応しています。スマートフォンでも快適に閲覧できるよう、レスポンシブデザインを採用しました。

先ほどの株価表示システムと同様に、データ更新があった場合のみ画面が更新される仕組みになっています。これにより、サーバーへの負荷を抑えながらリアルタイムな情報提供を実現しています。

株価の歩み値保存システムの改良について

以前、株価の歩み値をリアルタイムで保存するシステムを作成し、ブログ記事GitHubで公開しました。このシステムはPythonとVBAを組み合わせて、データの重複を避けながら効率的に歩み値を保存することができます。

現在のシステムの特徴

  • エクセルファイルの監視によるデータ取得
  • ハッシュ値を使用した重複データの除外
  • エクセルファイルとデータベース(MySQL/MariaDB)への保存
  • 低リソースでの動作

WebSocketを使用した新しいアプローチ

私は技術的な観点から分析すると、WebSocket方式の方が優位性が高いと考えます。

主な理由は:

  1. データの即時性と確実性
  • WebSocket方式は、データが更新された瞬間にTCP経由で直接サーバーに送信されます
  • ファイル監視方式は、ファイルの変更を検知してから処理を開始するため、タイミングによってはデータの取りこぼしが発生する可能性があります
  1. エラーハンドリング
  • WebSocketは接続状態を常時監視でき、問題が発生した場合即座に検知可能です
  • 通信エラーが発生した場合の再接続処理も実装しやすい
  • ファイル監視方式は、ファイルロックやアクセス権限の問題でデータを取得できないケースがあります
  1. スケーラビリティ
  • WebSocketは複数クライアントへのリアルタイム配信が容易です
  • 将来的な機能追加(例:リアルタイム分析、アラート機能など)も実装しやすい
  1. リソース効率
  • 一見、ファイル監視の方が軽量に見えますが、実際にはファイルI/Oの頻度が高くなるため、必ずしも効率的とは限りません
  • WebSocketは確立された接続を維持するだけなので、オーバーヘッドが少ない場合があります

したがって、歩み値のような時系列データの取得においては、WebSocket方式の方が信頼性が高く、将来的な拡張性も期待できると考えます。この新しいアプローチでのシステムは現在開発中で、完成次第、ソースコードを公開する予定です。より効率的で柔軟な歩み値保存システムの実現を目指しています。

注意事項

新しいシステムの開発にあたっては、以下の点に特に注意を払っています:

  • データの取りこぼしが発生しないような設計
  • システムリソースの効率的な使用
  • 安定性の確保

システム構成の概要

WebSocketを使用したシステムの基本的な構成と動作フローを図で説明します。

データフロー図

sequenceDiagram
    participant Excel as Excelファイル
    participant Sender as データ送信プログラム
    participant Server as WebSocketサーバー
    participant Browser as ブラウザ

    Excel->>Sender: データ更新
    activate Sender
    Note over Sender: 変更検知
    Sender->>Server: TCPでデータ送信
    activate Server
    Server->>Browser: WebSocketでデータ配信
    activate Browser
    Browser-->>Server: 接続維持
    deactivate Browser
    Server-->>Sender: 送信完了
    deactivate Server
    Sender-->>Excel: 監視継続
    deactivate Sender

Excelファイルのデータ更新を検知すると、送信プログラムがTCP経由でサーバーにデータを送信します。サーバーは接続している全てのブラウザに対して、WebSocketを通じてリアルタイムにデータを配信します。

システムアーキテクチャ図

flowchart LR
    subgraph Data Source
        Excel[(Excelファイル)]
    end
    
    subgraph Backend
        Sender[データ送信\nプログラム]
        Server[WebSocket\nサーバー]
    end
    
    subgraph Frontend
        Browser[ブラウザ表示]
    end
    
    Excel -->|データ更新| Sender
    Sender -->|TCP| Server
    Server -->|WebSocket| Browser

このアーキテクチャにより、データソースの変更を即座に検知し、複数のクライアントに同時配信することが可能になります。また、WebSocketによる双方向通信を活用することで、将来的な機能拡張も容易になります。

将来的な展開案

現在検討している発展的なアイデアをいくつかご紹介します:

  1. ハイブリッドアプローチ
  • WebSocketとファイル監視の両方の利点を活かしたシステム
  • WebSocketで受信したデータをローカルにキャッシュし、バックアップとしてファイル監視も並行実行
  • 万が一の通信断やエラー時にもデータの整合性を確保
  1. データ分析機能の強化
  • リアルタイムでの統計分析
  • 特定のパターンを検出した際のアラート機能
  • 過去データとの比較分析
  1. 可視化ツールとの連携
  • 保存したデータをグラフ化
  • トレード支援ツールとしての活用
  • カスタマイズ可能なダッシュボード機能

これらの機能は、今後のアップデートで順次実装していく予定です。また、実装例やサンプルコードも随時公開していきたいと考えています。

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次