毎日溜まるCSVをデータベース化!AWS RDS + MySQL + DBeaver + Pythonで株式投資の効率的な分析環境を整えたい
はじめに
これまで、「銘柄スクリーニング毎日自動通知Bot」を構築するため、生成AIを活用した環境構築から、スクリーニング結果の可視化・X投稿、そしてMacのCronを使った定時運用までを行ってきました。
これで、仕事で疲れてお布団に吸引されそうになっても、私の代わりにBotが健気に働き、X(旧Twitter)にスクリーニング結果を知らせてくれるようになりました。めでたしめでたし……。
……と、なるはずでした。
これまでの経緯
本記事は、Pythonによる株式スクリーニング自動化・実践の続編です。これまでの背景や検証の流れは、以下の記事をご確認ください。
課題は次々と押し寄せてくる
数日間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の導入方法を説明します。
- AWSでMySQLサーバーを構築: 無料利用枠を使い、安全なデータベース環境をクラウド上に作成。
- PCからの接続設定: セキュリティグループを正しく設定し、自分のPCからのみDBにアクセスできるようにする。
- DBeaverでDBを操作: GUIツールを導入し、データベースのテーブル作成やデータ確認を簡単に行えるようにする。
- PythonでCSVを一括ロード: 溜まっていた複数のCSVファイルを、Pandasを使って一気にMySQLへ登録。
- SQLでデータを分析: 登録したデータを使い、SQLで簡単な集計を行い、データベースの力を体験。
第1部:データベース環境の構築
ステップ1:AWSでMySQLサーバーを用意する (RDS)
AWSのマネージドサービスであるRDS (Relational Database Service) を利用します。
基本的に公式のチュートリアルに則して設定しました。ここからリンクを辿っていくと、簡単に設定できると思います。
ただし、公式の情報が古いのでところどころ違うところがあります。その辺はAIに聞くと大体正確に教えてくれます。今回は、筆者が設定するときに、気をつけたところのみを列記してます。
AWS公式チュートリアル - Amazon RDS で MySQL データベースを作成して接続する
- AWSマネジメントコンソールにログインし、「RDS」サービスで「データベースの作成」をクリックします(reagion決めお忘れなく)。
- 以下の4点のみ変更し、他はデフォルト設定のままで進めます。
- マスターユーザー名とパスワードは必ず控えておき、「データベースの作成」ボタンをクリックします。ステータスが「利用可能」になるまで数分待ちます。
ステップ2:自宅のIPからの接続を許可する (セキュリティグループ)
作成したデータベースに、自分のIPアドレスのみからのみアクセスできるよう設定します。
-
RDSのダッシュボードで、作成したDBインスタンスの「接続とセキュリティ」タブを開き、VPCセキュリティグループのリンクをクリックします。



-
「ルールを追加」し、以下のように設定します。
- タイプ: MySQL/Aurora
- ソース: カスタム を選択し、あなたのグローバルIPアドレス(Googleで「What is my IP」と検索して確認)をXXX.XXX.XXX.XXX/32の形式で入力します。
-
「ルールを保存」をクリックします。
ステップ3:DBeaverでデータベースに接続する
データベースを視覚的に操作するツール「DBeaver」をインストールします。
-
DBeaverを起動し、「新しいデータベース接続(左上の青いソケットのマーク)」から「MySQL」に接続設定を開始します。

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

こちら記事が勉強になりました。
SQL 初級編 Vol.1(SQLとは?+ MySQLインストール+DBeaver インストール) - DBeaverの詳細なインストール手順と設定方法
ステップ4:データを保存する「テーブル」を作る
今回のデータベースの情報元となるcsvはこのような状態でデータが保存されてます。

DBeaverのSQLエディタで、以下のSQLを実行してまず、空のテーブルを作成します。

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という新しいテーブルが追加されている。

このように、カラム名だけが記載された空のテーブルが設定されます。

第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_usernameとyour_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. データベース名とテーブル名が正しいか")
ステップ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ファイルからデータベースに移行する大きなメリットだと感じました。
まとめ
今回やったこと
- AWS RDSでMySQLサーバーを構築 - 無料枠を活用したクラウドデータベース環境
- DBeaverでデータベースに接続 - GUIツールによる直感的なDB管理
- テーブルを作成 - スクリーニング結果を保存する構造を定義
- PythonでCSVファイルを一括ロード - 溜まったデータを効率的に移行
- SQLで簡単なデータ分析を実践 - 過去データの検索・集計に活用予定
これで、手元に溜まっていたデータは、単なるファイルから、いつでも活用できる「データ資産」の一部として、MySQLに保存されました。
今後の予定
毎日運用で生成されるデータを自動格納したり、スクリーニングの結果だけでなく、毎日のスクリーニングで、都度都度構築しているテクニカル指標や財務データのデータセットをデータベースに移行したいと計画中です。データベース構築に関するシリーズも、頻度は不定期だと思いますが、報告を続けていく予定です。
参考文献・参考リンク
データベース・MySQL関連
- リレーショナルデータベースとは?
- MySQLとは(初心者向け入門編)
- リアルタイムセンサーデータをどう保存する?仕様書から見たInfluxDB vs MySQL
- [備忘録] MySQL Connector PythonでMySQLを操作してみた
- [備忘録] MySQL主要コマンドを確認してみた
- AWS RDS Aurora MySQL 備忘録 - Aurora Serverless V2の運用ノウハウとS3連携
AWS・クラウド関連
開発ツール・GUI関連
- SQL 初級編 Vol.1(SQLとは?+ MySQLインストール+DBeaver インストール) - DBeaverの詳細なインストール手順と設定方法
- DBeaver使い方メモ - DBeaverの詳細な操作方法と機能解説
- 【まとめ】これ知らないプログラマって損してんなって思う汎用的なツール 100超 - 開発効率を上げるツール集(DBeaver、MySQL Workbench等も含む)
技術・ツール関連
- 【保存版】Homebrewコマンド7選 - 🔰エンジニアが覚えておくべき基本操作 - Homebrewの効率的な運用方法とトラブルシューティング
補足
【マシン環境】
今回の作業は、以下の環境で実行しています。
| コンポーネント | スペック |
|---|---|
| マシン | 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日時点)を使用しています。









