※本記事のコードや情報は執筆時点の仕様に基づいています。投資は自己責任であり、必ずデモ環境や少額資金でテストした上で運用してください。
「株のアルゴリズム取引を自分で作ってみたい。でもプログラミングは未経験で、何から始めればいいのかわからない」——こうした悩みを抱える個人投資家は非常に多いです。高額な自動売買ツールを買う必要はありません。Pythonという無料のプログラミング言語と、無料の株価データライブラリさえあれば、今日からアルゴリズム取引の第一歩を踏み出すことができます。
この記事では、プログラミング完全未経験の状態から、Pythonで株のアルゴリズム取引ロジックを自作するまでの道のりを体系的に解説します。環境構築、基本文法の最低限の知識、そしてコピペで動くバックテストコードまでを一本にまとめています。
そもそもアルゴリズム取引とは何か
コードを書き始める前に、アルゴリズム取引の基本概念を正確に理解しておく必要があります。
アルゴリズム取引の定義と仕組み
アルゴリズム取引とは、あらかじめプログラムに書き込んだ売買ルールに従って、コンピュータが自動的に取引判断を行う手法です。
たとえば「5日移動平均線が25日移動平均線を上抜けたら買い、下抜けたら売り」というルールをPythonで記述すれば、過去データに対してそのルールが有効だったかを検証(バックテスト)できます。さらにAPI対応の証券口座と組み合わせれば、実際の発注まで自動化することも可能です。
なぜ個人投資家にアルゴリズム取引が有効なのか
裁量トレード(手動取引)と比較したとき、アルゴリズム取引には明確な優位性があります。
| 比較項目 | 裁量トレード | アルゴリズム取引 |
|---|---|---|
| 感情の影響 | 大きい(損切りできない等) | ゼロ |
| 判断の一貫性 | 日によってブレる | 常に同一ルールで判断 |
| 検証可能性 | 記憶頼りで曖昧 | 過去データで定量的に検証可能 |
| 稼働時間 | 画面に張り付く必要あり | 自動で24時間監視可能 |
アルゴリズム取引の最大の価値は「感情の排除」と「再現性」にあります。同じルールを何度でも、何年分のデータに対しても繰り返しテストできるため、戦略の良し悪しを客観的に評価できます。
アルゴリズム取引の全体像:4つのステップ
初心者がアルゴリズム取引を自作する場合、以下の4ステップで進めるのが最も効率的です。
- 環境構築: Pythonと必要なライブラリをインストールする
- データ取得: 株価の過去データをプログラムで取得する
- ロジック構築: 売買ルールをコードで記述する
- バックテスト: 過去データでルールの有効性を検証する
この記事では、この4ステップを順番に解説していきます。
ステップ1:Python環境を構築する
プログラミング未経験者にとって最初の壁は「環境構築」です。しかし、実際には10分程度で完了します。
Pythonのインストール方法
Pythonは公式サイト(python.org)から無料でダウンロードできます。インストール時に注意すべき点は1つだけです。
- インストーラーの最初の画面で 「Add Python to PATH」にチェックを入れる
これを忘れると、コマンドプロンプトやターミナルからPythonを呼び出せなくなります。
推奨バージョンはPython 3.10以上です。
必要なライブラリのインストール
Pythonをインストールしたら、コマンドプロンプト(Windows)またはターミナル(Mac)を開き、以下のコマンドを実行します。
pip install yfinance pandas
それぞれの役割は以下のとおりです。
| ライブラリ | 役割 | 料金 |
|---|---|---|
| yfinance | 世界中の株価データを取得するライブラリ | 無料 |
| pandas | データの加工・分析を行うライブラリ | 無料 |
この2つだけで、株価データの取得からバックテストまで一通りの作業が可能となります。追加の有料ツールは一切不要です。
エディタ(コードを書く場所)の選び方
Pythonコードを書くためのエディタは、以下のいずれかを推奨します。
- VS Code(Visual Studio Code): 無料。拡張機能が豊富で、Python開発に最も広く使われています
- Google Colab: ブラウザ上でPythonを実行できる無料サービス。インストール不要で始められるため、最初の一歩として最適です
初心者はまずGoogle Colabで動かしてみて、慣れてきたらVS Codeに移行するのが効率的な進め方です。
ステップ2:株価データを取得する
環境構築が完了したら、次は実際に株価データを取得するコードを書いてみます。
【コピペOK】はじめての株価データ取得
以下のコードをそのままコピペして実行すれば、トヨタ自動車の過去1年分の株価データが取得できます。
import yfinance as yf
# ==============================
# 設定エリア
# ==============================
SYMBOL = "7203.T" # 銘柄コード(トヨタ自動車)
# ==============================
# データ取得
# ==============================
ticker = yf.Ticker(SYMBOL)
df = ticker.history(period="1y")
# 結果の確認
print(f"■ {SYMBOL} の株価データ(直近5日分)")
print(df.tail())
print(f"\n■ データ件数: {len(df)}行")
実行すると、日付・始値・高値・安値・終値・出来高が表形式で表示されます。このデータがアルゴリズム取引のすべての土台となります。
取得データの構造を理解する
yfinanceで取得できるデータの各列の意味は以下のとおりです。
| 列名 | 意味 | 用途 |
|---|---|---|
| Open | 始値 | 寄付きの価格 |
| High | 高値 | その日の最高価格 |
| Low | 安値 | その日の最安価格 |
| Close | 終値 | その日の最終価格(分析の基本) |
| Volume | 出来高 | 取引された株数 |
アルゴリズム取引では、主にClose(終値)を使って移動平均やRSIなどのテクニカル指標を計算します。
銘柄コードの指定方法
日本株をyfinanceで取得する際は、証券コードの末尾に `.T`(東証を示すサフィックス)を付ける必要があります。
- トヨタ自動車:`7203.T`
- ソニーグループ:`6758.T`
- ソフトバンクグループ:`9984.T`
`.T` を付け忘れるとデータが取得できないため注意が必要です。
ステップ3:売買ロジックを構築する
データ取得ができたら、いよいよ売買ルールをコードで記述します。初心者が最初に取り組むべきは「移動平均クロス戦略」です。
移動平均クロス戦略の仕組み
移動平均クロス戦略は、2本の移動平均線の交差をシグナルとして売買を行うシンプルな手法です。
- ゴールデンクロス(買いシグナル): 短期移動平均線が長期移動平均線を下から上に抜ける
- デッドクロス(売りシグナル): 短期移動平均線が長期移動平均線を上から下に抜ける
一般的には、短期線を5日、長期線を25日に設定するケースが多くなっています。
なぜ初心者に移動平均クロスが適しているのか
数あるテクニカル指標の中で、移動平均クロスを最初に学ぶべき理由は明確です。
- 計算が単純: 「過去N日間の終値の平均」を求めるだけ
- コード量が少ない: 10行程度のPythonコードで実装可能
- 視覚的に理解しやすい: チャートに線を引くだけで売買タイミングが見える
- 応用範囲が広い: 他の指標(RSI、MACDなど)と組み合わせやすい
ステップ4:バックテストで戦略を検証する
売買ロジックが完成したら、それを過去データに適用して「もし過去にこのルールで取引していたら、どうなっていたか」を検証します。これがバックテストです。
【コピペOK】移動平均クロス戦略の完全バックテストコード
以下のコードは、移動平均クロス戦略を過去2年分のデータに適用し、リターンを市場平均(買い持ち)と比較するものです。
import yfinance as yf
import pandas as pd
# ==============================
# 設定エリア(自由に変更可能)
# ==============================
SYMBOL = "7203.T" # 銘柄コード
PERIOD = "2y" # データ取得期間
SHORT_WINDOW = 5 # 短期移動平均(日数)
LONG_WINDOW = 25 # 長期移動平均(日数)
INITIAL_CAPITAL = 1000000 # 初期資金(円)
# ==============================
# バックテスト実行
# ==============================
def run_backtest():
print(f"=== {SYMBOL} バックテスト開始 ===\n")
# データ取得
ticker = yf.Ticker(SYMBOL)
df = ticker.history(period=PERIOD)
if df.empty:
print("エラー: データが取得できませんでした。銘柄コードを確認してください。")
return
# 移動平均の計算
df["SMA_short"] = df["Close"].rolling(window=SHORT_WINDOW).mean()
df["SMA_long"] = df["Close"].rolling(window=LONG_WINDOW).mean()
df.dropna(inplace=True)
# シグナル生成(短期 > 長期 → 買い)
df["signal"] = 0
df.loc[df["SMA_short"] > df["SMA_long"], "signal"] = 1
df.loc[df["SMA_short"] <= df["SMA_long"], "signal"] = -1
# 翌日に執行する想定
df["position"] = df["signal"].shift(1)
df.dropna(inplace=True)
# リターン計算
df["market_return"] = df["Close"].pct_change()
df["strategy_return"] = df["market_return"] * df["position"]
df.dropna(inplace=True)
# 累積リターン
df["cum_market"] = (1 + df["market_return"]).cumprod()
df["cum_strategy"] = (1 + df["strategy_return"]).cumprod()
# 結果出力
mkt_ret = round((df["cum_market"].iloc[-1] - 1) * 100, 2)
str_ret = round((df["cum_strategy"].iloc[-1] - 1) * 100, 2)
final_val = round(INITIAL_CAPITAL * df["cum_strategy"].iloc[-1])
# 取引回数
df["trade_flag"] = df["position"].diff().abs()
trades = int(df["trade_flag"].sum())
# 最大ドローダウン
df["cum_max"] = df["cum_strategy"].cummax()
df["drawdown"] = (df["cum_strategy"] - df["cum_max"]) / df["cum_max"]
max_dd = round(df["drawdown"].min() * 100, 2)
print(f"■ 検証期間: {df.index[0].date()} 〜 {df.index[-1].date()}")
print(f"■ 市場リターン(買い持ち) : {mkt_ret}%")
print(f"■ 戦略リターン(MAクロス) : {str_ret}%")
print(f"■ 最終資産額 : {final_val:,}円")
print(f"■ 総取引回数 : {trades}回")
print(f"■ 最大ドローダウン : {max_dd}%")
# CSV保存
filename = f"{SYMBOL}_backtest_result.csv"
df.to_csv(filename)
print(f"\n--- 結果保存完了: {filename} ---")
if __name__ == "__main__":
run_backtest()
バックテスト結果の読み方
コードを実行すると表示される各指標の意味は以下のとおりです。
| 指標 | 意味 | 初心者が注目すべきポイント |
|---|---|---|
| 市場リターン | 同期間に株を買って持ち続けた場合のリターン | 戦略の比較基準(ベンチマーク) |
| 戦略リターン | アルゴリズムに従って取引した場合のリターン | 市場リターンを上回れば有効性あり |
| 最終資産額 | 初期資金が最終的にいくらになったか | 実感を持つための数字 |
| 総取引回数 | 売買が発生した回数 | 多すぎると手数料負けのリスク |
| 最大ドローダウン | 資産のピークからの最大下落率 | リスク耐性の指標。-20%以下は要注意 |
戦略リターンが市場リターンを上回っていても、最大ドローダウンが大きすぎる場合は危険です。 リターンだけでなくリスクも必ず確認する習慣をつけることが重要です。
初心者が陥りやすい3つの落とし穴
コードが動くようになった段階で、多くの初心者が同じ失敗をします。ここではその代表的な3つを解説します。
過剰最適化(カーブフィッティング)
バックテストのパラメータを過去データに合わせて際限なく調整すると、「過去には完璧に機能するが未来にはまったく通用しないロジック」が出来上がります。
対策として有効なのは以下の方法です。
- データを「学習期間」と「検証期間」に分ける
- パラメータの組み合わせはシンプルに保つ
- 複数の銘柄・複数の期間でテストする
手数料とスリッページの無視
バックテストでは手数料ゼロで計算してしまいがちですが、実際の取引では以下のコストが発生します。
- 売買手数料: 証券会社に支払うコスト
- スリッページ: 注文価格と約定価格のずれ
- スプレッド: 売値と買値の差額
取引回数が多い戦略ほど、これらのコストが利益を侵食します。
いきなり実資金で運用する
バックテストの結果に興奮して、すぐに大きな資金を投入するのは最も危険な行動です。以下の段階を踏むことを推奨します。
- 過去データでのバックテスト(本記事の範囲)
- デモ口座またはペーパートレードでの検証
- 少額資金(失っても生活に影響しない額)での実運用
- 結果を検証し、問題がなければ徐々に増額
よくあるエラーと対処法
「ModuleNotFoundError: No module named ‘yfinance’」と表示される
ライブラリがインストールされていないことが原因です。以下のコマンドで解決します。
pip install yfinance
Google Colabの場合は、セルの先頭に `!pip install yfinance` と記述して実行してください。
データが「0行」しか取得できない
原因として最も多いのは、銘柄コードの指定ミスです。
- 日本株は末尾に `.T` を付ける(例:`7203.T`)
- 上場廃止銘柄はデータが存在しない
- 市場が休場中の場合は直近データが更新されていない可能性がある
バックテストの結果が異常に良すぎる
戦略リターンが年率100%を超えるような結果が出た場合は、コードにバグがある可能性が高いです。よくある原因は以下のとおりです。
- シグナル生成に当日の終値を使い、当日に約定したことになっている(未来データの参照)
- `shift(1)` による翌日執行の処理が抜けている
- 手数料・スリッページを考慮していない
まとめ
プログラミング未経験から株のアルゴリズム取引を自作するためのロードマップを整理します。
- アルゴリズム取引とは、事前に定義したルールに基づきコンピュータが売買判断を行う手法です
- 必要なものはPython(無料)とyfinance(無料)の2つだけです
- 初心者が最初に実装すべきは移動平均クロス戦略です
- バックテストではリターンだけでなく最大ドローダウン(リスク)も必ず確認してください
- 過剰最適化・手数料の無視・いきなりの実資金投入は初心者が陥る3大ミスです
今回のバックテストコードを出発点として、次のステップではRSIやボリンジャーバンドなどの指標を追加したり、複数銘柄でのポートフォリオ戦略に挑戦したりするのが効果的です。焦らず、まずは過去データ上で何十回もテストを繰り返すことが、将来の利益につながる最も確実な投資となります。

