※本記事のコードや情報は執筆時点の仕様に基づいています。投資は自己責任であり、必ずデモ環境や少額資金でテストした上で運用してください。
株価の自動取得や売買シグナルの通知を仕組みにしたとき、最初にぶつかる壁が「自宅PCが動いていないと止まる」という問題です。Windows Update の再起動、スリープ、うっかりシャットダウン、停電——どれか1つで、その日の処理は飛びます。
解決策はシンプルで、常時稼働しているサーバーに移すことです。月額数百円のVPSを1台借りるだけで、この悩みはほぼ消えます。
この記事では、ConoHa VPSを例に契約からPython環境の構築、そして自動実行の確認までを通しで解説します。Linuxに触れたことがない方でも、上から順にコマンドを実行すれば動く状態まで持っていける構成にしました。
VPSに移すと何が変わるのか
まず、自宅PC運用との違いを整理します。「なんとなく良さそう」ではなく、具体的に何が解決するのかを押さえておくと、設定作業の意味が分かりやすくなります。
| 項目 | 自宅PC | VPS |
|---|---|---|
| 稼働時間 | 電源を入れている間だけ | 24時間365日 |
| OSの更新 | 勝手に再起動される | 自分のタイミングで実行 |
| スリープ | 設定で抑止が必要 | そもそも存在しない |
| 停電・回線断 | 止まる | データセンター側で冗長化 |
| 費用 | 電気代 | 月500〜1,500円程度 |
| 操作 | 画面を見て操作 | コマンド操作が基本 |
唯一のデメリットはコマンド操作に慣れる必要があることですが、株価分析の自動実行に必要なコマンドは10個程度です。この記事で扱う範囲を覚えれば十分に運用できます。
なお、当面は自宅PCで続けるという選択も十分にありです。その場合はタスクスケジューラで自動実行する完全手順とスリープ抑止の設定を組み合わせてください。VPSサービスの比較はPython株価分析におすすめのVPS比較にまとめています。
移行を検討する目安としては、次のどれかに当てはまったときがタイミングだと思います。
- 実行し忘れ・実行漏れが月に数回ある: 手動運用の限界が来ている
- 寄り付き前や大引け直後に処理を走らせたい: PCの前にいられない時間帯
- 長時間かかる処理を回したい: その間PCを占有されるのが煩わしい
- 売買まで自動化する予定がある: 止まると実損害につながる
逆に、月に数回スクリプトを手で叩くだけという使い方なら、VPSは過剰です。自宅PCで十分に足ります。
契約時に決めること
ConoHa VPSの申し込み画面では、いくつか選択肢が出てきます。株価分析用途での推奨は次のとおりです。
| 項目 | 推奨 | 理由 |
|---|---|---|
| プラン | メモリ1GB | データ取得と通知には十分 |
| イメージ | Ubuntu(LTS版) | 情報が豊富でサポート期間が長い |
| 接続許可ポート | SSHのみ | Webサーバーは不要 |
| SSH Key | 新規作成 | パスワードより安全 |
メモリは1GBで足りますが、機械学習を回すなら2GB以上を検討してください。yfinanceでのデータ取得やpandasでの集計程度なら、1GBで問題なく動きます。
SSH Keyは必ず「新規作成」を選び、表示された秘密鍵をダウンロードしてください。この画面を閉じると二度と取得できません。ダウンロードした .pem ファイルは、自分のPCの安全な場所に保管します。
OSの選択で迷う方もいるかもしれませんが、特別な理由がなければUbuntuのLTS版を選んでおけば間違いありません。LTSは長期サポート版という意味で、5年間セキュリティ更新が提供されます。日本語の情報も圧倒的に多く、トラブル時に解決策を見つけやすいのが利点です。
また、ConoHaにはWordPressやDockerなどが最初から入ったアプリケーションイメージも用意されていますが、株価分析用途では不要です。余計なものが動いているぶんメモリを消費するので、素のOSを選んでください。
📘 外部参考:ConoHa VPS 公式サイト / Ubuntu Server Documentation
SSHで接続する
サーバーが起動したら、手元のPCから接続します。Windows 10以降なら標準のターミナルでそのまま接続できます(追加ソフトは不要です)。
# 秘密鍵の権限を適切に設定する(これをしないと接続を拒否されます)
# --- Windows (PowerShell) ---
icacls .\conoha-key.pem /inheritance:r
icacls .\conoha-key.pem /grant:r "$($env:USERNAME):(R)"
# --- macOS / Linux ---
chmod 600 ~/.ssh/conoha-key.pem
# 接続する(IPアドレスはコントロールパネルで確認)
ssh root@203.0.113.10 -i ./conoha-key.pem
初回接続時に「本当に接続しますか」と聞かれるので yes と入力します。プロンプトが root@xxx:~# に変われば成功です。
接続できない場合、原因はほぼ次の3つです。
- 秘密鍵の権限が緩い: 上記のコマンドで権限を絞る
- セキュリティグループの設定漏れ: ConoHaのコントロールパネルでSSHを許可する
- IPアドレスの間違い: コントロールパネルで再確認する
毎回長いコマンドを打つのは面倒なので、接続情報に名前を付けておくと楽になります。手元のPCの .ssh/config に次を書いておきます。
Host stock
HostName 203.0.113.10
User trader
IdentityFile ~/.ssh/conoha-key.pem
ServerAliveInterval 60
これで ssh stock だけで接続できるようになります。ServerAliveInterval を入れているのは、しばらく操作しないと接続が切れるのを防ぐためです。長い処理をサーバー上で走らせているときに切断されるのは、地味に面倒です。
最初にやるセキュリティ設定
ここは飛ばさないでください。インターネットに公開されたサーバーには、起動直後から不正ログインの試行が来ます。実際にログを見ると、1日に数百回のアクセスが記録されていることも珍しくありません。
パッケージを最新にする
apt update && apt upgrade -y
作業用ユーザーを作る
rootのまま作業を続けるのは危険です。誤って重要なファイルを消しても止めてくれる人がいないのがrootの怖さです。
# ユーザーを作成する(パスワードを聞かれるので設定する)
adduser trader
# 管理者権限を与える
usermod -aG sudo trader
# rootのSSH鍵を、作成したユーザーにコピーする
mkdir -p /home/trader/.ssh
cp /root/.ssh/authorized_keys /home/trader/.ssh/
chown -R trader:trader /home/trader/.ssh
chmod 700 /home/trader/.ssh
chmod 600 /home/trader/.ssh/authorized_keys
ここでいったん別のターミナルを開いて、新しいユーザーで接続できるか確認してください。確認せずに次の手順に進むと、ログインできなくなる可能性があります。
# 別ウィンドウで実行して、接続できることを確認する
ssh trader@203.0.113.10 -i ./conoha-key.pem
rootログインとパスワード認証を止める
接続確認ができたら、不正ログインの入口を塞ぎます。
# 設定ファイルをバックアップしてから編集する
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
# 3つの設定を書き換える
sudo sed -i 's/^#*PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config
sudo sed -i 's/^#*PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config
sudo sed -i 's/^#*PubkeyAuthentication.*/PubkeyAuthentication yes/' /etc/ssh/sshd_config
# 設定内容を確認する
sudo grep -E "^(PermitRootLogin|PasswordAuthentication|PubkeyAuthentication)" \
/etc/ssh/sshd_config
# 反映する
sudo systemctl restart ssh
パスワード認証を切るのが最も効果的です。総当たり攻撃は、そもそも試す入口がなくなります。
ファイアウォールと不正アクセス対策
# ファイアウォール(ufw)を設定する
sudo ufw default deny incoming # 受信は原則すべて拒否
sudo ufw default allow outgoing # 送信は許可
sudo ufw allow 22/tcp # SSHだけ通す
sudo ufw --force enable
sudo ufw status verbose
# 連続失敗するIPを自動で遮断する
sudo apt install -y fail2ban
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd
fail2ban は、ログイン失敗を繰り返すIPアドレスを自動的に遮断してくれます。入れておくだけで、攻撃ログが目に見えて減ります。
より詳しい初期設定についてはVPS契約後に最初にやるUbuntu初期設定にまとめています。
タイムゾーンを日本時間にする
地味ですが極めて重要な設定です。VPSの初期状態はUTC(協定世界時)になっていることが多く、そのままだと自動実行の時刻が9時間ずれます。
# 現在の設定を確認する
timedatectl
# 日本時間に変更する
sudo timedatectl set-timezone Asia/Tokyo
# 確認する
date
# → 日本時間で「水 8月 20 16:30:00 JST」のように表示されればOK
「毎日15時30分に実行」と設定したつもりが、実際には日本時間の翌日0時30分に動いていた——これは実際によくある事故です。株価データの取得は市場の時間に依存するので、必ず最初に直してください。
サーバーを株価分析用に整える
Ubuntuには最初からPythonが入っていますが、システムのPythonに直接ライブラリを入れるのは避けてください。OSの動作に必要なパッケージと衝突する可能性があります。
# バージョンを確認する
python3 --version
# 仮想環境の作成に必要なパッケージを入れる
sudo apt install -y python3-pip python3-venv git
# 作業ディレクトリを作る
mkdir -p ~/stock
cd ~/stock
# 仮想環境を作って有効化する
python3 -m venv venv
source venv/bin/activate
# プロンプトの先頭に (venv) が付けば成功
pip install --upgrade pip
pip install yfinance pandas numpy requests
仮想環境(venv)を使うことで、プロジェクトごとにライブラリを独立させられます。将来ライブラリのバージョンを変えたくなったとき、他に影響を与えずに済みます。
# 構成を記録しておく(再構築や別サーバーへの移行が楽になる)
pip freeze > ~/stock/requirements.txt
cat ~/stock/requirements.txt
# 別環境で復元するときは
# pip install -r requirements.txt
バージョンを固定しておくのは運用の基本です。ライブラリの仕様変更で突然動かなくなる事故を防げます。
動作確認用のスクリプトを置く
環境が整ったか確認するため、実際に株価を取得してみます。
cat > ~/stock/check.py << 'EOF'
import datetime as dt
import yfinance as yf
import pandas as pd
TICKERS = {"7203.T": "トヨタ", "6501.T": "日立", "^N225": "日経平均"}
print(f"実行時刻: {dt.datetime.now():%Y-%m-%d %H:%M:%S}")
print("-" * 46)
for code, name in TICKERS.items():
try:
px = yf.download(code, period="5d", auto_adjust=True,
progress=False)["Close"].dropna()
latest = float(px.iloc[-1])
change = (latest / float(px.iloc[-2]) - 1) * 100
print(f"{name:<10s} {latest:>10,.1f} ({change:+.2f}%)")
except Exception as e:
print(f"{name:<10s} 取得失敗: {e}")
EOF
# 実行する
cd ~/stock
source venv/bin/activate
python check.py
株価が表示されれば環境構築は完了です。ここまでで「サーバー上でPythonが動き、外部からデータを取得できる」状態になりました。
毎日自動実行させる
最後に、このスクリプトを毎日決まった時刻に動かします。cronを使いますが、ここに最大の落とし穴があります。
仮想環境のPythonをフルパスで指定する
cronは普段のシェルとは違う環境で動きます。source venv/bin/activate は効かず、python というコマンドも見つかりません。
# 仮想環境のPythonの絶対パスを確認する
cd ~/stock
source venv/bin/activate
which python
# → /home/trader/stock/venv/bin/python
# ログを置くディレクトリを作る
mkdir -p ~/stock/logs
# crontab を編集する
crontab -e
# 以下を追記する(フルパスで書くのが必須)
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
# 平日15時30分に実行し、ログを残す
30 15 * * 1-5 /home/trader/stock/venv/bin/python /home/trader/stock/check.py >> /home/trader/stock/logs/check.log 2>&1
ポイントは3つです。
- Pythonもスクリプトも絶対パス: 相対パスは動きません
2>&1でエラーもログに残す: これがないと失敗理由が分かりません1-5で平日のみ: 市場が閉まっている土日は実行しない
すぐ動作確認する
翌日まで待つ必要はありません。数分後の時刻を指定して、実際に動くか確かめます。
# 現在時刻を確認して、2〜3分後を指定する
date
# 例: 16時35分に1回だけ実行する設定を一時的に追加
# 35 16 * * * /home/trader/stock/venv/bin/python /home/trader/stock/check.py >> /home/trader/stock/logs/check.log 2>&1
# 時刻が過ぎたらログを確認する
cat ~/stock/logs/check.log
# cron自体が動いたかを確認する
grep CRON /var/log/syslog | tail -5
ログに株価が出力されていれば成功です。確認できたら、テスト用の行は削除してください。
cronの設定でつまずいた場合は、cronでPython株価分析スクリプトを毎日自動実行する方法で原因別の対処法をまとめています。
運用で気をつけること
ログが際限なく増えないようにする
毎日追記していくと、数年後にはログファイルが膨大になります。ディスクを圧迫してサーバーが止まるという、笑えない事故が起こります。
# logrotate でログを自動的に世代管理する
sudo tee /etc/logrotate.d/stock > /dev/null << 'EOF'
/home/trader/stock/logs/*.log {
weekly
rotate 8
compress
missingok
notifempty
copytruncate
}
EOF
# 設定を検証する
sudo logrotate -d /etc/logrotate.d/stock
死活監視を入れる
自動化の最大の落とし穴は、止まっていることに気づかないことです。異常時だけ通知する仕組みだと、完全に停止したときに何の連絡も来ません。
対策は単純で、正常時にも1日1回「動いています」と通知させることです。通知が来ない日=止まっている日、と判断できます。
cat > ~/stock/heartbeat.py << 'EOF'
import os
import datetime as dt
import requests
def notify(text):
url = os.environ.get("DISCORD_WEBHOOK_URL")
if not url:
print("Webhook URLが未設定です")
return
requests.post(url, json={"content": text}, timeout=10)
notify(f"✅ 稼働中 {dt.datetime.now():%Y-%m-%d %H:%M}")
EOF
通知の実装方法はDiscordに株価シグナルを自動送信するコード実装にまとめています。環境変数の渡し方は、cronの行の前に DISCORD_WEBHOOK_URL=xxx を書くか、スクリプト内で .env を読む形にします。
ディスク容量を定期的に見る
# 容量と使用状況を確認する
df -h
free -h
# 大きなファイルを探す
du -sh ~/stock/* | sort -rh | head -10
# 不要なパッケージを掃除する
sudo apt autoremove -y && sudo apt clean
月に一度df -hを叩く習慣をつけておくと安心です。1GBプランでもデータをためすぎなければ十分に足ります。
セキュリティ更新を自動化する
放置しているとOSの脆弱性が塞がれないままになります。セキュリティ更新だけを自動適用する設定を入れておくと安心です。
sudo apt install -y unattended-upgrades
sudo dpkg-reconfigure --priority=low unattended-upgrades
# 動作確認(実際には適用せず、対象を表示するだけ)
sudo unattended-upgrade --dry-run --debug | tail -20
ただし自動再起動は有効にしないでください。処理の途中で再起動されると、その日のデータ取得が飛びます。カーネル更新などで再起動が必要になった場合は、自分の都合の良いタイミングで手動で行うのが安全です。
設定をバックアップしておく
サーバーが壊れたときや、別のVPSに移るときのために、設定とスクリプトは手元にも残しておきます。
# crontabの内容を書き出す
crontab -l > ~/stock/crontab.bak
# 手元のPCにまとめてコピーする
# scp -r -i ./conoha-key.pem trader@203.0.113.10:~/stock ./backup/
コードそのものはGitで管理しておくのが理想的です。サーバーが飛んでも、新しいサーバーで git clone するだけで復旧できます。
まとめ
ConoHa VPSでPython株価分析の実行環境を構築する手順をまとめました。
- プランはメモリ1GB・Ubuntu LTSで十分。SSH Keyは必ず新規作成する
- 接続できたら作業用ユーザーを作り、rootログインとパスワード認証を止める
- ufwとfail2banを入れる。SSH以外のポートは閉じる
- タイムゾーンをAsia/Tokyoに変更。忘れると実行時刻が9時間ずれる
- Pythonはvenvで仮想環境を作り、requirements.txtで固定する
- cronではPythonもスクリプトも絶対パス。
2>&1でエラーも記録する - logrotateでログを世代管理し、正常時にも通知する死活監視を入れる
VPSに移して一番良かったと感じるのは、「動いているか気にしなくてよくなった」ことです。自宅PC運用のときは、朝起きて処理が走ったか確認するのが日課でしたが、いまはその手間がなくなりました。
設定作業は一度やれば終わりです。この記事の手順を上から順に実行すれば、1時間ほどで自動実行まで到達できます。最初のうちはコマンドの意味が分からなくても構いません。動く状態を作ってから、必要になったときに調べれば十分です。
月500円程度の出費でこの安心が買えるなら、十分に元は取れると思います。まずは1か月試してみて、自分の運用に必要かどうかを判断してみてください。

