このブログでは、平日の夜に自動で株価情報を取得し、売買シグナルを導出するプログラムを実行しています。このプログラムは生成AIを活用しながら順を追って作成していきました。
どうやって作成していったのか?この記事ではそのプロセスについて書いていきたいと思います。
プログラムの概要
Windowsのタスクスケジューラで平日の夜に処理を実行するバッチファイル(.bat)を実行して次の処理を実行しています。
- 株価情報を取得する
- 各種テクニカル指標を算出
- テクニカル指標を組み合わせて独自に売買シグナルを導出
- 結果を出力したファイルをGoogleドライブにアップロード
- 導出した売買シグナルの情報をこのブログに投稿
これらの処理はすべてPythonで実行しています。
どの生成AIを使って作った?
これらの処理を行うプログラムはClaudeを使いながら作成していきました。バージョンはClaude 3.7 Sonnetです。
”プロジェクト”の機能を使ってこのプログラムを作成するプロジェクトを作成し、機能ごとにチャットを作成して機能拡張を進めていきました。
このように、追加実装したい機能ごとに番号を振ってチャットを作成しました。
プロジェクトの機能として、右側にあるプロジェクトナレッジの箇所は使用していないので本来の使い方はしていませんが、プロジェクトではなく単純にチャットで使用すると他のチャットの内容と項目が混ざってわかりにくかったので、”このプログラムを作成するプロジェクト”という意図で今回はプロジェクト機能を使用しました。
他のチャットの内容と項目が混ざっても問題ないという人は、わざわざプロジェクト機能を使用しなくても良いと思います。プロジェクト機能はClaude for WorkプランとClaude Proプランのユーザーが利用できる機能なので・・・。
作成の流れ
それでは、どういう順序でプログラムを作成していったかについて書いていきたいと思います。
初期実装
まず最初のステップとして、プログラムを作成したい機能の要件をClaudeに入力して、初期実装を進めました。
Claudeに入力したプロンプトは下記のようにしました。
プロンプト
PythonのyfinanceのAPIを使用して、東証一部上場企業の株価情報を取得してテクニカル指標を算出するツールを作成しようとしています。 少しずつ機能を拡張して要望を出していくので、スクリプトを作成してください。 まずはじめに、yfinanceを使用して、通常モード時には"{ProgramPath}"のパスにあるcompany_list.csvを読み込み、テストモード時には"{ProgramPath}\Test"のパスにあるcompany_list_test.csvを読みこんで、csvファイルにあるTicker列にある会社の過去6か月間の株価情報を順番に取得するスクリプトを作成してください。 通常モードは"{ProgramPath}"にある"run_stock_signal.bat"で実行し、テストモードは同じパスの"run_stock_signal_test.bat"を実行すれば処理を行えるようにしてください。 このあたりのパスの設定やパラメータは、config.pyを作成し、そこから参照するようにしてください。 なお、今後のことを考えて、一定期間内にリクエストが多いと制限がかかりデータが取得できなくなるようなので、10企業ごとに取得するようにバッチ処理してください。
今後の拡張性やメンテナンス性を考慮して、機能ごとにモジュールを作成して、それらを呼び出すメインスクリプトを作成していく運用で考えています。
このプロンプトから、①config.py、②data_loader.py、③stock_fetcher.py、④main.pyの4つのPythonファイルが生成され、使用方法も教えてくれました。
生成されたファイルを実行すると、修正したい部分がいくつかあったので、次のようにプロンプトを入力して修正しました。
プロンプト
- 実行したところ、成功しましたが文字化けしている個所があったので修正してください。
- logger.info(f"銘柄 {ticker} のデータを保存しました: {csv_path}")の{csv_path}は不要です。
- テストモードで実行時は、Test下にResultを作成してその中に結果を出力するようにしてください。
- 通常モード時は、Resultを作成してそこに結果を出力するようにしてください。
- 通常モード時もテストモード時も、実行した日付のフォルダの作成は不要です。
- .logファイルについても、通常モード時は現状で良いですが、テストモード時はTest下にLogsを作成してそこに出力するようにしてください。
このプロンプトを入力することで、それぞれの項目に応じた修正をして生成してくれました。合わせて、どのように修正したのかについても教えてくれました。
このような流れで、生成されたプログラムを実際に実行してみて、そこで出てきた修正したい部分を記載したプロンプトを入力する形で、順番に修正を行っていきました。
続いて、テクニカル指標を算出するために、次のようなプロンプトを入力してコードを生成してもらいました。
プロンプト
Result下に保存したデータから、各会社の現時点のテクニカル指標を算出して別のCSVファイルに保存したいです。 算出するテクニカル指標:①移動平均線、②MACD、③RSI、④一目均衡表 保存先のフォルダ:TechnicalSignal 保存ファイル名:"{Ticker}"+"_signal.csv"
修正プロンプト
- technical_indicators.pyで使用する各パラメータも、config.pyで定義するようにしてください。
- テクニカル指標の算出は、TaLibを使用してOKです。
- 一目均衡表の各指標を算出した後、三役好転・三役暗転の判定も行いたいです。
- 出力されているCSVファイルは、現時点では各会社ごとにファイルが作成されていますが、これを一つのファイルにまとめたいです。 ファイル名:latest_signal.pyとして、1列目に”Ticker”, 2列目に"Company"を追加してまとめて保存する処理を追加してください。"Ticker"はCOMPANY_LIST_FILEの"Ticker"を、”Company"はCOMPANY_LIST_FILEの"銘柄名"を使用すれば良いです。
テクニカル指標を算出する際に使用する各種パラメータについても、config.pyでまとめて定義するように変更しました。これで、パラメータやファイルのパスを変更したいときにはconfig.pyを変更すれば良いという状態を作ることができました。
また、TaLibのライブラリを用意しておいたので、これを使用するように変更しました。
他には、三役好転・三役暗転の判定をしたかったのでその要望をしたのと、最終的にテクニカル指標などのデータを一つのファイルにまとめたかったので、その要望をしました。
このように、yfinanceのAPIを使用して取得した株価情報からテクニカル指標を算出するプログラムを作成していきました。
MACD×RSIの売買シグナル算出のプログラム実装
テクニカル指標を算出するだけでも良いですが、せっかくなのでそれらの指標を組み合わせた独自の売買シグナルを導出したい!と思ったので、これもプロンプトを入力してシグナル算出のプログラムを作成しました。
プロンプト
株の売り買いのシグナルを出す処理を追加したいです。_signal.csvの"Ichimoku_SanYaku"の次の要素に"Signal"を追加してそこにBuy/Sellを出力するようにしたいです。その結果を_latest_signal.csv、latest_signal.csvにも持っていきたいです。
次の条件のときに、"Buy"のシグナルを出すようにしてください。
- MACDがMACD_Signalを上回る
- RSI短期がRSI長期を上回る
- RSI長期が40以下
また、次の条件のときに、"Sell"のシグナルを出すようにしてください。
- MACDがMACD_Signalを下回る
- RSI短期がRSI長期を下回る
- RSI長期が60以上
Buy・Sellに該当しない場合は空白のままで良いです。
このように、このブログで日々投稿している売買シグナルを導出するプログラムを作成していきました。
その他
同様の流れで、プログラム処理で出力されるテクニカル指標や売買シグナルの結果のファイルをGoogleドライブにアップするコードと、このブログに投稿するコードも作成していきました。
他には、バッチファイルの実行単位の変更や、MACD×RCIの組み合わせでの売買シグナルの導出プログラム作成、自分が後から処理内容を振り返られるようにコメント文の追加などを行い、一連のプログラムを作成しました。
最後にこのプログラムを定期実行するためにWindowsのタスクスケジューラーの設定を行って作成完了です。
最後に
今回は、実際に入力したプロンプトの例も示しながら、株価情報を取得してテクニカル指標と独自の売買シグナルを導出するプログラムをどのように作成していったかについて書きました。
今回はClaudeを使用してプログラミングしていきましたが、ChatGPTなど他の生成AIでも同様にプログラミングしていけると思います。
自分のやりたいことが見つかれば、そのアイデアをもとにプロンプトを入力してプログラミングできるようになってきました!
この記事を参考にして、プログラミングの最初の一歩を踏み出すきっかけになれば幸いです!