PythonスクリプトをWindowsタスクスケジューラで自動実行する完全手順

自動化・運用

※本記事のコードや情報は執筆時点の仕様に基づいています。投資は自己責任であり、必ずデモ環境や少額資金でテストした上で運用してください。

Pythonで株価データの取得スクリプトやテクニカル分析ツールを作成しても、毎回手動でコマンドプロンプトを開いて実行するのは現実的ではありません。「毎朝9時に自動で株価をチェックしたい」「市場が閉まる15時半にポートフォリオのレポートを生成したい」といったニーズに応えるのが、Windowsに標準搭載されているタスクスケジューラです。

📘 外部参考Python 公式Python 公式ドキュメント(日本語)

📘 外部参考タスクスケジューラ(Microsoft 公式ドキュメント・日本語)

タスクスケジューラを使えば、追加のソフトウェアを一切インストールすることなく、指定した日時にPythonスクリプトを自動実行できます。

この記事では、タスクスケジューラの基本概念から、実際の設定手順、自動実行用スクリプトの作成、ログ出力の仕組み、そしてトラブル発生時の対処法まで、完全な手順として解説します。

タスクスケジューラの基本概念

設定作業に入る前に、タスクスケジューラがどのような仕組みで動作するかを理解しておく必要があります。

タスクスケジューラとは

タスクスケジューラは、Windowsに標準搭載されているジョブ管理ツールです。「トリガー(いつ実行するか)」と「操作(何を実行するか)」の組み合わせで、任意のプログラムを自動実行できます。

Linuxにおけるcronジョブに相当する機能です。

📘 外部参考Cron(Wikipedia 日本語)crontab(5) man page

自動実行の構成要素

タスクスケジューラで設定する要素は大きく3つに分かれます。

要素 内容
トリガー 実行タイミング 毎日9:00 / 毎週月曜 / ログオン時
操作 実行するプログラム python.exe + スクリプトパス
条件・設定 実行時の制約や挙動 AC電源接続時のみ / 失敗時の再試行

タスクスケジューラの起動方法

以下のいずれかの方法で起動できます。

  • Windowsキーを押し、「タスクスケジューラ」と入力してEnter
  • Windowsキー + R で「taskschd.msc」と入力してEnter

起動すると、左側にフォルダツリー、中央にタスク一覧、右側に操作パネルが表示されます。

自動実行するPythonスクリプトの準備

タスクスケジューラに登録する前に、自動実行に適した形式のスクリプトを準備します。

自動実行スクリプトに必要な3つの要件

手動実行のスクリプトと異なり、自動実行スクリプトには以下の要件があります。

  • ユーザー入力を必要としないこと: input() 関数を使わない
  • ログを出力すること: 画面に誰もいないため、結果をファイルに記録する
  • エラーハンドリングが実装されていること: 例外発生時にスクリプトが無限停止しない

【コピペOK】株価自動取得&ログ出力スクリプト

以下のスクリプトは、指定した銘柄の株価データを取得し、CSVファイルとログファイルに記録します。auto_stock_check.py として保存してください。


import yfinance as yf
import pandas as pd
from datetime import datetime
import os
import traceback

# ==============================
# 設定エリア
# ==============================
SYMBOLS = ["7203.T", "9984.T", "6758.T"]  # トヨタ, ソフトバンクG, ソニーG
OUTPUT_DIR = r"C:python-projectsoutput"
LOG_DIR = r"C:python-projectslogs"

# ==============================
# ディレクトリ作成
# ==============================
os.makedirs(OUTPUT_DIR, exist_ok=True)
os.makedirs(LOG_DIR, exist_ok=True)

# ==============================
# ログ出力関数
# ==============================
def write_log(message):
    timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    log_file = os.path.join(
        LOG_DIR,
        f"log_{datetime.now().strftime('%Y%m%d')}.txt"
    )
    log_line = f"[{timestamp}] {message}"
    print(log_line)
    with open(log_file, "a", encoding="utf-8") as f:
        f.write(log_line + "n")

# ==============================
# メイン処理
# ==============================
def main():
    write_log("=== 株価自動取得スクリプト開始 ===")

    all_data = []

    for symbol in SYMBOLS:
        try:
            write_log(f"{symbol} のデータを取得中...")
            ticker = yf.Ticker(symbol)
            hist = ticker.history(period="5d")

            if hist.empty:
                write_log(f"  → {symbol}: データ取得失敗(空データ)")
                continue

            latest = hist.iloc[-1]
            record = {
                "銘柄": symbol,
                "日付": hist.index[-1].strftime("%Y-%m-%d"),
                "終値": round(latest["Close"], 1),
                "高値": round(latest["High"], 1),
                "安値": round(latest["Low"], 1),
                "出来高": int(latest["Volume"]),
            }
            all_data.append(record)
            write_log(f"  → {symbol}: 終値 {record['終値']}")

        except Exception as e:
            write_log(f"  → {symbol}: エラー発生 - {str(e)}")
            write_log(traceback.format_exc())

    if all_data:
        df = pd.DataFrame(all_data)
        filename = f"stock_data_{datetime.now().strftime('%Y%m%d_%H%M%S')}.csv"
        filepath = os.path.join(OUTPUT_DIR, filename)
        df.to_csv(filepath, index=False, encoding="utf-8-sig")
        write_log(f"CSVファイル保存完了: {filepath}")
    else:
        write_log("取得できたデータがありませんでした。")

    write_log("=== 株価自動取得スクリプト終了 ===n")

if __name__ == "__main__":
    main()

スクリプトの手動テスト

タスクスケジューラに登録する前に、必ずコマンドプロンプトから手動実行して正常動作を確認してください。


python C:python-projectsscriptsauto_stock_check.py

C:python-projectsoutput フォルダにCSVファイル、C:python-projectslogs フォルダにログファイルが生成されれば正常です。

手動で動かないスクリプトは、タスクスケジューラで動くことはありません。必ず手動テストを通してから登録してください。

タスクスケジューラへの登録手順

スクリプトの準備が完了したら、タスクスケジューラに登録します。

ステップ1:タスクの作成を開始する

  1. タスクスケジューラを起動する
  2. 右側の操作パネルから「タスクの作成」をクリックする

「基本タスクの作成」ではなく「タスクの作成」を選択してください。基本タスクでは細かい設定ができません。

ステップ2:「全般」タブの設定

設定項目 入力内容
名前 Python_StockCheck_Daily(任意の分かりやすい名前)
説明 毎朝9時に株価データを自動取得するタスク
セキュリティオプション 「ユーザーがログオンしているかどうかにかかわらず実行する」を選択
最上位の特権で実行する チェックを入れる
構成 「Windows 10」を選択

「ユーザーがログオンしているかどうかにかかわらず実行する」を選択すると、PCにログインしていない状態でもタスクが実行されます。

ステップ3:「トリガー」タブの設定

  1. 「新規」ボタンをクリック
  2. 以下のとおり設定する
    • タスクの開始: スケジュールに従う
    • 設定: 毎日
    • 開始: 任意の日付 / 09:00:00
    • 間隔: 1日

「OK」をクリックしてトリガーを保存します。

ステップ4:「操作」タブの設定(最重要)

ここがタスクスケジューラ設定の最も重要な部分です。設定を誤ると、スクリプトが実行されません。

  1. 「新規」ボタンをクリック
  2. 以下のとおり設定する
設定項目 入力内容
操作 プログラムの開始
プログラム/スクリプト C:Users<ユーザー名>AppDataLocalProgramsPythonPython312python.exe
引数の追加 C:python-projectsscriptsauto_stock_check.py
開始(オプション) C:python-projectsscripts

「プログラム/スクリプト」にはpython.exeのフルパスを指定してください。python とだけ入力するとPATHの解決に失敗するケースがあります。

python.exeのフルパスは、コマンドプロンプトで以下のコマンドを実行すると確認できます。


where python

「開始(オプション)」にはスクリプトが配置されているフォルダのパスを指定します。この設定により、スクリプト内の相対パスが正しく解決されます。

ステップ5:「条件」タブの設定

以下の設定を推奨します。

  • 「コンピューターをAC電源で使用している場合のみタスクを開始する」: デスクトップPCの場合はチェックを外す(常時電源接続のため)
  • 「タスクを実行するためにスリープを解除する」: チェックを入れる(スリープ中でも実行したい場合)

ステップ6:「設定」タブの設定

設定項目 推奨値
タスクが既に実行中の場合 新しいインスタンスを開始しない
タスクが失敗した場合の再起動 チェックを入れ、間隔を「1分」、回数を「3回」に設定
タスクを停止するまでの時間 「1時間」(無限ループ防止のため)

すべての設定が完了したら「OK」をクリックします。パスワードの入力を求められた場合は、Windowsのログインパスワードを入力してください。

バッチファイルを使った実行方法(応用)

python.exeのパスを直接指定する方法の代わりに、バッチファイル(.bat)を経由して実行する方法もあります。

バッチファイルのメリット

  • 仮想環境の有効化を組み込める
  • 複数のスクリプトを順番に実行できる
  • ログのリダイレクトを柔軟に設定できる

【コピペOK】バッチファイルの作成

以下の内容を run_stock_check.bat として保存してください。


@echo off
echo === バッチ実行開始: %date% %time% ===

cd /d C:python-projectsscripts

call C:python-projects.venvScriptsactivate.bat

python auto_stock_check.py

echo === バッチ実行完了: %date% %time% ===

タスクスケジューラの「操作」タブでは、以下のように設定します。

設定項目 入力内容
プログラム/スクリプト C:python-projectsscriptsrun_stock_check.bat
引数の追加 (空欄)
開始(オプション) C:python-projectsscripts

バッチファイルを経由することで、仮想環境の有効化(activate.bat)を自動的に行えます。仮想環境を使用している場合は、この方法が最も確実です。

動作確認とデバッグの方法

タスクを登録したら、スケジュール時刻を待たずにすぐテスト実行を行ってください。

手動でタスクを実行する

  1. タスクスケジューラのタスク一覧から登録したタスクを右クリック
  2. 実行」を選択

実行結果の確認方法

タスク一覧の「前回の実行結果」列に表示されるコードで、実行結果を判断できます。

結果コード 意味
0x0 正常終了
0x1 異常終了(スクリプト内でエラー発生)
0x41301 タスクは現在実行中
0x41303 タスクはまだ実行されていない
0x80070005 アクセスが拒否された(権限不足)

「履歴」タブでの詳細確認

タスクスケジューラの下部に「履歴」タブがあります。履歴が表示されない場合は、右側の操作パネルで「すべてのタスクの履歴を有効にする」をクリックしてください。

履歴にはタスクの開始・終了時刻やエラー情報が記録されるため、トラブルシューティングの重要な情報源になります。

よくあるエラーと対処法

タスクが実行されるがスクリプトが動いていない(結果コード0x1)

python.exeのパス指定が誤っている、またはスクリプト内でエラーが発生しています。以下を確認してください。

  • 「操作」タブの「プログラム/スクリプト」にpython.exeのフルパスが正しく入力されているか
  • 「引数の追加」にスクリプトのフルパスが正しく入力されているか
  • 「開始(オプション)」にスクリプトのフォルダパスが入力されているか

最も確実なデバッグ方法は、コマンドプロンプトでタスクスケジューラとまったく同じコマンドを手動実行することです。


C:Users<ユーザー名>AppDataLocalProgramsPythonPython312python.exe C:python-projectsscriptsauto_stock_check.py

スリープ復帰後にタスクが実行されない

「条件」タブの「タスクを実行するためにスリープを解除する」にチェックが入っているか確認してください。

また、Windowsの電源設定で「スリープ解除タイマーの許可」が無効になっている場合、タスクスケジューラがスリープを解除できません。

  • 「設定」→「システム」→「電源とスリープ」→「電源の追加設定」→「プラン設定の変更」→「詳細な電源設定の変更」
  • 「スリープ」→「スリープ解除タイマーの許可」→「有効」に変更

「指定されたファイルが見つかりません」エラー

パスに日本語やスペースが含まれている場合に発生することがあります。

対処法:

  • パスをダブルクォーテーション(")で囲む
  • 可能であればフォルダ名に日本語やスペースを使わない

引数の追加欄には、以下のようにダブルクォーテーションで囲んだパスを入力してください。


"C:python-projectsscriptsauto_stock_check.py"

まとめ

Windowsタスクスケジューラを使ったPythonスクリプトの自動実行は、以下の手順で設定できます。

  • 自動実行用のスクリプトにはログ出力とエラーハンドリングを必ず実装する
  • 手動テストで正常動作を確認してからタスクスケジューラに登録する
  • 「操作」タブでは python.exeとスクリプトの両方をフルパスで指定する
  • 「開始(オプション)」にスクリプトのフォルダパスを設定し、相対パスの問題を防ぐ
  • 仮想環境を使用する場合はバッチファイル経由で実行する
  • 登録後は「実行」ボタンで即座にテストし、結果コードとログを確認する

タスクスケジューラによる自動実行は、手動運用からの脱却を実現する最初のステップです。この仕組みを基盤にして、株価モニタリング、テクニカル指標の定時計算、アラート通知システムなど、さまざまな自動化パイプラインを構築してください。

🔗 関連記事

Pythonで株価を毎日自動取得する方法【schedule・cron】

🔗 関連記事

cronでPython株価分析スクリプトを毎日自動実行する方法【VPS・Linux】

タイトルとURLをコピーしました