※本記事のコードや情報は執筆時点の仕様に基づいています。投資は自己責任であり、必ずデモ環境や少額資金でテストした上で運用してください。
Pythonで株価取得や自動売買のスクリプトを書き始めると、ほぼ確実に遭遇するのがエラーメッセージです。赤い文字で表示される英語のエラー文を見て、何が起きているのか分からず手が止まってしまう初心者は非常に多いです。
しかし、Pythonのエラーには明確なパターンがあります。エラーメッセージの読み方と、原因の切り分け方法さえ理解すれば、大半のトラブルは自力で解決できます。
この記事では、Python実行時に発生する代表的なエラーを分類し、それぞれの原因と具体的な対処法を体系的に解説します。エラーメッセージ別の逆引きリファレンスとしても活用してください。
Pythonエラーの基本構造を理解する
対処法を学ぶ前に、エラーメッセージの読み方を正しく理解することが最優先です。
エラーメッセージの構成要素
Pythonのエラーメッセージは、以下の3つのパートで構成されています。
- Traceback(トレースバック): エラーが発生するまでのコードの実行経路
- ファイル名と行番号: エラーが発生した正確な場所
- エラーの種類とメッセージ: 何が問題かの要約
以下は典型的なエラー出力の例です。
Traceback (most recent call last):
File "main.py", line 5, in <module>
import yfinance as yf
ModuleNotFoundError: No module named 'yfinance'
この出力から読み取れる情報は以下のとおりです。
| 要素 | 内容 |
|---|---|
| 発生ファイル | main.py |
| 発生行 | 5行目 |
| エラー種別 | ModuleNotFoundError |
| エラー詳細 | yfinance というモジュールが見つからない |
エラーの2大分類:構文エラーと実行時エラー
Pythonのエラーは大きく2種類に分類されます。
| 分類 | 発生タイミング | 代表例 |
|---|---|---|
| 構文エラー(SyntaxError) | コード実行前(解析段階) | SyntaxError, IndentationError |
| 実行時エラー(例外) | コード実行中 | ModuleNotFoundError, TypeError, KeyError |
構文エラーはPythonがコードを読み込む段階で検出されるため、該当行より先のコードは一切実行されません。実行時エラーは、該当箇所に到達した時点で初めて発生します。
エラーメッセージは「最後の行」から読む
Tracebackは上から下に向かって実行経路を表示しますが、最も重要な情報は最後の行にあります。エラーの種類と原因メッセージが記載されているため、まず最終行を確認し、次にファイル名・行番号を確認する習慣をつけてください。
構文エラー(SyntaxError)の原因と対処法
構文エラーはコードの「書き方」に問題がある場合に発生します。Pythonの文法ルールに違反しているコードは、実行前に弾かれます。
SyntaxError: invalid syntax
最も頻繁に遭遇する構文エラーです。原因は多岐にわたりますが、代表的なパターンは以下のとおりです。
- 括弧の閉じ忘れ
# NG: 括弧が閉じていない
print("Hello"
x = 10
- コロンの付け忘れ
# NG: if文の末尾にコロンがない
if x > 5
print("大きい")
- 全角スペースの混入
# NG: インデントに全角スペースが含まれている(見た目では判別困難)
def main():
print("Hello") # ←全角スペース
全角スペースの混入は目視で発見することが極めて困難です。VS Codeの「空白文字の表示」機能(設定で
editor.renderWhitespaceをallに変更)を有効にすることを強く推奨します。
IndentationError: unexpected indent
Pythonはインデント(字下げ)で構造を表現する言語です。インデントが不正な場合、このエラーが発生します。
よくあるパターン:
# NG: 不要なインデントがある
x = 10
y = 20 # ←この行の字下げが不正
対処のポイント:
- インデントにはスペース4つを使用する(Python公式推奨)
- タブとスペースを絶対に混在させない
- VS Codeの設定で
editor.insertSpacesをtrue、editor.tabSizeを4に設定する
SyntaxError: EOL while scanning string literal
文字列の引用符(クォート)が閉じられていない場合に発生します。
# NG: 文字列が閉じていない
message = "Hello, World
print(message)
対処法は、文字列の開始と終了で同じ種類の引用符を使用し、漏れなく閉じることです。複数行にまたがる文字列を扱う場合は、トリプルクォート(""")を使用してください。
実行時エラー(例外)の原因と対処法
ここからは、コードの実行中に発生するエラー(例外)を種類別に解説します。
ModuleNotFoundError: No module named ‘〇〇’
外部ライブラリが見つからない場合に発生する、初心者が最も遭遇するエラーです。
原因の切り分けチェックリスト:
- そもそもパッケージがインストールされていない
- pipとpythonが異なるバージョンを指している
- 仮想環境の有効化を忘れている
- パッケージ名のスペルが間違っている
対処法:
python -m pip install パッケージ名
python -m pip 形式を使えば、実行中のPythonに確実にパッケージがインストールされます。
パッケージ名とインポート名が異なるケースがあるため注意してください。例えば、
pip install Pillowでインストールし、コード内ではimport PILと記述します。
【コピペOK】ModuleNotFoundErrorの自動診断スクリプト
以下のスクリプトを diagnose_module.py として保存・実行すると、指定したパッケージのインストール状況を自動診断できます。
import subprocess
import sys
# ==============================
# モジュール診断スクリプト
# ==============================
CHECK_MODULES = ["yfinance", "pandas", "numpy", "requests", "openpyxl"]
def diagnose():
print("=== モジュール診断開始 ===")
print(f"Python: {sys.executable}n")
missing = []
for mod in CHECK_MODULES:
try:
__import__(mod)
print(f" [OK] {mod}")
except ImportError:
print(f" [NG] {mod} → インストールされていません")
missing.append(mod)
print()
if missing:
print(f"未インストール: {', '.join(missing)}")
print("以下のコマンドで一括インストールできます:")
print(f" python -m pip install {' '.join(missing)}")
else:
print("すべてのモジュールが正常にインストールされています。")
print("n=== 診断完了 ===")
if __name__ == "__main__":
diagnose()
TypeError: 型の不一致エラー
異なるデータ型を不正に組み合わせた場合に発生します。
# NG: 文字列と整数を直接結合しようとしている
age = 30
message = "年齢は" + age + "歳です"
対処法:
# OK: f文字列を使用する
age = 30
message = f"年齢は{age}歳です"
型の不一致に関するエラーパターンは以下のとおりです。
| エラーメッセージ | 原因 | 対処法 |
|---|---|---|
can only concatenate str to str |
文字列と数値を + で結合 |
f文字列または str() で変換 |
unsupported operand type(s) |
演算不可能な型同士の計算 | 型を確認し int() や float() で変換 |
argument of type 'NoneType' |
Noneに対して操作を実行 | 変数がNoneでないか事前チェック |
KeyError: 辞書やDataFrameのキーが存在しない
辞書(dict)やpandasのDataFrameに存在しないキー・カラム名を指定した場合に発生します。
# NG: 存在しないカラム名を指定
import pandas as pd
df = pd.DataFrame({"Open": [100], "Close": [105]})
print(df["Volume"]) # KeyError: 'Volume'
対処法:
アクセス前にキーの存在を確認する習慣をつけてください。
# OK: 存在確認を行う
if "Volume" in df.columns:
print(df["Volume"])
else:
print("Volumeカラムは存在しません")
FileNotFoundError: ファイルが見つからない
CSVファイルの読み込みなどで、指定したパスにファイルが存在しない場合に発生します。
確認すべきポイント:
- ファイル名のスペルミス(大文字・小文字の違いを含む)
- カレントディレクトリの位置(スクリプト実行時の作業ディレクトリ)
- 相対パスと絶対パスの混同
カレントディレクトリの確認方法:
import os
print(os.getcwd())
相対パス(
data/stock.csv)ではなく、絶対パス(C:Users<ユーザー名>projectsdatastock.csv)を指定すると、カレントディレクトリに依存しないコードになります。
ValueError: 値の変換に失敗した場合
文字列を数値に変換しようとして、変換不可能な値が含まれている場合に発生します。
# NG: 数値に変換できない文字列
price = int("1,500") # ValueError: invalid literal for int()
対処法:
# OK: カンマを除去してから変換
price = int("1,500".replace(",", ""))
エラーを未然に防ぐ防御的プログラミング
エラーが発生してから対処するだけでなく、エラーを事前に防ぐコーディング手法を身につけることが重要です。
try-except文による例外処理
エラーが発生する可能性があるコードは、try-except 文で囲むことで、プログラムの異常終了を防止できます。
import yfinance as yf
# ==============================
# 例外処理付きデータ取得
# ==============================
def safe_fetch(symbol):
try:
ticker = yf.Ticker(symbol)
df = ticker.history(period="5d")
if df.empty:
print(f"{symbol}: データが空です")
return None
print(f"{symbol}: {len(df)}件のデータを取得しました")
return df
except Exception as e:
print(f"{symbol}: エラーが発生しました → {type(e).__name__}: {e}")
return None
if __name__ == "__main__":
result = safe_fetch("7203.T")
if result is not None:
print(result.tail())
型チェックとNoneチェック
関数の戻り値がNoneになる可能性がある場合は、必ず使用前にチェックを行ってください。
data = safe_fetch("9999.T")
# NG: Noneの場合にエラーになる
# print(data.head())
# OK: Noneチェックを挟む
if data is not None:
print(data.head())
else:
print("データを取得できませんでした")
printデバッグの活用
デバッガを使う前に、print() 文を挟んで変数の値や型を確認する方法は、シンプルながら非常に有効です。
result = some_function()
print(f"[DEBUG] result = {result}")
print(f"[DEBUG] type = {type(result)}")
本番環境に移行する前に、デバッグ用の
よくあるエラーと対処法
「RecursionError: maximum recursion depth exceeded」と表示される
関数が自分自身を無限に呼び出し続けた場合に発生します。再帰処理を使用している場合は、終了条件(ベースケース)が正しく設定されているか確認してください。
再帰を意図していないのにこのエラーが出る場合は、関数名と変数名の衝突が原因であることが多いです。
# NG: 変数名listが組み込み関数listを上書きしている
list = [1, 2, 3]
new_list = list(range(10)) # TypeErrorになる
組み込み関数と同じ名前を変数名に使わないよう注意してください。
「PermissionError: [Errno 13] Permission denied」と表示される
Excelで開いているCSVファイルに書き込もうとした場合や、システムフォルダへのアクセス時に発生します。
対処法は以下のとおりです。
- 対象ファイルが他のアプリケーションで開かれていないか確認する
- 書き込み先をユーザーフォルダ内に変更する
- VS Codeやコマンドプロンプトを「管理者として実行」する(最終手段)
「UnicodeDecodeError: ‘utf-8’ codec can’t decode byte」と表示される
日本語を含むCSVファイルの読み込みで頻発するエラーです。ファイルのエンコーディングがUTF-8以外(Shift_JISなど)の場合に発生します。
import pandas as pd
# UTF-8で失敗する場合
# df = pd.read_csv("data.csv")
# エンコーディングを明示的に指定
df = pd.read_csv("data.csv", encoding="shift_jis")
日本語環境でExcelから出力したCSVはShift_JIS(cp932)になっていることが多いです。UTF-8で読めない場合は
encoding="cp932"を試してください。
まとめ
Pythonのエラー対処で最も重要なのは、エラーメッセージを恐れず、正しく読む習慣をつけることです。以下のステップで対処してください。
- エラーメッセージの最終行からエラーの種類と原因を読み取る
- ファイル名と行番号で発生箇所を特定する
- エラーの種類に応じた対処法を適用する
主要なエラーの対処法を改めて整理します。
- ModuleNotFoundError →
python -m pip install パッケージ名 - SyntaxError → 括弧・コロン・全角スペースを確認
- IndentationError → スペース4つに統一、タブと混在させない
- TypeError →
type()で型を確認し、適切に変換する - KeyError → アクセス前に
in演算子で存在確認する - FileNotFoundError →
os.getcwd()でカレントディレクトリを確認する
エラーへの対処能力は、コードを書く能力と同じくらい重要なスキルです。この記事を逆引きリファレンスとして活用し、エラー発生時に素早く原因を特定できるようになってください。次のステップとして、try-except文を活用したエラーに強いスクリプトの設計に進みましょう。

