※本記事のコードや情報は執筆時点の仕様に基づいています。投資は自己責任であり、必ずデモ環境や少額資金でテストした上で運用してください。
自動売買のコードを書き始めるとき、多くの人はいきなり main.py を作って書き進めます。動くものはできますが、しばらくするとAPIキーがコードに直書きされ、ライブラリのバージョンも分からず、どこに何があるか把握できない状態になります。
そうなってから整理するのは、かなり骨が折れます。最初の30分で土台を作っておけば、後の数十時間が楽になります。
この記事では、Windows環境でPython自動売買の開発環境を構築する手順を解説します。仮想環境・APIキーの分離・設定の一元管理・バージョン固定——この4点を押さえた、そのまま使えるプロジェクト構成を作っていきます。
なぜ最初に環境を整えるのか
「動けばいい」で始めると、具体的にどんな問題が起きるのか。実際によくあるパターンを挙げます。
| やりがちなこと | 起きる問題 | 対策 |
|---|---|---|
| APIキーを直書き | コード共有時に流出 | .envに分離 |
| グローバルにpip install | 他のプロジェクトと衝突 | venvで隔離 |
| バージョンを記録しない | ある日突然動かなくなる | requirements.txt |
| 設定値をコードに散らす | 変更箇所を探せない | config.pyに集約 |
| Gitに全部上げる | 秘密情報が公開される | .gitignore |
特に深刻なのが1番目と3番目です。APIキーの流出は実害に直結しますし、ライブラリの仕様変更で動かなくなったとき、以前どのバージョンで動いていたか分からないと復旧のしようがありません。
yfinanceのようなデータ取得ライブラリは、仕様変更が比較的頻繁に入ります。「昨日まで動いていたのに今日は動かない」は、実際に起こると考えておいてください。
もう1つ、環境を整える効果として見落とされがちなのが「再現できること」です。自宅PCで作ったものをVPSに移すとき、環境が記録されていなければ一から手探りで組み直すことになります。
逆に requirements.txt と .env.example さえあれば、新しいマシンでも数分で同じ環境が立ち上がります。自動売買を本格的に運用するなら、遅かれ早かれサーバーへの移行を考えることになるので、最初から移せる形にしておくと後が楽です。
📘 外部参考:Python 公式サイト / venv(Python公式ドキュメント)
Pythonのインストール
すでにPythonが入っている方は読み飛ばして構いません。まだの場合は、公式サイトからインストーラを取得してください。
インストール時に絶対に見落としてはいけない項目が1つあります。
- 「Add Python to PATH」に必ずチェックを入れる: これを忘れると、コマンドプロンプトからPythonを呼べません
- バージョンは最新の1つ前が無難: 出たばかりのバージョンは対応していないライブラリがある
- Microsoft Store版は避ける: パスの扱いが特殊で、後々トラブルの元になりやすい
REM コマンドプロンプトで確認する
python --version
pip --version
REM 「'python' は認識されていません」と出たら、PATHが通っていない
REM → インストーラを再実行し、Modify から PATH を追加する
なお、Windowsには py というランチャーも用意されています。複数バージョンを入れている場合は、こちらのほうが確実です。
REM 入っているバージョンを一覧表示する
py -0
REM バージョンを指定して実行する
py -3.12 --version
あわせて、エディタも用意しておくと作業効率が変わります。Pythonを書くならVS Codeが定番で、無料かつ拡張機能が豊富です。
- Python拡張機能: 補完とエラー検出。これだけは必ず入れる
- Jupyter拡張機能: 対話的にデータを確認したいとき便利
- Ruff / Black: コードの体裁を自動で整えてくれる
エディタの設定についてはPython株価分析をVS Codeで快適にする拡張機能にまとめています。メモ帳でも書けますが、タイプミスをその場で指摘してくれるだけで学習効率がまったく違います。
プロジェクトの構成を決める
ファイルを1か所に積み上げると、すぐに把握できなくなります。役割ごとにフォルダを分けておくと、後から探す手間が激減します。
auto-trading/
├── .env ← APIキーなどの秘密情報(Gitに上げない)
├── .env.example ← 設定項目の見本(こちらは共有OK)
├── .gitignore
├── requirements.txt ← ライブラリのバージョン固定
├── config.py ← 設定の一元管理
├── main.py ← 実行の起点
│
├── src/ ← 処理の本体
│ ├── __init__.py
│ ├── fetcher.py ← データ取得
│ ├── indicators.py ← 指標の計算
│ ├── strategy.py ← 売買判断
│ └── notifier.py ← 通知
│
├── data/ ← 取得したデータ(Gitに上げない)
├── logs/ ← 実行ログ(Gitに上げない)
└── tests/ ← 動作確認用
この構成のポイントは、「変わるもの」と「変わらないもの」を分けていることです。
src/: ロジック本体。Gitで管理し、変更履歴を残す.env: 環境ごとに違う値。Gitには上げないdata/logs/: 実行のたびに増える。Gitには上げない
REM PowerShellでまとめて作成する
mkdir auto-trading
cd auto-trading
mkdir src, data, logs, tests
New-Item src\__init__.py -ItemType File
New-Item main.py, config.py, requirements.txt, .env, .gitignore -ItemType File
仮想環境を作る
仮想環境(venv)は、プロジェクトごとにライブラリを独立させる仕組みです。これがないと、AプロジェクトでpandasをアップデートしたらBプロジェクトが壊れる、といったことが起きます。
REM 仮想環境を作る
python -m venv venv
REM 有効化する(コマンドプロンプト)
venv\Scripts\activate.bat
REM 有効化する(PowerShell)
venv\Scripts\Activate.ps1
REM プロンプトの先頭に (venv) が付けば成功
REM 無効化するときは deactivate
PowerShellで「スクリプトの実行が無効になっている」というエラーが出た場合は、実行ポリシーを変更します。
REM 現在のユーザーに限定して許可する(管理者権限は不要)
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned
REM 確認する
Get-ExecutionPolicy -List
CurrentUser を指定するのがポイントです。システム全体の設定を変えずに済むので、影響範囲を最小限にできます。
ライブラリを入れてバージョンを固定する
REM 仮想環境を有効にした状態で実行する
python -m pip install --upgrade pip
pip install yfinance pandas numpy matplotlib requests python-dotenv
REM 現在の構成を記録する(これが最重要)
pip freeze > requirements.txt
type requirements.txt
pip freeze で作った requirements.txt には、バージョン番号まで含めて記録されます。これがあれば、別のPCやVPSでまったく同じ環境を再現できます。
REM 別の環境で復元するとき
python -m venv venv
venv\Scripts\activate.bat
pip install -r requirements.txt
VPSに移行する際もこのファイルをコピーするだけで済みます。手順はConoHa VPSでPython環境を構築する完全手順にまとめています。
APIキーを.envで管理する
ここが最も重要な部分です。証券会社のAPIキーや通知用のWebhook URLを、コードに直接書かないでください。
理由は単純で、コードは人の目に触れる機会が多いからです。
- GitHubに上げたとき(公開・非公開を問わず危険)
- エラーの相談でコードを貼ったとき——これが一番多い
- ブログや勉強会で画面を共有したとき
# .env(実際の値を書く。Gitには絶対に上げない)
DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/xxxxx
LINE_NOTIFY_TOKEN=your_token_here
BROKER_API_KEY=your_key_here
BROKER_API_SECRET=your_secret_here
# 動作モード(本番運用のときだけ true にする)
LIVE_TRADING=false
# .env.example(値は空にして、こちらはGitで共有する)
DISCORD_WEBHOOK_URL=
LINE_NOTIFY_TOKEN=
BROKER_API_KEY=
BROKER_API_SECRET=
LIVE_TRADING=false
.env.example を用意しておくのがコツです。「どんな設定項目が必要か」だけを共有でき、値は各自が入れる形にできます。数か月後の自分にとっても親切な仕組みです。
読み込みには python-dotenv というライブラリを使います。これを使うと、.env の内容が環境変数として扱えるようになります。
import os
from dotenv import load_dotenv
load_dotenv() # .env を読み込む
# 値を取り出す。第2引数は見つからなかったときの既定値
webhook = os.getenv("DISCORD_WEBHOOK_URL", "")
if not webhook:
raise SystemExit("DISCORD_WEBHOOK_URL が設定されていません")
値がなかった場合に明示的に止めるのがポイントです。空文字のまま処理を続けると、通知が飛ばないのに成功したように見えてしまいます。設定漏れは、早い段階で気づけるほど被害が小さくて済みます。
config.pyで設定を一元化する
設定値がコードのあちこちに散らばっていると、変更するたびに全ファイルを探すことになります。1か所にまとめておけば、そこだけ見ればよくなります。
# config.py
import os
from pathlib import Path
from dotenv import load_dotenv
# このファイルの場所を基準にする(実行場所に依存しない)
BASE_DIR = Path(__file__).resolve().parent
load_dotenv(BASE_DIR / ".env")
# --- ディレクトリ ---
DATA_DIR = BASE_DIR / "data"
LOG_DIR = BASE_DIR / "logs"
for d in (DATA_DIR, LOG_DIR):
d.mkdir(exist_ok=True)
# --- 認証情報 ---
DISCORD_WEBHOOK_URL = os.getenv("DISCORD_WEBHOOK_URL", "")
BROKER_API_KEY = os.getenv("BROKER_API_KEY", "")
BROKER_API_SECRET = os.getenv("BROKER_API_SECRET", "")
# --- 動作モード ---
LIVE_TRADING = os.getenv("LIVE_TRADING", "false").lower() == "true"
# --- 監視銘柄 ---
TICKERS = {
"7203.T": "トヨタ自動車",
"6501.T": "日立製作所",
"6758.T": "ソニーグループ",
"^N225": "日経平均",
}
# --- 戦略パラメータ ---
RSI_PERIOD = 14
RSI_ENTRY = 30
RSI_EXIT = 70
MA_SHORT = 25
MA_LONG = 75
# --- リスク管理 ---
CAPITAL = 3_000_000 # 運用資金
RISK_PER_TRADE = 0.01 # 1トレードの許容損失(資金の1%)
MAX_POSITIONS = 3 # 同時保有の上限
UNIT = 100 # 売買単位
def validate():
"""起動時に設定を検証する"""
problems = []
if not DISCORD_WEBHOOK_URL:
problems.append("DISCORD_WEBHOOK_URL が未設定です")
if LIVE_TRADING and not BROKER_API_KEY:
problems.append("本番モードなのに BROKER_API_KEY がありません")
if not 0 < RISK_PER_TRADE <= 0.05:
problems.append(f"RISK_PER_TRADE が不正です: {RISK_PER_TRADE}")
if problems:
for p in problems:
print(f" ⚠ {p}")
return False
return True
この config.py には、3つの工夫が入っています。
Path(__file__)基準でパスを解決: どこから実行しても壊れないLIVE_TRADINGフラグ: 検証と本番を明示的に切り替えるvalidate()で設定を検証: 起動時に設定漏れを検出する
2番目のLIVE_TRADING フラグは、自動売買では必須だと考えています。テストのつもりで実弾が飛ぶ事故を、構造的に防げるからです。
# main.py での使い方
import config
def place_order(symbol, size, side):
if not config.LIVE_TRADING:
print(f"[検証モード] {symbol} {side} {size}株 ← 発注しません")
return None
print(f"[本番] {symbol} {side} {size}株 を発注します")
# 実際の発注処理をここに書く
if __name__ == "__main__":
if not config.validate():
raise SystemExit("設定に問題があります")
mode = "🔴 本番運用" if config.LIVE_TRADING else "🟢 検証モード"
print(f"{mode} で起動しました")
place_order("7203.T", 100, "BUY")
.gitignoreを最初に書く
Gitを使い始める前に設定してください。一度コミットしてしまうと、後から削除しても履歴には残り続けます。
# .gitignore
# 秘密情報(最重要)
.env
*.pem
*.key
credentials.json
# 仮想環境
venv/
.venv/
# Pythonのキャッシュ
__pycache__/
*.pyc
*.pyo
# 実行時に生成されるもの
data/
logs/
*.log
*.db
*.sqlite3
# エディタ・OS
.vscode/
.idea/
.DS_Store
Thumbs.db
# 分析用ノートブックの出力
.ipynb_checkpoints/
設定したら、実際に除外されているかを必ず確認してください。
REM .env が無視されているかを確認する
git check-ignore -v .env
REM → .gitignore:4:.env .env と表示されればOK
REM コミット対象になっているファイルを一覧する
git status --short
REM 万一 .env を追跡してしまっていたら、追跡だけ解除する
REM git rm --cached .env
すでにコミットしてしまった場合は、そのAPIキーは失効させて再発行するのが確実です。履歴から完全に消す作業は手間がかかるうえ、共有済みなら手遅れです。
なお、「非公開リポジトリだから大丈夫」という判断はおすすめしません。理由は次のとおりです。
- 公開設定を誤って切り替えることがある
- 他人を招待したときに履歴ごと見えてしまう
- 将来コードを公開したくなったとき、履歴を消せずに諦めることになる
「秘密情報はGitに入れない」を例外なく徹底するほうが、判断に迷わずに済みます。.gitignore を最初に書くのは、そのための一番簡単な方法です。
動作確認と自動実行
環境が整ったか、実際に動かして確認します。
# tests/check_env.py
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
import config
def main():
print("=== 環境チェック ===")
print(f"Python : {sys.version.split()[0]}")
print(f"仮想環境 : {'venv' in sys.prefix}")
print(f"BASE_DIR : {config.BASE_DIR}")
print(f"動作モード : {'本番' if config.LIVE_TRADING else '検証'}")
print(f"監視銘柄 : {len(config.TICKERS)} 件")
print("\n=== ライブラリ ===")
for name in ("yfinance", "pandas", "numpy", "requests", "dotenv"):
try:
mod = __import__(name)
ver = getattr(mod, "__version__", "不明")
print(f" ✓ {name:<12s} {ver}")
except ImportError:
print(f" ✗ {name:<12s} 未インストール")
print("\n=== 設定の検証 ===")
print(" ✓ 問題なし" if config.validate() else " ✗ 要修正")
print("\n=== データ取得テスト ===")
import yfinance as yf
for code, name in list(config.TICKERS.items())[:2]:
try:
px = yf.download(code, period="5d", auto_adjust=True,
progress=False)["Close"].dropna()
print(f" ✓ {name}: {float(px.iloc[-1]):,.1f}")
except Exception as e:
print(f" ✗ {name}: {e}")
if __name__ == "__main__":
main()
すべてに ✓ が付けば準備完了です。このスクリプトは残しておいて、環境を変えたときに毎回走らせると安心できます。
タスクスケジューラで自動実行する
Windowsで定期実行するなら、タスクスケジューラを使います。ここでも仮想環境のPythonを絶対パスで指定するのがポイントです。
REM 実行用のバッチファイルを用意しておくと管理が楽
REM run.bat の中身:
@echo off
cd /d "C:\Users\yourname\auto-trading"
call venv\Scripts\activate.bat
python main.py >> logs\main.log 2>&1
deactivate
cd /d でドライブごと移動しているのが重要です。タスクスケジューラは作業フォルダを設定しないと、意図しない場所で実行されます。
詳しい設定手順はPythonスクリプトをWindowsタスクスケジューラで自動実行する完全手順にまとめています。24時間稼働が必要なら、VPSへの移行も検討してください。
まとめ
Windows環境でPython自動売買の開発環境を構築する手順をまとめました。
- インストール時に「Add Python to PATH」を必ずチェックする
- フォルダは役割ごとに分ける。
src/はGit管理、data/とlogs/は除外 - venvで隔離し、
pip freezeでバージョンを固定する - APIキーは
.envに分離し、.env.exampleだけ共有する - 設定は
config.pyに集約し、起動時にvalidate()で検証する LIVE_TRADINGフラグで検証と本番を明示的に分ける.gitignoreはGitを使い始める前に書く。後からでは履歴に残る
この構成を作るのに必要な時間は、慣れれば15分程度です。その15分で、APIキーの流出と「なぜか動かない」の大半を防げます。
個人的に一番効果を感じているのは LIVE_TRADING フラグです。検証モードを既定にしておけば、うっかり実弾が飛ぶ心配なくコードをいじれます。自動売買を扱う以上、この安心感は思っている以上に重要です。
環境構築は地味な作業で、正直あまり楽しくありません。やっても何か新しいことができるようになるわけではないからです。それでも、ここを整えておくと後の作業がずっと軽くなります。
まずは本記事の構成をそのまま真似て、フォルダと config.py を作ってみてください。コードを書き始める前に土台があるという状態は、思っている以上に気持ちよく進みます。

