スリープで止まる問題を解決!Python自動売買を24時間止めないPC設定術

準備・環境構築

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

Pythonで株価監視スクリプトや自動売買システムを構築し、いざ自宅PCで稼働させたところ「気づいたらPCがスリープしてスクリプトが止まっていた」という経験は、初心者が必ず通る失敗のひとつです。

どれほど精巧なアルゴリズムを書いても、PCが途中でスリープ状態に入れば、データ取得は止まり、シグナル通知は届かず、自動発注は実行されません。

システムトレードにおいて、コードの品質と同等以上に「稼働環境の安定性」が重要となります。

この記事では、Windows PCを中心に、Pythonスクリプトを24時間安定稼働させるための電源設定・スリープ防止策・運用管理のベストプラクティスを網羅的に解説します。

VPS(仮想専用サーバー)への移行判断基準も含め、自動売買の「インフラ面」を完全にカバーします。

なぜPCがスリープすると自動売買が破綻するのか

まずは、スリープ状態がPythonスクリプトに与える影響を正確に理解してください。

原因を把握しなければ、対策も的外れになります。

スリープ状態で何が起きるか

WindowsのスリープモードはCPUの動作を一時停止し、RAMの内容だけを保持する省電力状態です。

この状態になると、以下の処理がすべて停止します。

  • Pythonプロセスの実行time.sleep() のカウントも含め完全に凍結します
  • ネットワーク通信:Wi-FiおよびLANアダプターが無効化されます
  • タスクスケジューラの実行:スリープ中はスケジュールされたタスクがトリガーされません
  • ファイル書き込み:ログやCSVの保存処理も中断されます

スリープから復帰した後、Pythonプロセスは「何事もなかったかのように」途中から再開しますが、スリープ中に取得すべきだったデータは永久に失われます。

スリープとシャットダウンの違い

混同されやすいスリープ・休止状態・シャットダウンの違いを整理します。

状態 RAM保持 CPU動作 復帰速度 Pythonへの影響
スリープ 停止 数秒 プロセスは凍結(復帰後に再開)
休止状態 ディスクに退避 停止 数十秒 プロセスは凍結(復帰後に再開)
シャットダウン × 停止 数分 プロセスは完全終了
画面オフのみ 動作継続 即時 影響なし

自動売買で必要なのは「画面オフ+CPU動作継続」の状態です。スリープや休止状態は絶対に回避してください。

Windowsの電源設定を最適化する

PCのスリープを防止するために、まずはWindows側の電源設定を変更します。

ここで紹介する設定は、すべてWindows 10およびWindows 11で共通です。

コントロールパネルからの電源プラン設定

最も確実な設定方法は、コントロールパネルの電源オプションを直接操作する手順です。

  1. Win + R キーを押し、control と入力してEnterを押します
  2. 「ハードウェアとサウンド」→「電源オプション」を開きます
  3. 使用中の電源プランの「プラン設定の変更」をクリックします
  4. 以下の通りに設定を変更します
    • ディスプレイの電源を切る:任意の時間(例:15分)※画面オフはCPUに影響なし
    • コンピューターをスリープ状態にする「なし(適用しない)」
  5. 「変更の保存」をクリックします

さらに「詳細な電源設定の変更」をクリックし、以下の項目も確認してください。

  • スリープ → 次の時間が経過後スリープする:0(なし)
  • スリープ → 休止状態 → 次の時間が経過後休止状態にする:0(なし)
  • ハードディスク → 次の時間が経過後ハードディスクの電源を切る:0(なし)

【コピペOK】PowerShellコマンドで一括設定する方法

GUIでの設定が面倒な場合は、PowerShellで一括変更できます。

管理者権限でPowerShellを起動し、以下のコマンドを実行してください。


# スリープを無効化(AC電源接続時)
powercfg /change standby-timeout-ac 0

# 休止状態を無効化(AC電源接続時)
powercfg /change hibernate-timeout-ac 0

# ハードディスクの自動オフを無効化(AC電源接続時)
powercfg /change disk-timeout-ac 0

# ディスプレイのオフ時間を15分に設定(任意)
powercfg /change monitor-timeout-ac 15

# 設定確認
powercfg /query

ノートPCを使用している場合は、バッテリー駆動時の設定も変更する必要があります。

-ac の部分を -dc に置き換えて同じコマンドを実行してください。

Windows Updateによる自動再起動を防止する

電源設定を完璧にしても、Windows Updateが自動的にPCを再起動してしまうケースがあります。

これは「アクティブ時間」の設定で防止できます。

  1. 「設定」→「Windows Update」→「詳細オプション」を開きます
  2. 「アクティブ時間」を設定します(例:8:00〜23:00)
  3. アクティブ時間中はWindowsが自動再起動を行いません

ただし、アクティブ時間外に再起動される可能性は残ります。

より確実に防止するには、以下のレジストリ設定を追加します。


# 自動再起動を無効化(グループポリシー相当)
reg add "HKLMSOFTWAREPoliciesMicrosoftWindowsWindowsUpdateAU" /v NoAutoRebootWithLoggedOnUsers /t REG_DWORD /d 1 /f

レジストリの変更はシステムに影響を与える可能性があります。変更前にシステムの復元ポイントを作成しておくことを推奨します。

Pythonスクリプト側でのスリープ防止策

OS側の設定に加えて、Pythonスクリプト自体にもスリープ防止の仕組みを組み込むことで、二重の安全策を講じることができます。

【コピペOK】Windows APIを呼び出してスリープを抑制するコード

Windowsには SetThreadExecutionState というAPIがあり、アプリケーション実行中にスリープへの移行を抑制できます。

Pythonからは ctypes モジュールを使って呼び出します。


import ctypes
import time

# ==============================
# Windows スリープ防止フラグ
# ==============================
ES_CONTINUOUS = 0x80000000
ES_SYSTEM_REQUIRED = 0x00000001
ES_DISPLAY_REQUIRED = 0x00000002

def prevent_sleep():
    ""Windowsのスリープを抑制します。""
    ctypes.windll.kernel32.SetThreadExecutionState(
        ES_CONTINUOUS | ES_SYSTEM_REQUIRED
    )
    print("✔ スリープ抑制を有効にしました。")

def allow_sleep():
    ""スリープ抑制を解除し、通常状態に戻します。""
    ctypes.windll.kernel32.SetThreadExecutionState(ES_CONTINUOUS)
    print("✔ スリープ抑制を解除しました。")

# ==============================
# 使用例:メイン処理
# ==============================
if __name__ == "__main__":
    prevent_sleep()

    try:
        print("--- 株価監視ループ開始 ---")
        while True:
            # ここに株価取得・シグナル判定の処理を記述
            print(f"監視中... {time.strftime('%Y-%m-%d %H:%M:%S')}")
            time.sleep(60)  # 1分間隔で監視

    except KeyboardInterrupt:
        print("n--- 監視を終了します ---")

    finally:
        allow_sleep()

このコードは以下の動作を行います。

  • prevent_sleep():スクリプト実行中はPCがスリープに入らないようOSに通知します
  • allow_sleep():スクリプト終了時にスリープ抑制を解除し、通常の電源管理に戻します
  • finally ブロックで解除処理を呼ぶことで、エラー終了時にも確実にクリーンアップされます

【コピペOK】クロスプラットフォーム対応版(wakepy使用)

Windows以外(Mac/Linux)でも使えるクロスプラットフォームなスリープ防止ライブラリとして「wakepy」が公開されています。


pip install wakepy

from wakepy import keep

# ==============================
# wakepyでスリープ防止
# ==============================
if __name__ == "__main__":
    # keep.running() はCPUスリープを防止(画面はオフ可能)
    with keep.running():
        print("✔ スリープ防止モードで実行中")

        import time
        try:
            while True:
                print(f"監視中... {time.strftime('%Y-%m-%d %H:%M:%S')}")
                time.sleep(60)
        except KeyboardInterrupt:
            print("n--- 監視を終了します ---")

    # withブロックを抜けると自動的にスリープ防止が解除されます
    print("✔ スリープ防止を解除しました。")

wakepyは with 文で囲むだけでスリープ防止が有効になり、ブロックを抜けると自動解除されるため、コードの見通しが良くなります。

長期安定稼働のための運用テクニック

電源設定とスリープ防止コードを実装したら、次は「数週間〜数ヶ月間の連続稼働」を見据えた運用設計を行います。

プロセス監視と自動復旧の仕組み

長期稼働では、Pythonスクリプト自体が予期しないエラーで停止するリスクがあります。

タスクスケジューラを使って「停止検知+自動再起動」の仕組みを構築してください。

以下は、Windowsタスクスケジューラに登録する際の推奨設定です。

設定項目 推奨値
トリガー 毎日、特定時刻(例:8:50、東証前場前)
操作 python C:tradingmonitor.py を実行
条件 → スリープ解除して実行 ✔ 有効にする
設定 → タスクが失敗した場合の再起動 1分後に再起動、最大3回
設定 → 同じタスクの多重起動を防止 新しいインスタンスを起動しない

ログ出力の実装

長期稼働中にトラブルが発生した際、ログがなければ原因の特定が不可能になります。

最低限のログ出力は必ず実装してください。


import logging
import os

# ==============================
# ログ設定
# ==============================
LOG_DIR = "logs"
os.makedirs(LOG_DIR, exist_ok=True)

logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s [%(levelname)s] %(message)s",
    handlers=[
        logging.FileHandler(os.path.join(LOG_DIR, "monitor.log"), encoding="utf-8"),
        logging.StreamHandler(),  # コンソールにも出力
    ],
)
logger = logging.getLogger(__name__)

# 使用例
logger.info("株価監視を開始しました。")
logger.warning("RSIが70を超えました。")
logger.error("データ取得に失敗しました。")

ログファイルが肥大化するのを防ぐため、RotatingFileHandler を使ってファイルサイズの上限を設定することも推奨します。

VPS(仮想専用サーバー)への移行を検討すべきタイミング

自宅PCでの運用には物理的な限界があります。

以下の条件に1つでも該当する場合は、VPSへの移行を検討してください。

  • 24時間365日の連続稼働が必要な場合
  • 停電やブレーカー落ちのリスクを排除したい場合
  • 外出時にPCの電源が入っているか不安になる場合
  • 複数のスクリプトを同時稼働させたい場合

VPSは月額500〜2,000円程度から利用可能です。

国内ではConoHa VPS、さくらのVPS、Xserver VPSなどがPython実行環境として利用実績があります。

よくあるエラーと対処法

自宅PCでの自動売買運用で発生しがちなトラブルと、その解決策をまとめます。

設定を変更したのにPCがスリープしてしまいます

電源プランが複数存在し、実際に適用されているプランとは別のプランを変更しているケースが多いです。

以下のコマンドで現在適用中のプランを確認してください。


powercfg /getactivescheme

表示されたプランが自分が変更したものと一致しているか確認します。

一致していない場合は、正しいプランをアクティブに設定してください。


# プラン一覧を表示
powercfg /list

# 特定のプランをアクティブにする(GUIDは環境により異なります)
powercfg /setactive XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX

ノートPCのカバーを閉じるとスリープしてしまいます

ノートPCには「カバーを閉じたときの動作」という独自の設定があります。

以下の手順で変更してください。

  1. 「コントロールパネル」→「電源オプション」→「カバーを閉じたときの動作の選択」を開きます
  2. 「カバーを閉じたときの動作」を「何もしない」に変更します
  3. 「電源に接続」「バッテリ駆動」の両方を変更します

SetThreadExecutionStateがLinuxやMacで動きません

ctypes.windll はWindows専用のAPIです。

Linux/Macで使用するとエラーになります。

対処法として、前述の wakepy ライブラリを使用してください。

wakepyはWindows・Mac・Linuxのすべてに対応しています。

自宅PCでの運用は「手軽に始められる」反面、停電・ネットワーク障害・OS更新など制御不能な要因が多く存在します。本番運用に移行する際は、VPSの利用を強く推奨します。

まとめ

この記事では、Python自動売買システムを自宅PCで安定稼働させるための電源設定・スリープ防止策・運用管理のノウハウを解説しました。

要点を整理します。

  • Windowsの電源プランで「スリープ=なし」「休止状態=なし」に設定することが最優先です
  • PowerShellコマンド powercfg を使えば、一括で電源設定を変更できます
  • Pythonスクリプト内で SetThreadExecutionState または wakepy を使い、二重のスリープ防止策を講じてください
  • Windows Updateの自動再起動は「アクティブ時間」の設定で防止できます
  • タスクスケジューラによる自動再起動とログ出力は、長期運用の必須要件です
  • 24時間365日の安定稼働が必要になった段階で、VPSへの移行を検討してください

次のステップとして、本記事のスリープ防止コードを既存の株価監視スクリプトに組み込み、まずは1週間の連続稼働テストを実施してみてください。

テスト期間中にログを確認し、停止やエラーが発生していないことを検証した上で、本番運用に移行することを推奨します。

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