※本記事のコードや情報は執筆時点の仕様に基づいています。投資は自己責任であり、必ずデモ環境や少額資金でテストした上で運用してください。
Pythonで株価取得スクリプトを作り、手動で実行すれば正しく動く状態まで到達した方は多いはずです。
しかし「毎朝9時に自動で動かしたい」となった瞬間、AWSやVPSといったサーバー構築の話が出てきて尻込みするケースが大半です。
「クラウドは難しそう」「月額コストをかけたくない」という声は非常に多いです。
実は、手元のWindowsパソコンに標準搭載されているタスクスケジューラ(Task Scheduler)だけで、Pythonスクリプトの定時自動実行は実現できます。
本記事では、タスクスケジューラの基本概念から、毎朝定時に株価取得スクリプトを自動実行するための設定手順、トラブル対策までを解説します。
すべてのコマンドと設定値はコピペで使えるので、この記事の通りに進めれば30分以内に自動実行環境が完成します。
タスクスケジューラの基本と仕組み
タスクスケジューラとは
タスクスケジューラ(Task Scheduler)は、Windows OSに標準搭載されているジョブ管理ツールです。
指定した日時・間隔で任意のプログラムを自動起動できます。
追加インストールは不要で、Windows 10・11のどちらにも搭載されています。
内部的には「トリガー(Trigger:起動条件)」と「操作(Action:実行内容)」の組み合わせでタスクを定義します。
Pythonスクリプト実行の全体構成
タスクスケジューラからPythonスクリプトを動かす場合、以下の3つの要素が必要です。
* Python実行ファイル:python.exeのフルパスを指定します
* 対象スクリプト:実行したい.pyファイルのフルパスを指定します
* 作業ディレクトリ:スクリプトが参照するファイルの基準パスを指定します
この3点を正確に設定できるかどうかが、成功と失敗の分かれ目です。
【コピペOK】自動実行するサンプルスクリプトの準備
まず、タスクスケジューラから呼び出す対象のスクリプトを用意します。
ログファイルへの書き出し機能を含めることで、自動実行が成功したかどうかを後から確認できます。
pip install yfinance pandas
import datetime
import logging
import pathlib
from typing import Final
import pandas as pd
import yfinance as yf
# ==============================
# 設定エリア
# ==============================
TICKERS: Final[list[str]] = ["7203.T", "9984.T", "6758.T"]
PERIOD: Final[str] = "5d"
OUTPUT_DIR: Final[str] = "./output"
LOG_FILE: Final[str] = "./output/scheduler_log.txt"
# ==============================
# ロガー設定
# ==============================
def setup_logger() -> logging.Logger:
'ファイルとコンソールの両方にログを出力するロガーを返す'
pathlib.Path(OUTPUT_DIR).mkdir(parents=True, exist_ok=True)
logger = logging.getLogger("stock_fetcher")
logger.setLevel(logging.INFO)
if not logger.handlers:
fh = logging.FileHandler(LOG_FILE, encoding="utf-8")
ch = logging.StreamHandler()
fmt = logging.Formatter("%(asctime)s %(levelname)s %(message)s")
fh.setFormatter(fmt)
ch.setFormatter(fmt)
logger.addHandler(fh)
logger.addHandler(ch)
return logger
# ==============================
# 株価データ取得
# ==============================
def fetch_prices(tickers: list[str], period: str) -> pd.DataFrame:
'指定銘柄の株価を取得してDataFrameで返す'
df: pd.DataFrame = yf.download(tickers, period=period, progress=False)
return df
# ==============================
# CSV保存
# ==============================
def save_to_csv(df: pd.DataFrame, directory: str) -> str:
'日付付きファイル名でCSVを保存し、パスを返す'
today = datetime.date.today().strftime("%Y%m%d")
file_path = f"{directory}/stock_data_{today}.csv"
df.to_csv(file_path, encoding="utf-8-sig")
return file_path
# ==============================
# メイン処理
# ==============================
if __name__ == "__main__":
logger = setup_logger()
logger.info("===== 自動取得 開始 =====")
try:
price_df = fetch_prices(TICKERS, PERIOD)
if price_df.empty:
logger.warning("取得データが空です")
else:
saved_path = save_to_csv(price_df, OUTPUT_DIR)
logger.info(f"保存完了: {saved_path} ({len(price_df)}行)")
except Exception as e:
logger.error(f"エラー発生: {e}")
logger.info("===== 自動取得 終了 =====")
コードの処理フロー解説
上記のコードは、以下の4ステップで構成されています。
* ステップ1 ロガー設定:ファイルとコンソールの両方にログを出力する設定を行います。自動実行時はコンソールが見えないため、ファイルログが唯一の確認手段です
* ステップ2 データ取得:yfinanceで指定銘柄の直近5日分の株価を一括取得します
* ステップ3 CSV保存:outputフォルダに日付付きファイル名で保存し、日次でファイルが上書きされない設計にしています
* ステップ4 例外処理:すべてのエラーをキャッチしてログに記録し、スクリプトが異常終了しないようにしています
TICKERSとPERIODを書き換えるだけで、任意の銘柄・期間に対応できます。
【コピペOK】タスクスケジューラの設定手順
GUI操作による基本設定
タスクスケジューラの起動から設定完了までの手順を説明します。
まず、Windowsの検索バーに「タスクスケジューラ」と入力して起動してください。
右側の「操作」パネルから「タスクの作成」を選択します。「基本タスクの作成」ではなく「タスクの作成」を選んでください。設定の自由度が異なります。
「全般」タブでは以下を設定してください。
* 名前:StockDataFetcherなど、内容が分かる名前を付けてください
* 「ユーザーがログオンしているかどうかにかかわらず実行する」を選択してください。これにより、PCにログインしていない状態でも実行されます
* 「最上位の特権で実行する」にチェックを入れてください
「トリガー」タブでは「新規」をクリックし、以下を設定してください。
* 開始:毎日
* 時刻:07:00:00(市場開場前の任意の時刻)
* 「有効」にチェックが入っていることを確認してください
「操作」タブでは「新規」をクリックし、以下の3項目を正確に入力してください。
* プログラム/スクリプト:python.exeのフルパス
* 引数の追加:実行する.pyファイルのフルパス
* 開始(オプション):.pyファイルが存在するフォルダのパス
schtasksコマンドによる設定(上級者向け)
GUI操作が面倒な場合、コマンドプロンプト(管理者権限)から1行で登録できます。
# ==============================
# python.exeのフルパスを確認
# ==============================
where python
# ==============================
# 仮想環境を使っている場合はこちらで確認
# ==============================
# .venvScriptspython.exe のフルパスを使用する
# ==============================
# タスク登録(毎日07:00に実行)
# ==============================
schtasks /create /tn "StockDataFetcher" /tr "C:UsersYourNameAppDataLocalProgramsPythonPython312python.exe C:projectsstockdaily_fetch.py" /sc daily /st 07:00 /rl highest /f
# ==============================
# 登録済みタスクの確認
# ==============================
schtasks /query /tn "StockDataFetcher" /v
# ==============================
# タスクの手動テスト実行
# ==============================
schtasks /run /tn "StockDataFetcher"
# ==============================
# タスクの削除(不要になった場合)
# ==============================
schtasks /delete /tn "StockDataFetcher" /f
コマンドの処理フロー解説
上記のコマンドは、以下の4ステップで構成されています。
* ステップ1 パス確認:where pythonでシステムに登録されているpython.exeのフルパスを取得します。仮想環境を使っている場合は.venvScriptspython.exeのフルパスを指定してください
* ステップ2 タスク登録:/sc daily /st 07:00で毎日7時実行、/rl highestで最上位特権を指定します。/fは既存タスクの上書きオプションです
* ステップ3 動作確認:/runオプションで即座にテスト実行し、ログファイルに正常記録されるか確認します
* ステップ4 削除:不要になったタスクは/deleteで確実に削除してください
/trの引数に含まれるパスは、自分の環境に合わせて必ず書き換えてください。
安定運用のための実践テクニック
自動実行を登録しただけでは安定運用とは言えません。
以下の3つの対策を実施してください。
* スリープ復帰設定:PCがスリープ状態だとタスクは実行されません。タスクの「条件」タブで「タスクを実行するためにスリープを解除する」にチェックを入れてください。ノートPCの場合は電源プランの「スリープ解除タイマーの許可」も「有効」にしてください
* 失敗時の再試行:「設定」タブの「タスクが失敗した場合の再起動の間隔」を5分、「再起動の試行回数」を3回に設定してください
* ログの定期確認:scheduler_log.txtを週に1回は確認する習慣をつけてください。ERRORの文字列が含まれていないかをチェックするだけで十分です
電源オフの状態ではタスクスケジューラは動作しません。24時間稼働が必要な場合はVPS(Virtual Private Server:仮想専用サーバー)の導入を検討してください。
よくあるエラーと対処法
タスクは正常完了するがスクリプトが動いていない
タスクスケジューラの履歴には「正常に完了しました(0x0)」と表示されるのに、CSVが出力されないパターンです。
原因は「開始(オプション)」の作業ディレクトリ未設定がほとんどです。
以下を試してください。
* タスクの「操作」タブを開き、「開始(オプション)」にスクリプトが存在するフォルダのフルパスを入力してください
* スクリプト内の相対パス(./output等)は作業ディレクトリを基準に解決されます。作業ディレクトリが未設定だとC:WindowsSystem32が基準になり、意図しない場所にファイルが生成されます
* すべてのパスを絶対パスで記述する方法でも回避できますが、作業ディレクトリの設定が根本対策です
「このタスクを作成するには、ユーザー名とパスワードを指定してください」
「ユーザーがログオンしているかどうかにかかわらず実行する」を選択した場合に表示されます。
Windowsのログインパスワードを入力すれば設定は完了します。
以下を試してください。
* Microsoftアカウントでサインインしている場合は、そのパスワードを入力してください
* PINコードではなくパスワードが必要です。パスワードを設定していない場合は、Windowsの設定からパスワードを追加してください
* パスワード変更後はタスクの資格情報も更新が必要です。タスクのプロパティを開いて再度パスワードを入力してください
終了コード0x1やModuleNotFoundErrorが記録される
タスクスケジューラが使用するpython.exeと、普段ターミナルで使っているpython.exeが異なる場合に発生します。
仮想環境のPythonを指定していないことが最大の原因です。
以下を試してください。
* タスクの「プログラム/スクリプト」欄に仮想環境内のpython.exeのフルパス(例:C:projectsstock.venvScriptspython.exe)を指定してください
* where pythonの結果が複数表示される場合、タスクスケジューラがどのPythonを使うかは保証されません。フルパス指定で曖昧さを排除してください
* ログファイルにModuleNotFoundErrorが記録されていたら、仮想環境へのライブラリインストール漏れです。仮想環境を有効化した上でpip installを再実行してください
まとめ
この記事では、Windowsタスクスケジューラを使ってPythonスクリプトを毎日自動実行する方法を解説しました。
要点を整理します。
* タスクスケジューラはWindows標準機能で、追加インストールやクラウド契約は不要です
* 「プログラム」「引数」「作業ディレクトリ」の3項目をフルパスで正確に指定することが最重要です
* schtasksコマンドを使えば、コマンドプロンプトから1行でタスク登録・テスト・削除が完了します
* スクリプトには必ずファイルログ出力を組み込み、自動実行の成否を後から確認できるようにしてください
* スリープ復帰設定と失敗時の再試行設定を忘れると、実運用で取りこぼしが発生します
次のステップとして、本記事のサンプルスクリプトを登録してテスト実行し、ログファイルが正常に出力されることを確認してください。安定動作を確認したら、バックテストやスクリーニングなど、より複雑なスクリプトに差し替えて運用を拡大していけます。

