子供が産まれてから、朝8時台は完全に育児タイムになった。株価を確認しようにもそんな余裕はない。だったら「コンピューターに毎朝やらせよう」と思いたち、Windowsタスクスケジューラを使い始めた。最初の設定でちょっと詰まったけど、今は毎朝9時には結果がメールで届く仕組みが動いている。
なぜWindowsタスクスケジューラを選んだか
Macユーザーなら「cron」を使うのが定番だが、僕のメイン環境はWindows。Windowsにもcronに相当する機能としてタスクスケジューラ(Task Scheduler)が標準搭載されている。追加のインストールは不要で、GUIからポチポチ設定できる。
一方で「Pythonのscheduleライブラリを使えばいいじゃないか」と思う人もいるかもしれない。確かにscheduleライブラリはコードで定期実行を書けて便利だが、「スクリプトを起動したままにする必要がある」という前提がある。PCの再起動やスリープが挟まると止まってしまう。その点、Windowsタスクスケジューラはシステムレベルで管理されているので、PC再起動後も自動で動き続ける。
準備:自動実行させるPythonスクリプトを作る
まず自動実行させるスクリプト本体を用意する。ここでは「日本株製造業の主要銘柄の前日終値と3ヶ月移動平均を比較し、乖離率が大きい銘柄をCSVに出力する」スクリプトを例にする。
# stock_alert.py
import yfinance as yf
import pandas as pd
from datetime import datetime, timedelta
import os
# ---- 設定 ----
TICKERS = {
"7203": "トヨタ自動車",
"6501": "日立製作所",
"6902": "デンソー",
"6301": "コマツ",
"7011": "三菱重工業",
}
OUTPUT_DIR = r"C:\Users\あなたのユーザー名\Documents\stock_reports"
ALERT_THRESHOLD = 5.0 # 移動平均からの乖離率が5%以上の銘柄をアラート対象
os.makedirs(OUTPUT_DIR, exist_ok=True)
# ---- データ取得と計算 ----
today = datetime.today().strftime("%Y-%m-%d")
results = []
for code, name in TICKERS.items():
try:
hist = yf.download(f"{code}.T",
start=(datetime.today() - timedelta(days=120)).strftime("%Y-%m-%d"),
end=today,
progress=False,
auto_adjust=True)
if hist.empty:
continue
close = hist["Close"].squeeze()
latest_price = close.iloc[-1]
ma75 = close.rolling(75).mean().iloc[-1]
deviation = (latest_price - ma75) / ma75 * 100
results.append({
"銘柄コード": code,
"銘柄名": name,
"前日終値": round(float(latest_price), 0),
"75日移動平均": round(float(ma75), 0),
"乖離率(%)": round(float(deviation), 2),
"アラート": "★" if abs(deviation) >= ALERT_THRESHOLD else "",
})
except Exception as e:
print(f"{code} エラー: {e}")
# ---- CSV出力 ----
df = pd.DataFrame(results)
filename = os.path.join(OUTPUT_DIR, f"stock_report_{today}.csv")
df.to_csv(filename, index=False, encoding="utf-8-sig")
print(f"保存完了: {filename}")
print(df.to_string(index=False))
このスクリプトを C:\Users\あなたのユーザー名\scripts\stock_alert.py のような場所に保存しておく(パスにスペースが入ると後でタスクスケジューラの設定がやや面倒になるので、シンプルなパスにするのがオススメ)。
Windowsタスクスケジューラの設定手順
スクリプトの準備ができたら、タスクスケジューラに登録する。
① タスクスケジューラを開く:Windowsキーを押して「タスクスケジューラ」と検索して開く。または Win + R → taskschd.msc でも起動できる。
② 「タスクの作成」を選択:右側の操作ペインから「タスクの作成」をクリック。
③ 全般タブ:名前に「株価モニタリング」など分かりやすい名前をつける。「最上位の特権で実行する」にチェックを入れると権限エラーが起きにくい。
④ トリガータブ:「新規」→「毎日」を選び、時刻を「08:45」などに設定(東京市場の前場開始は9:00なので、その前に実行される)。
⑤ 操作タブ:「新規」→「プログラムの開始」を選択して以下を入力する。
# 操作タブの設定値
プログラム/スクリプト: C:\Users\あなたのユーザー名\AppData\Local\Programs\Python\Python311\python.exe
引数の追加: C:\Users\あなたのユーザー名\scripts\stock_alert.py
開始: C:\Users\あなたのユーザー名\scripts\
Pythonの実行ファイルのパスは、コマンドプロンプトで where python を実行すれば確認できる。仮想環境を使っている場合は venv\Scripts\python.exe のパスを指定する。
⑥ 条件タブ:「AC電源で実行している場合のみ」のチェックを外す(ノートPCの場合、バッテリー駆動中も実行させたいなら)。
⑦ 設定タブ:「タスクが失敗した場合の再起動の間隔」を「1分」「最大3回」に設定しておくと、ネットワークエラーなどで一時的に失敗してもリトライしてくれる。
コマンドラインから直接設定する方法(上級者向け)
GUIが面倒な人や、設定をスクリプト化したい人はコマンドプロンプト(管理者権限)で以下のコマンドでも登録できる。
schtasks /create /tn "株価モニタリング" ^
/tr "\"C:\Users\ユーザー名\AppData\Local\Programs\Python\Python311\python.exe\" \"C:\Users\ユーザー名\scripts\stock_alert.py\"" ^
/sc DAILY /st 08:45 /f
登録確認は schtasks /query /tn "株価モニタリング" で、手動テスト実行は schtasks /run /tn "株価モニタリング" でできる。
よくあるトラブルと対処法
「スクリプトが手動では動くのにタスクスケジューラから動かない」:最もよくあるケース。原因のほとんどは「作業ディレクトリ(開始場所)の未設定」か「環境変数PATHの違い」。操作タブの「開始」にスクリプトのあるフォルダを指定することで解決することが多い。
「ログが見当たらなくてデバッグできない」:スクリプト内で sys.stdout をファイルにリダイレクトするか、logging モジュールでログファイルに出力するようにすると原因特定が格段に楽になる。
import logging, os
from datetime import datetime
LOG_DIR = r"C:\Users\あなたのユーザー名\Documents\stock_logs"
os.makedirs(LOG_DIR, exist_ok=True)
log_file = os.path.join(LOG_DIR, f"log_{datetime.today().strftime('%Y%m%d')}.txt")
logging.basicConfig(
filename=log_file,
level=logging.INFO,
format="%(asctime)s %(levelname)s %(message)s",
encoding="utf-8"
)
logging.info("スクリプト開始")
まとめ
Windowsタスクスケジューラを使えば、Pythonスクリプトの定期実行は意外とシンプルに実現できる。最初の設定が少し面倒だけど、一度動き出せば毎日手動でスクリプトを起動する手間がなくなる。育児中の僕には本当に助かっている機能だ。
今のところCSV出力だけだが、次のステップはGmailかLINE Notifyでアラートを飛ばす仕組みを追加すること。スマホに通知が来れば、育児の合間にチラ見するだけでポジション管理ができるはず。少しずつ自動化の輪を広げていくのが、忙しいパパトレーダーの生存戦略だと思っている。

