7
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

MySQL×株式投資|「やりっぱなし」から「資産」を作る!MySQLでスクリーニング結果を蓄積・分析する基盤を作る(導入編)

7
Last updated at Posted at 2025-07-14

毎日溜まるCSVをデータベース化!AWS RDS + MySQL + DBeaver + Pythonで株式投資の効率的な分析環境を整えたい

Screenshot 2025-07-12 at 22.48.55.png

はじめに

これまで、「銘柄スクリーニング毎日自動通知Bot」を構築するため、生成AIを活用した環境構築から、スクリーニング結果の可視化・X投稿、そしてMacのCronを使った定時運用までを行ってきました。

これで、仕事で疲れてお布団に吸引されそうになっても、私の代わりにBotが健気に働き、X(旧Twitter)にスクリーニング結果を知らせてくれるようになりました。めでたしめでたし……。

……と、なるはずでした。

これまでの経緯

本記事は、Pythonによる株式スクリーニング自動化・実践の続編です。これまでの背景や検証の流れは、以下の記事をご確認ください。

現在構築中のスクリーニングモデルの全体像
Screenshot 2025-07-05 at 9.05.04.png


課題は次々と押し寄せてくる

数日間Botを運用してみて、新たな課題が見えてきたのです。

そう、「スクリーニング結果(CSVファイル)が、ただただ溜まっていくだけ」 という問題です。

「あれ、1週間前にpattern3でヒットした銘柄って何だっけ?」

「この銘柄、過去に何回くらいスクリーニングに引っかかってるんだろう?」

「あの時選ばれた銘柄、本当にその後のパフォーマンス良かったのかな?」

これらを調べようにも、Googleドライブのフォルダを遡って、一つ一つCSVファイルを開くのは非常に面倒です。
これでは、せっかくのデータが「やりっぱなしのメモ」でしかなく、「分析して次に活かす資産」になっていません。

そこで今回は、この課題を解決すべく、MySQLデータベースを導入していく様子を紹介します。まずは、日々のスクリーニング結果を蓄積・整理し、いつでも簡単に検索・分析できる「データ基盤」を作ることが目的です。*Macユーザー向けに書いています。

リレーショナルデータベースとは?

リレーショナルデータベースは、データを複数の表(テーブル)で管理し、それらの表同士を関連付けて効率的にデータを保存・検索するシステムです。Excelの表を想像していただくと分かりやすいですが、より高度な機能を持っています。

主な特徴

  • 構造化データ: データ型や制約を定義して、正しい形式のデータのみを保存
  • 高速検索: インデックス(索引)を使い、大量データから瞬時に条件に合うものを抽出
  • データ整合性: 主キーや外部キー制約により、データの一貫性を自動で保証
  • SQL言語: 標準的な問い合わせ言語で、複雑な検索・集計が簡単に実行可能

構築方法の選択肢

  • ローカル構築: PCに直接インストール(無料、PC起動時のみ利用可能)
  • クラウド構築: AWS、GCP、Azureなどのクラウドサービス利用(24時間稼働、月額費用)

今回は、AWSの無料利用枠(12ヶ月間無料)を使ってクラウド構築を選択します。

なぜリレーショナルデータベース(MySQL)を導入するのか

現在、スクリプトはCSVファイルで正常に動作していますが、なぜデータベースを導入するのでしょうか。そのメリットは単に「速い」だけではありません。具体的な「やりたいこと」を例にした3つのシナリオで、その優位性を比較してみましょう。

メリット①:高速なデータ検索と集計

やりたいこと ファイルでのやり方 (The CSV Way) データベースでのやり方 (The MySQL Way)
特定の1銘柄のデータだけを取り出したい ① 巨大なファイルを全部メモリに読み込む
② プログラムで目的のデータを探す
① WHERE ticker = 'XXXX' という命令を送る
② DBが結果だけを返してくれる
PERが10以下の銘柄をすべて探したい ① 全データを1行ずつチェックするため非常に遅い ① インデックス(索引)を使い、該当データを瞬時に見つけ出す
複数日にまたがる銘柄の出現回数を集計したい ① 全CSVファイルを読み込み、結合してから集計する ① 集計済みの結果だけが返ってくる

メリット②:データの一貫性と信頼性

やりたいこと ファイルでのやり方 (The CSV Way) データベースでのやり方 (The MySQL Way)
PERカラムに、誤って文字列("N/A"など)が入らないようにしたい ① Python側で、書き込む前に毎回チェック処理が必要
② チェックを忘れると、不正なデータが混入する
① テーブル作成時にper DECIMALとデータ型を定義
② 数値以外を挿入しようとすると、DBが自動でエラーにしてくれる
tickerが空のデータが登録されないようにしたい ① これもPython側でのチェック頼み ① テーブル作成時にticker NOT NULLという制約を設定
② 必須項目が空のデータは登録できない
同じ日の同じ銘柄のデータを間違えて2回登録したくない ① 登録前に「既に同じデータがないか」を全ファイルに対してチェックする必要があり、非常に困難 ① PRIMARY KEY (主キー) を設定
② 重複するデータはDBが自動でエラーにしてくれる

メリット③:拡張性と将来性

やりたいこと ファイルでのやり方 (The CSV Way) データベースでのやり方 (The MySQL Way)
スクリーニング結果を、TableauなどのBIツール*で可視化・分析したい ① BIツールに毎回手動でCSVをインポート
② データ更新のたびに再インポートが必要
① BIツールからDBに一度接続設定するだけ
② データが更新されれば、ダッシュボードも自動更新される
週末に、別の分析スクリプトも動かしたい ① スクリーニング中に分析スクリプトがファイルを読み込むと、競合や不整合が起きる可能性がある ① 複数のスクリプトから同時に安全にアクセス可能
② DBが交通整理をしてくれる
将来、Webアプリを作ってブラウザから結果を見たい ① Webアプリから安全にファイルにアクセスさせるのは非常に複雑で、セキュリティリスクも高い ① WebフレームワークはDB連携が標準機能
② 安全かつ簡単にWebアプリと接続できる

* BIツール(Business Intelligence): データを視覚的に分析・可視化するソフトウェア。Tableau、Power BI、Lookerなどが有名。グラフやダッシュボードを作成して、データの傾向やパターンを簡単に把握できる。Python(matplotlib、plotly、streamlitなど)でも可視化は可能ですが、BIツールはプログラミング不要で直感的に操作でき、非技術者でも簡単にデータ分析ができる。

それでは、以下のステップを通して、MySQLの導入方法を説明します。

  1. AWSでMySQLサーバーを構築: 無料利用枠を使い、安全なデータベース環境をクラウド上に作成。
  2. PCからの接続設定: セキュリティグループを正しく設定し、自分のPCからのみDBにアクセスできるようにする。
  3. DBeaverでDBを操作: GUIツールを導入し、データベースのテーブル作成やデータ確認を簡単に行えるようにする。
  4. PythonでCSVを一括ロード: 溜まっていた複数のCSVファイルを、Pandasを使って一気にMySQLへ登録。
  5. SQLでデータを分析: 登録したデータを使い、SQLで簡単な集計を行い、データベースの力を体験。

第1部:データベース環境の構築

ステップ1:AWSでMySQLサーバーを用意する (RDS)

AWSのマネージドサービスであるRDS (Relational Database Service) を利用します。
基本的に公式のチュートリアルに則して設定しました。ここからリンクを辿っていくと、簡単に設定できると思います。
ただし、公式の情報が古いのでところどころ違うところがあります。その辺はAIに聞くと大体正確に教えてくれます。今回は、筆者が設定するときに、気をつけたところのみを列記してます。
AWS公式チュートリアル - Amazon RDS で MySQL データベースを作成して接続する

  1. AWSマネジメントコンソールにログインし、「RDS」サービスで「データベースの作成」をクリックします(reagion決めお忘れなく)。
  2. 以下の4点のみ変更し、他はデフォルト設定のままで進めます。
    • テンプレート: 無料利用枠 を選択します。 (重要)
      Screenshot 2025-07-12 at 17.17.12.png

    • 接続 > パブリックアクセス: はい を選択します。 【変更点①】
      Screenshot 2025-07-12 at 17.59.12.png

    • 追加設定 > 初期データベース名: stock_database など、好きな名前を入力します。 【変更点②】

    • 追加設定 > 削除保護: 削除保護を有効にする にチェックを入れます。 【変更点③】

  3. マスターユーザー名とパスワードは必ず控えておき、「データベースの作成」ボタンをクリックします。ステータスが「利用可能」になるまで数分待ちます。

ステップ2:自宅のIPからの接続を許可する (セキュリティグループ)

作成したデータベースに、自分のIPアドレスのみからのみアクセスできるよう設定します。

  1. RDSのダッシュボードで、作成したDBインスタンスの「接続とセキュリティ」タブを開き、VPCセキュリティグループのリンクをクリックします。
    Screenshot 2025-07-12 at 18.02.43.png
    Screenshot 2025-07-12 at 18.06.38.png
    Screenshot 2025-07-12 at 18.23.28.png

  2. 「インバウンドルール」タブ → 「インバウンドルールを編集」をクリックします。
    Screenshot 2025-07-12 at 18.26.16.png

  3. 「ルールを追加」し、以下のように設定します。

    • タイプ: MySQL/Aurora
    • ソース: カスタム を選択し、あなたのグローバルIPアドレス(Googleで「What is my IP」と検索して確認)をXXX.XXX.XXX.XXX/32の形式で入力します。

    Screenshot 2025-07-12 at 18.29.37.png

  4. 「ルールを保存」をクリックします。

ステップ3:DBeaverでデータベースに接続する

データベースを視覚的に操作するツール「DBeaver」をインストールします。

  1. DBeaver公式サイトからmacOS版をダウンロードし、インストールします。
    Screenshot 2025-07-12 at 23.03.31.png

  2. DBeaverを起動し、「新しいデータベース接続(左上の青いソケットのマーク)」から「MySQL」に接続設定を開始します。
    Screenshot 2025-07-12 at 18.57.03.png

    MySQLをクリックしてNext
    Screenshot 2025-07-12 at 18.50.34.png

  3. AWSのRDSで設定した、エンドポイント、ポート(3306)、DB名、ユーザー名、パスワードを正確に入力し、接続します。
    ここで先ほど設定したAWSのMySQLのURL ユーザ名、パスワードを入力して Finish
    Screenshot 2025-07-12 at 17.40.16.png

    このように、データベースが追加されたことがわかります。
    Screenshot 2025-07-12 at 18.54.20.png

こちら記事が勉強になりました。
SQL 初級編 Vol.1(SQLとは?+ MySQLインストール+DBeaver インストール) - DBeaverの詳細なインストール手順と設定方法

ステップ4:データを保存する「テーブル」を作る

今回のデータベースの情報元となるcsvはこのような状態でデータが保存されてます。
Screenshot 2025-07-04 at 7.08.48.png

DBeaverのSQLエディタで、以下のSQLを実行してまず、空のテーブルを作成します。
Screenshot 2025-07-12 at 19.06.21.png

CREATE TABLE IF NOT EXISTS tech_screening_results (
    screening_date DATE NOT NULL,
    ticker VARCHAR(10) NOT NULL,
    local_code VARCHAR(10),
    pattern VARCHAR(50) NOT NULL,
    close_price DECIMAL(10,5),
    ma_5 DECIMAL(10,5),
    ma_25 DECIMAL(10,5),
    ma_75 DECIMAL(10,5),
    ma_5_slope DECIMAL(10,5),
    rsi DECIMAL(7,4),
    per DECIMAL(10,4),
    roe_percent DECIMAL(7,4),
    opm_percent DECIMAL(7,4),
    market_score INT,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (screening_date, ticker, pattern)
);

反映されない場合は、stock_databaseを右クリックして↓を出して、一番下のリフレッシュをクリック。
そうするとTableの中に、tech_screening_resultsという新しいテーブルが追加されている。
Screenshot 2025-07-12 at 19.08.50.png

このように、カラム名だけが記載された空のテーブルが設定されます。   
Screenshot 2025-07-12 at 19.07.47.png

第2部:既存CSVデータの一括ロードと活用

ステップ5.1: 必要なライブラリのインストール

PythonからMySQLに接続するためには、いくつかのライブラリが必要です。

pip install --upgrade pandas sqlalchemy mysql-connector-python python-dotenv mysqlclient

【補足:もしmysqlclientのインストールでエラーが出たら(Apple silicon向け) 】

pandasは、より高速なmysqlclientというライブラリがあればそちらを優先して利用しようとします。しかし、mysqlclientはインストール時にコンパイルが必要で、Macの環境によってはエラーが出ることがあります。

筆者もmacOS Sequoia(Version 15.5)搭載のMacで、このエラーに遭遇しましたが、以下の手順で解決できました。
ただし、macOS Monterey(最終バージョン)では、この方法ではコンパイルできませんでした。mysqlclientがなくても、今回のコードは動作したので、必須な操作ではないと思います。

1. 開発ツールのインストール (Xcode Command Line Tools)
ターミナルで以下のコマンドを実行し、表示されるポップアップで「インストール」をクリックします。

xcode-select --install

2. Homebrewのインストール
HomebrewはMac用のパッケージマネージャーです。まだインストールしていない場合は、以下のコマンドをターミナルに貼り付けて実行します。

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

インストール後、画面に表示されるNext steps:の指示に従い、PATHを通すためのコマンドを実行してください。

echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"

3. Homebrewで必要なライブラリをインストール

brew install pkg-config mysql-client

4. mysqlclientの再インストール

pip install mysqlclient

ステップ5.2: 環境変数ファイルの作成

MySQLへの接続情報を安全に管理するため、環境変数ファイルを作成します。

プロジェクトのルートディレクトリに AWS_MySQL.env ファイルを作成し、以下の内容を記述してください:

DB_HOST=your-database-instance.cjoi2y440nng.ap-northeast-3.rds.amazonaws.com
DB_USER=your_username
DB_PASSWORD=your_password
DB_NAME=stock_database
  • your-database-instance.cjoi2y440nng.ap-northeast-3.rds.amazonaws.com は、AWS RDSで作成したデータベースのエンドポイントに置き換えてください
  • your_usernameyour_password は、RDS作成時に設定したマスターユーザー名とパスワードに置き換えてください

ステップ5.3: PythonでCSVを一括ロードする

手元にある過去のCSVファイルを読み込み、MySQLに一括で書き込むスクリプトです。

ディレクトリ構造の概要

今回のスクリプトは、以下のようなディレクトリ構造に対応しています:

screening_results_folder/
├── 20250702/
│   ├── result_tech_pattern_pattern1_20250702.csv
│   ├── result_tech_pattern_pattern2_20250702.csv
│   ├── summary_tech_screening_20250702.csv
│   └── final_tech_screening_results_20250702.csv  ← 目的のファイル
├── 20250703/
│   ├── result_tech_pattern_pattern1_20250703.csv
│   ├── result_tech_pattern_pattern2_20250703.csv
│   ├── summary_tech_screening_20250703.csv
│   └── final_tech_screening_results_20250703.csv  ← 目的のファイル
├── 20250704/
│   ├── result_tech_pattern_pattern1_20250704.csv
│   ├── result_tech_pattern_pattern2_20250704.csv
│   ├── summary_tech_screening_20250704.csv
│   └── final_tech_screening_results_20250704.csv  ← 目的のファイル
└── 20250705/
    ├── result_tech_pattern_pattern1_20250705.csv
    ├── result_tech_pattern_pattern2_20250705.csv
    ├── summary_tech_screening_20250705.csv
    └── final_tech_screening_results_20250705.csv  ← 目的のファイル
  • 日付フォルダ: YYYYMMDD形式のフォルダ名
  • 目的のファイル: final_tech_screening_results_YYYYMMDD.csv 形式(スクリプトが読み込む対象)
  • 中間ファイル: 各パターンの結果ファイルやサマリーファイル(スクリプトは無視)
  • 再帰検索: スクリプトが自動的にサブフォルダ内のCSVファイルを検索し、目的のファイルのみを抽出します
import pandas as pd
import sqlalchemy
from sqlalchemy import create_engine
from dotenv import load_dotenv
import os
import glob
import re

# --- 1. 設定 ---
# AWS_MySQL.envファイルから環境変数を読み込む
load_dotenv('AWS_MySQL.env') 

#【要変更】CSVファイルが保存されているフォルダのパス
# 日付フォルダ(YYYYMMDD形式)の中にCSVファイルが格納されている構造に対応
CSV_DIR = '/path/to/your/screening_results_folder'  # 実際のCSVファイルがあるフォルダに変更してください

#【要変更】アップロードする期間を指定(YYYY-MM-DD形式)
# 全期間を対象にする場合は None に設定
START_DATE = '2025-07-02'  # 例: '2025-06-01'
END_DATE = '2025-07-11'    # 例: '2025-07-31'

# 使用例:
# 2025年6月のデータのみ: START_DATE = '2025-06-01', END_DATE = '2025-06-30'
# 2025年7月以降のデータ: START_DATE = '2025-07-01', END_DATE = None
# 特定の1週間: START_DATE = '2025-06-25', END_DATE = '2025-07-01' 

# DB接続エンジンの作成
DATABASE_URL = (
    f"mysql+mysqlconnector://{os.getenv('DB_USER')}:{os.getenv('DB_PASSWORD')}"
    f"@{os.getenv('DB_HOST')}:3306/{os.getenv('DB_NAME')}"
)
db_engine = create_engine(DATABASE_URL)

# --- 2. 複数CSVの読み込みと結合 ---
# 日付フォルダを再帰的に検索
csv_files = []
for root, dirs, files in os.walk(CSV_DIR):
    for file in files:
        # final_tech_screening_results_YYYYMMDD.csv 形式のファイルのみ取得
        if file.startswith('final_tech_screening_results_') and file.endswith('.csv'):
            csv_files.append(os.path.join(root, file))

all_dfs = []

# 日付範囲の設定
if START_DATE:
    start_date = pd.to_datetime(START_DATE).date()
    print(f"開始日: {start_date}")
else:
    start_date = None
    print("開始日: 制限なし")

if END_DATE:
    end_date = pd.to_datetime(END_DATE).date()
    print(f"終了日: {end_date}")
else:
    end_date = None
    print("終了日: 制限なし")

for file_path in csv_files:
    # ファイル名から日付を抽出(final_tech_screening_results_YYYYMMDD.csv)
    file_name = os.path.basename(file_path)
    match = re.search(r'final_tech_screening_results_(\d{8})\.csv', file_name)
    
    if match:
        date_str = match.group(1)
        file_date = pd.to_datetime(date_str, format='%Y%m%d').date()
        
        # 日付範囲でフィルタリング
        if start_date and file_date < start_date:
            print(f" {file_path} は開始日より前のためスキップ ({file_date})")
            continue
        if end_date and file_date > end_date:
            print(f" {file_path} は終了日より後のためスキップ ({file_date})")
            continue
        
        df = pd.read_csv(file_path)
        df['screening_date'] = file_date
        all_dfs.append(df)
        print(f"{file_path} を読み込みました ({file_date})")
    else:
        print(f"⚠️  {file_path} のファイル名から日付を抽出できませんでした")

if not all_dfs:
    print("❌ 読み込めるCSVファイルが見つかりませんでした")
    print(f"📁 検索したディレクトリ: {CSV_DIR}")
    print("📝 CSVファイル名にYYYYMMDD形式の日付が含まれているか確認してください")
    exit(1)

df_combined = pd.concat(all_dfs, ignore_index=True)
print(f"✅ 全てのCSVデータを結合しました。合計レコード数: {len(df_combined)}")

# --- 3. データの整形とMySQLへの書き込み ---
df_to_db = df_combined.copy()

# tickerとlocal_codeを明示的に文字列として処理
df_to_db['Ticker'] = df_to_db['Ticker'].astype(str)
df_to_db['LocalCode'] = df_to_db['LocalCode'].astype(str)

# カラム名をDBテーブル定義に合わせる
df_to_db = df_to_db.rename(columns={
    'Ticker': 'ticker', 'LocalCode': 'local_code', 'Pattern': 'pattern',
    'Close': 'close_price', 'MA_5': 'ma_5', 'MA_25': 'ma_25', 'MA_75': 'ma_75',
    'MA_5_slope': 'ma_5_slope', 'RSI': 'rsi', 'PER': 'per',
    'ROE(%)': 'roe_percent', 'OPM(%)': 'opm_percent', 'score_today': 'market_score'
})

try:
    # 既存のデータを一旦全て削除し、新しいデータで置き換える
    df_to_db.to_sql(
        name='tech_screening_results',
        con=db_engine,
        if_exists='replace', # テーブルごと置き換える
        index=False
    )
    print("✅ データをMySQLに一括ロードしました!")
    print(f"📊 登録されたレコード数: {len(df_to_db)}")
    
except Exception as e:
    print(f"❌ MySQLへのデータ書き込み中にエラーが発生しました: {e}")
    print(" 以下を確認してください:")
    print("  1. AWS RDSが起動しているか")
    print("  2. セキュリティグループで自分のIPが許可されているか")
    print("  3. データベース名とテーブル名が正しいか")

MySQLにデータが格納された様子
Screenshot 2025-07-13 at 11.17.40.png

ステップ6:SQLで軽くデータを分析してみる

DBeaverのSQLエディタで、以下のクエリを実行してDBがどのようなものか確かめてみます。

DEMO 1:特定パターンで複数回ヒットした"常連銘柄"を探す

特定の選抜パターン(例:pattern1、過去記事参照願います)、
特定の期間(今回は10日間)に
複数の日付にスクリーニングに引っかかった「常連銘柄」を探します。

SELECT 
    ticker,
    COUNT(*) AS hit_count
FROM 
    tech_screening_results
WHERE 
    pattern = 'pattern1'  -- 特定のパターンを指定
    AND screening_date >= '2025-07-01'  -- 開始日を指定
    AND screening_date <= '2025-07-10'  -- 終了日を指定
GROUP BY 
    ticker
HAVING 
    COUNT(*) > 1
ORDER BY 
    hit_count DESC;

結果の見方:

  • ticker: 銘柄コード
  • hit_count: その銘柄がpattern1でスクリーニングに引っかかった日数
  • 例:hit_count = 3 なら、その銘柄は3日間でpattern1に引っかかった

他のパターンで試す場合:

-- pattern2で常連銘柄を探す
WHERE pattern = 'pattern2'

-- pattern3で常連銘柄を探す  
WHERE pattern = 'pattern3'

期間を指定する場合:

-- 2025年7月1日〜10日の期間で分析
AND screening_date >= '2025-07-01'
AND screening_date <= '2025-07-10'

-- 直近1週間で分析
AND screening_date >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)

実際の実行結果例:

ticker  hit_count
3167    5
9619    5
1662    4
8804    4
7575    4
1941    3
3231    3
8425    3
9769    3
5261    2
5410    2
7272    2
7458    2
9110    2

この結果から、銘柄コード3167(TOKAIホールディングス)と9619(イチネンホールディングス)は5日間でpattern1に引っかかった「常連銘柄」であることが分かります。

DEMO 2:特定銘柄の"スクリーニング履歴"を追跡する

最近、筆者の個人的にホットな銘柄3231(野村不動産ホールディングス)の10日間の変遷を見ていきます。

SELECT
    screening_date,
    pattern,
    close_price,
    rsi
FROM
    tech_screening_results
WHERE
    ticker = '3231'  -- 野村不動産HD
    AND screening_date >= '2025-07-01'  -- 開始日を指定
    AND screening_date <= '2025-07-10'  -- 終了日を指定
ORDER BY
    screening_date;

実際の実行結果例(野村不動産HD 3231):

screening_date  pattern    close_price  rsi
2025-07-04      pattern8   854.0        57.3
2025-07-04      pattern7   854.0        57.3
2025-07-04      pattern6   854.0        57.3
2025-07-04      pattern5   854.0        57.3
2025-07-07      pattern5   854.0        52.8
2025-07-07      pattern6   854.0        52.8
2025-07-07      pattern7   854.0        52.8
2025-07-07      pattern8   854.0        52.8
2025-07-08      pattern7   846.0        41.6
2025-07-08      pattern8   846.0        41.6
2025-07-08      pattern6   846.0        41.6
2025-07-08      pattern5   846.0        41.6
2025-07-08      pattern4   846.0        41.6
2025-07-08      pattern3   846.0        41.6
2025-07-08      pattern1   846.0        41.6
2025-07-08      pattern2   846.0        41.6
2025-07-09      pattern2   862.0        49.6
2025-07-09      pattern3   862.0        49.6
2025-07-09      pattern4   862.0        49.6
2025-07-09      pattern5   862.0        49.6
2025-07-09      pattern6   862.0        49.6
2025-07-09      pattern1   862.0        49.6
2025-07-09      pattern7   862.0        49.6
2025-07-09      pattern8   862.0        49.6
2025-07-10      pattern1   860.0        49.5
2025-07-10      pattern2   860.0        49.5
2025-07-10      pattern3   860.0        49.5
2025-07-10      pattern4   860.0        49.5
2025-07-10      pattern5   860.0        49.5
2025-07-10      pattern6   860.0        49.5
2025-07-10      pattern7   860.0        49.5
2025-07-10      pattern8   860.0        49.5

選抜基準の前提条件:詳しいことはこちら

  • パターン1-4: RSI中程度の選抜基準(pattern1-4)
  • パターン5-8: RSI高めの選抜基準(pattern5-8)
  • 移動平均乖離設定:
    • パターン1,5: 乖離狭い(ゴールデンクロスに近い)
    • パターン2,6: 乖離中程度
    • パターン3,7: 乖離中程度
    • パターン4,8: 乖離広い(ゴールデンクロスではない)

結果考察:
1. 株価推移の特徴:

  • 7月4日: 854.0円(RSI 57.3)→ 高めのRSIで上昇トレンド
  • 7月7日: 854.0円(RSI 52.8)→ RSI低下、横ばい
  • 7月8日: 846.0円(RSI 41.6)→ 急落、RSI大幅低下
  • 7月9日: 862.0円(RSI 49.6)→ 反発、RSI回復
  • 7月10日: 860.0円(RSI 49.5)→ 微減、RSI横ばい

2. パターンヒットの傾向:

  • 7月4日: pattern5-8のみ(RSI高め基準でヒット)
  • 7月7日: pattern5-8のみ(RSI高め基準でヒット)
  • 7月8日: 全パターン(pattern1-8)ヒット(RSIやや低下、ゴールデンクロス状態)
  • 7月9日: 全パターン(pattern1-8)ヒット(RSIやや回復、ゴールデンクロス状態)
  • 7月10日: 全パターン(pattern1-8)ヒット(RSI安定、ゴールデンクロス状態)

3. 投資判断への示唆:

  • 7月8日の下落時(RSI 41.6)→ ゴールデンクロス状態
  • 7月9-10日の反発・安定時も全パターンヒット→ ゴールデンクロス状態が持続→買ってみようかな(投資は自己責任です)。

このように、データベース化することで、特定の期間(例:7月1日〜10日)を簡単に抽出して分析できるようになります。CSVファイルの場合、日付ごとにバラバラに保存されているため、このような期間指定での分析は非常に面倒でしたが、MySQLでは WHERE screening_date >= '2025-07-01' AND screening_date <= '2025-07-10' という簡単な条件で、すぐに必要な期間のデータを抽出・分析できます。これが、CSVファイルからデータベースに移行する大きなメリットだと感じました。

まとめ

今回やったこと

  1. AWS RDSでMySQLサーバーを構築 - 無料枠を活用したクラウドデータベース環境
  2. DBeaverでデータベースに接続 - GUIツールによる直感的なDB管理
  3. テーブルを作成 - スクリーニング結果を保存する構造を定義
  4. PythonでCSVファイルを一括ロード - 溜まったデータを効率的に移行
  5. SQLで簡単なデータ分析を実践 - 過去データの検索・集計に活用予定

これで、手元に溜まっていたデータは、単なるファイルから、いつでも活用できる「データ資産」の一部として、MySQLに保存されました。

今後の予定

毎日運用で生成されるデータを自動格納したり、スクリーニングの結果だけでなく、毎日のスクリーニングで、都度都度構築しているテクニカル指標や財務データのデータセットをデータベースに移行したいと計画中です。データベース構築に関するシリーズも、頻度は不定期だと思いますが、報告を続けていく予定です。

参考文献・参考リンク

データベース・MySQL関連

AWS・クラウド関連

開発ツール・GUI関連

技術・ツール関連

補足

【マシン環境】
今回の作業は、以下の環境で実行しています。

コンポーネント スペック
マシン MacBook Pro (14-inch, Nov 2024)
プロセッサ Apple M4 Pro
メモリ 24 GB
OS macOS 15.5 Sequoia (24F74)

【Anaconda/condaバージョン】

  • conda: 24.11.3
  • Python 3.11.11

そのほか、DBeaver、Homebrewなど本文中に出てきたソフトウェア・モジュール・ライブラリなどは全て最新版(2025年7月14日時点)を使用しています。

7
8
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?