MENU
オンライン講座開催中

Pythonで米国株7銘柄の自動動画生成ツールを作った話 〜ポートフォリオ化までの記録〜

Pythonで米国株7銘柄の自動動画生成ツールを作った話 〜ポートフォリオ化までの記録〜
目次

はじめに|株価チェックの毎日ルーティンを自動化したかった

米国株の値動きを毎日チェックするのが日課だったのですが、「yfinanceでデータを取って、グラフを作って、コメントを書いて…」という作業を手作業で繰り返すのがだんだん苦痛になってきました。そこで今回、Pythonを使ってこの一連の流れをまるごと自動化するツールを作りました。

この記事では、米国主要テック株7銘柄(NVIDIA・Apple・Tesla・Microsoft・Amazon・Meta・Alphabet)の株価データを自動取得し、グラフ画像・PDFレポート・日本語音声コメント・MP4動画までを自動生成する仕組みと、個人用スクリプトをGitHubに公開できる品質まで整理し直した過程をまとめます。Python・yfinance・ffmpeg・gTTSなどを組み合わせた自動化に興味がある方の参考になれば幸いです。

作ったツールの概要

今回作ったのは、米国主要テック株7銘柄の株価を自動取得し、そのデータからグラフ画像・PDFレポート・日本語音声コメント・MP4動画までを一括生成するPythonツールです。対象銘柄と時間帯は以下の通りです。

  • 対象銘柄:NVIDIA、Apple、Tesla、Microsoft、Amazon、Meta、Alphabet
  • 取得タイミング:米国市場の取引時間帯(日本時間22:30〜翌5:00前後)
  • 営業日判定:土日・米国祝日を自動で除外し、直近の営業日を判定

すべての処理はmain.pyから一括実行でき、Windowsであればバッチファイルをダブルクリックするだけで完結します。

処理の流れ(Step1〜Step4)

ツール全体は4つのステップに分割して設計しています。1つのスクリプトに全部詰め込むのではなく、役割ごとに分けることで、後から見返したときの見通しが良くなります。

Step1:株価取得 → PDF・グラフ画像作成

yfinanceで株価データを取得し、reportlabで株価一覧のPDFレポートを、matplotlibで縦長のグラフ画像(JPG)を作成します。始値・終値・最高値・最安値・前日終値をグラフ上にテキストで表示するようにしています。

Step2:コメント生成 → PDF・音声作成

取得した株価データから「始まり値段・終わり値段」をまとめた日本語コメントを自動生成し、PDF化するとともに、gTTS(Google Text-to-Speech)で読み上げ音声(mp3)を作成します。

Step3:グラフ画像+音声 → MP4クリップ作成

ffmpegを使って、Step1のグラフ画像とStep2の音声ファイルを合成し、銘柄ごとのMP4クリップを作成します。

Step4:MP4クリップの連結

全銘柄のクリップを、あらかじめ決めた順番(NVIDIA→Apple→Tesla→Microsoft→Amazon→Meta→Alphabetの順)でffmpegを使って1本の動画に連結します。

使用した技術スタック

用途使用技術
株価データ取得yfinance(Yahoo Finance API)
PDF生成reportlab(日本語フォント埋め込み対応)
グラフ描画matplotlib
音声合成gTTS(Google Text-to-Speech)
動画処理ffmpeg(subprocess経由で呼び出し)
日時・祝日処理pytz、holidays

実際に生成された動画サンプル

実際にこのツールで生成した動画のサンプルです。グラフ画像に日本語の音声コメントが重なる形で、銘柄ごとの値動きが流れます。縦長(9:16)のTikTok・Instagramリール向けフォーマットで書き出しています。

※widthとheightは実解像度(1080×1920)を指定していますが、周囲のdivで表示幅をブログ内に収まる400pxまでに制限しています。

動いていたのに潜んでいたバグ

最初のバージョンは「とりあえず自分のPCで動けばいい」という書き方をしていたため、後から見返すといくつか問題がありました。特に危険だったのが以下の3点です。

1. 個人環境の絶対パスがハードコードされていた

保存先フォルダのパスがコード内に直接書かれていて、他のPCでは動かない状態でした。

2. 同じロジックが複数箇所に重複していた

「最新のフォルダを探す」処理が、動画クリップを作るスクリプトと連結するスクリプトの2箇所に別々に実装されていました。

3. 年をまたぐと動かなくなるバグ

連結処理のスクリプトに、「2024年のフォルダだけを対象にする」というフィルタが年で固定されていました。これは年が変わった瞬間に動作しなくなるタイプのバグで、動作確認をしたタイミングでは気づけない、いわば時限式の不具合でした。

公開用にリファクタリングした内容

上記の問題を解消し、GitHubで公開できる状態まで整理するために、以下の対応を行いました。

  • 保存先パス・フォント・銘柄リストなどの設定値をconfig.pyに集約し、環境変数で切り替え可能に変更
  • 重複していた「最新フォルダ探索」処理をutils.pyにまとめて共通化
  • 年固定バグは、フォルダ名を日付として素直にパースする方式に修正し、年をまたいでも動作するように変更
  • 4本バラバラだったスクリプトをmain.pyから一括実行できるように整理
  • 応急処置的だった__import__("datetime")のような書き方も、冒頭で正式にimportする形に修正

コード自体(yfinance・reportlab・matplotlib・gTTS・ffmpeg連携)の書き方は元々悪くなかったのですが、「設定と処理を分ける」「同じロジックを二度書かない」「環境依存の値を外に出す」という基本を徹底するだけで、見通しが大きく変わりました。

フォントファイルとライセンスへの配慮

PDFやグラフの日本語表示にはIPAフォント(ipag.ttf)を使用しています。IPAフォントライセンスは再配布自体は認められているものの、ライセンス表記の同梱義務などがあるため、公開リポジトリにはフォントファイル自体を含めず、READMEに「各自でフォントを配置してください」と案内する形にしました。個人開発をポートフォリオとして公開する際は、こうしたライセンス面の配慮も忘れずに行いたいポイントです。

この開発で学んだこと

個人用に書いたスクリプトほど、後から「あれ、これ動かないぞ」というバグが静かに潜んでいたりします。特に日付や年をまたぐ処理は、動作確認したタイミング次第では見逃しやすい典型的な落とし穴でした。

また、動くだけのコードと、人に見せられるコードの間には、思っている以上に距離があると実感しました。設定値の分離、重複ロジックの共通化、環境依存の排除——地味な作業ですが、これをやるかやらないかでポートフォリオとしての説得力がまったく変わってきます。

よくある質問

Q. Pythonで株価データを取得するには何を使えばいいですか?

A. 個人利用の範囲であればyfinanceが手軽です。Yahoo Financeの株価データをPythonから簡単に取得できます。

Q. Pythonで動画を自動生成することはできますか?

A. 可能です。画像と音声を用意した上でffmpegをPythonのsubprocess経由で呼び出すことで、画像+音声のMP4クリップ作成や、複数クリップの連結ができます。

Q. 個人開発をポートフォリオとして公開する際に気をつけることは?

A. 個人環境依存のパスを排除すること、重複コードを整理すること、そしてフォントなどの同梱ファイルにライセンス上の問題がないか確認することが最低限のポイントです。

まとめ

今回は、Python・yfinance・matplotlib・reportlab・gTTS・ffmpegを組み合わせて、米国株7銘柄の株価を自動でグラフ化・音声化・動画化するツールを作成しました。個人用に動いていたコードを、公開できる品質まで整理し直す過程で、パスのハードコードやロジックの重複、年をまたぐと壊れる潜在バグなど、いくつもの改善点が見つかりました。

コードはGitHubに公開しています。よければ覗いてみてください。

GitHubhttps://github.com/a-goto1/kabum7-stock-video-generator

目次