

Jさん、甘えないでください。あなたのその「無理」を解決するのが、森田佳佑氏の著書「エクセルで理想のシステムトレード 自動売買ロボット作成マニュアル」です。この本があれば、高価なソフトに頼らず、ExcelとVBAで自分だけの投資マシンを構築できます。
Excel VBAで過去10年分の株価データを1クリック取得する方法
株式市場の基本構造
日本における株式の取引は、主に株式会社日本取引所グループが運営する証券取引所で行われます。取引時間は前場と後場に分かれており、株価データはこれらの取引所における実際の売買によって日々形成されます。取得するデータの信頼性は、そのデータソースに大きく依存します。

え、過去10年分の株価データって、手作業で集めるのめちゃくちゃ大変だよね?何日かかるんだよ…。

ふふ、Jさん。その手間から解放されるのがVBAの力です。本書で紹介されている「反復データ取得ロジック」を活用すれば、Webサイトにアクセスするだけで、過去10年分もの膨大な株価データを自動でExcelシートに取り込むことが可能です。

通常、Web上の株価データサイトでは、直近の数日分しか表示されないことが多いです。しかし、「エクセルで理想のシステムトレード」で紹介されている手法は、Yahoo!ファイナンスのようなサイトのURL構造をVBAで解析し、日付パラメータを自動で書き換える「For構文」を組み合わせます。
これにより、まるで人間が手作業で日付を変更しながらデータをダウンロードしているかのように、膨大な過去データを効率的に収集できるのです。
Jさんはこの話を聞いて、半信半疑ながらも早速VBAを記述してみました。
【VBAデータ取得の簡易手順】
1. Excelを開き、「開発」タブから「Visual Basic」をクリック(開発タブがない場合はオプションから表示設定)
2. 「挿入」→「標準モジュール」を選択
3. 以下のVBAコードをコピー&ペースト
4. 実行ボタン(▶︎)をクリック(所要時間:銘柄と期間によるが、10年分で約数分〜10分程度)
Sub GetHistoricalStockData()
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Dim stockCode As String
Dim startDate As String
Dim endDate As String
Dim url As String
' データ出力シートを指定
Set ws = ThisWorkbook.Sheets("Sheet1")
' 銘柄コード、開始日、終了日を設定(例:日経平均、2014/04/01〜2024/04/26)
stockCode = "998407.O" ' Yahoo Finance Japan の日経平均コード
startDate = "20140401"
endDate = "20240426"
' URLを生成 (Yahoo Finance Japan の例)
' 実際にはサイトの仕様に合わせてURLパラメータを調整
url = "https://query1.finance.yahoo.com/v7/finance/download/" & stockCode & _
"?period1=" & DateToUnix(CDate(Left(startDate, 4) & "/" & Mid(startDate, 5, 2) & "/" & Right(startDate, 2))) & _
"&period2=" & DateToUnix(CDate(Left(endDate, 4) & "/" & Mid(endDate, 5, 2) & "/" & Right(endDate, 2))) & _
"&interval=1d&events=history&includeAdjustedClose=true"
' データをシートに直接取り込み
With ws.QueryTables.Add(Connection:="URL;" & url, Destination:=ws.Range("A1"))
.FieldNames = True
.RowNumbers = False
.FillAdjacentCells = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.WebSelectionType = xlEntirePage
.WebFormatting = xlWebFormattingNone
.WebPreFormattedTextToColumns = True
.WebConsecutiveDelimitersAsOne = True
.WebSingleBlockTextImport = False
.WebDisableDateRecognition = False
.WebDisableRedirections = False
.Refresh BackgroundQuery:=False
End With
MsgBox "株価データの取得が完了しました!", vbInformation
End Sub
' 日付をUnixタイムスタンプに変換する関数
Function DateToUnix(ByVal TargetDate As Date) As Long
DateToUnix = DateDiff("s", "1970/1/1", TargetDate)
End Function
【コードの各行解説】
- `Sub GetHistoricalStockData()`: 株価データを取得するメインのプロシージャ。
- `Set ws = ThisWorkbook.Sheets(“Sheet1”)`: データを出力するシートを指定。
- `stockCode = “998407.O”`: 取得したい銘柄のYahoo!ファイナンスコード(例: 日経平均)。
- `startDate = “20140401”`, `endDate = “20240426”`: データ取得期間を指定。
- `url = …`: Yahoo!ファイナンスのヒストリカルデータダウンロードURLを構築。
- `With ws.QueryTables.Add(…)`: 指定したURLからWebクエリを使ってデータをExcelシートに取り込む。
- `DateToUnix(ByVal TargetDate As Date) As Long`: 日付形式をUnixタイムスタンプに変換する補助関数。Yahoo!ファイナンスのAPIがこの形式を要求するため。
VBAによるデータ取得は、投資判断を「勘」から「データ」に基づくものへと進化させる第一歩です。手作業では不可能な広範囲のデータ収集が、1クリックで可能になります。
Jさんは、実際にコードを貼り付けて実行してみたところ、本当に数分で過去10年分の株価データがシートに表示され、思わず「おぉ!」と声を上げました。
2024年に入り日経平均が一時4万円を突破したような急激な市場変動時、過去のバブル崩壊やリーマンショック後の回復期など、様々な相場局面で特定の銘柄がどのような値動きをしたかを検証したい場合があるでしょう。
手作業で10年分のデータを集めるのは非現実的ですが、このロジックを組んでいれば、瞬時に必要なデータを揃え、「もしあの時、この銘柄に投資していたらどうなっていたか」といった仮説検証の精度を格段に上げることができたかもしれません。

これはすごい!これで過去のデータが手に入ったぞ!じゃあ次は、このデータを使って色々な分析ができるってことかな?

その通りです。膨大なデータが手に入れば、次は「分析」です。Excel VBAは、テクニカル指標の自動計算も得意とします。
Excel VBAでテクニカル指標を自動計算!相場の変化を素早く察知する

移動平均線とかMACDとか、毎日計算するの面倒なんだよね。しかも、期間を変えて試すとなると…考えただけで頭が痛いよ。

ごもっともです。テクニカル分析は多くの投資家が利用しますが、手計算や手動でのグラフ作成は非常に手間がかかります。しかし、本書で紹介されているVBAを使えば、そうした手間は一切不要になります。

「エクセルで理想のシステムトレード」では、VBAで「配列」を使い複数の期間設定を一括で管理したり、EMA(指数平滑移動平均)のような高度な指標も自動で算出する具体的なコードが紹介されています。これにより、日々の株価変動に合わせて、常に最新のテクニカル指標をExcel上で確認できるようになるのです。
Jさんは、この機能の実装に挑戦し、わずか数行のコードで、それまで数十分かかっていた計算とグラフ化が瞬時に終わることに感動しました。
Sub CalculateMovingAverages()
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long, j As Long
Dim closePrice As Range
Dim maRange As Range
Dim maPeriods As Variant
' データが入力されているシートを指定
Set ws = ThisWorkbook.Sheets("Sheet1")
lastRow = ws.Cells(ws.Rows.Count, "D").End(xlUp).Row ' D列(終値)の最終行を取得
' 移動平均の計算期間を指定 (配列で複数指定可能)
maPeriods = Array(5, 25, 75) ' 5日、25日、75日移動平均
' 終値の範囲を設定
Set closePrice = ws.Range("D2:D" & lastRow) ' D列が終値の想定
' 移動平均を計算して出力
For j = LBound(maPeriods) To UBound(maPeriods)
Dim currentPeriod As Long
currentPeriod = maPeriods(j)
' 移動平均の出力列を指定 (例: E列から順に)
Set maRange = ws.Cells(1, 5 + j) ' E1, F1, G1...
maRange.Value = "MA(" & currentPeriod & ")" ' ヘッダー
For i = 2 To lastRow
If i >= currentPeriod + 1 Then
' WorksheetFunction.Average で移動平均を計算
maRange.Offset(i - 1, 0).Value = Application.WorksheetFunction.Average( _
ws.Range("D" & i - currentPeriod + 1 & ":D" & i))
End If
Next i
Next j
MsgBox "移動平均の計算が完了しました!", vbInformation
End Sub
【コードの各行解説】
- `Sub CalculateMovingAverages()`: 移動平均を計算するプロシージャ。
- `lastRow = ws.Cells(ws.Rows.Count, “D”).End(xlUp).Row`: D列(終値)の最終行を検出。
- `maPeriods = Array(5, 25, 75)`: 計算したい移動平均の期間を配列で指定。
- `Set closePrice = ws.Range(“D2:D” & lastRow)`: 終値データのある範囲を指定。
- `For j = LBound(maPeriods) To UBound(maPeriods)`: 指定した期間ごとにループ処理。
- `maRange.Value = “MA(” & currentPeriod & “)”`: 各移動平均の列にヘッダーを追加。
- `Application.WorksheetFunction.Average(…)`: ExcelのAVERAGE関数をVBAで呼び出し、移動平均を計算。
この自動計算機能により、日々のデータ更新で手動でチャートを書き換える手間から解放されます。Jさんは、2023年から2024年にかけてのAI株急騰期のように、特定のセクターが急速にトレンドを形成するような局面で、移動平均線のゴールデンクロスやMACDの買いシグナルといった兆候をいち早く捉えることが重要だと実感しました。もしこの自動計算機能を活用していれば、トレンドの初期段階で素早くシグナルを検知し、市場の波に乗る機会を逃さずに済んだかもしれません。感情に左右されず、常に最新のデータに基づいたテクニカル分析結果で、冷静な投資判断を下す力が身につきます。
「自分だけの売買ルール」を過去データで検証するバックテストの威力

せっかくデータと指標が揃ったんだから、俺の「高値掴みしない必勝法」が本当に通用するのか知りたいよ!でも、過去10年分を手動で検証するなんて、気が遠くなる作業だ…。

Jさん、甘いですね。ほとんどの投資家は「このルールで勝てるはずだ」という仮説を持っていても、実際に過去の相場でどうだったかを手間をかけて検証することは稀です。そこで必要になるのが「バックテスト」です。
「エクセルで理想のシステムトレード」では、独自の売買ルールをVBAでプログラミングし、過去の膨大なデータでバックテストを行うことで、そのルールの有効性を客観的に評価し、自信を持って投資に臨めるようになります。
本書では、「3本足の高値安値」や「アンチ」といった具体的な売買手法をVBAでロジック化し、過去10年分のデータを使って勝率やリスクリターンを自動で算出する機能の構築方法が解説されています。これにより、机上の空論ではない、データに基づいた「使えるルール」を見極めることができるのです。

Jさんは、これまでの自身の「勘」に頼った売買ルールをVBAに落とし込み、バックテストを試みました。すると、意外な結果が…。
「あれ?このルール、〇〇%の確率で利益が出てるぞ!でも、この条件下だと損も大きいな…」
今まで漠然と「良い」と思っていたルールが、数値として可視化されたことで、改善点やリスクが明確になりました。
Sub BacktestStrategy()
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Dim buySignal As Boolean
Dim totalProfit As Double
Dim tradeCount As Long
Dim wins As Long, losses As Long
Dim entryPrice As Double
Dim exitPrice As Double
Set ws = ThisWorkbook.Sheets("Sheet1")
lastRow = ws.Cells(ws.Rows.Count, "D").End(xlUp).Row ' D列(終値)の最終行を取得
totalProfit = 0
tradeCount = 0
wins = 0
losses = 0
buySignal = False ' 買いシグナル発生中フラグ
' バックテストのロジック (例: 5日移動平均が25日移動平均を上回ったら買い、下回ったら売り)
' E列に5日MA、F列に25日MAがあると仮定
For i = 2 To lastRow
If ws.Cells(i, "E").Value > ws.Cells(i, "F").Value And Not buySignal Then
' ゴールデンクロスで買いシグナル
buySignal = True
entryPrice = ws.Cells(i, "D").Value ' 終値でエントリー
' Debug.Print "買いシグナル発生: " & ws.Cells(i, "A").Value & ", 価格: " & entryPrice
ElseIf ws.Cells(i, "E").Value < ws.Cells(i, "F").Value And buySignal Then
' デッドクロスで売りシグナル (保有ポジションを決済)
buySignal = False
exitPrice = ws.Cells(i, "D").Value ' 終値でエグジット
tradeCount = tradeCount + 1
Dim profit As Double
profit = exitPrice - entryPrice
totalProfit = totalProfit + profit
If profit > 0 Then
wins = wins + 1
Else
losses = losses + 1
End If
' Debug.Print "売りシグナル発生: " & ws.Cells(i, "A").Value & ", 価格: " & exitPrice & ", 損益: " & profit
End If
Next i
' 結果表示
ws.Cells(lastRow + 2, 1).Value = "バックテスト結果"
ws.Cells(lastRow + 3, 1).Value = "総利益:"
ws.Cells(lastRow + 3, 2).Value = Format(totalProfit, "#,##0")
ws.Cells(lastRow + 4, 1).Value = "総トレード数:"
ws.Cells(lastRow + 4, 2).Value = tradeCount
ws.Cells(lastRow + 5, 1).Value = "勝率:"
ws.Cells(lastRow + 5, 2).Value = Format(wins / tradeCount, "0.00%") & " (" & wins & "/" & losses & ")"
MsgBox "バックテストが完了しました!", vbInformation
End Sub
【コードの各行解説】
- `Sub BacktestStrategy()`: バックテストを行うプロシージャ。
- `totalProfit`, `tradeCount`, `wins`, `losses`: バックテスト結果を記録するための変数。
- `buySignal`: 現在買いポジションを保有しているかを示すフラグ。
- `For i = 2 To lastRow`: 株価データの各行をループ処理。
- `If ws.Cells(i, “E”).Value > ws.Cells(i, “F”).Value And Not buySignal Then`: 5日移動平均が25日移動平均を上回ったら「買いシグナル」とし、エントリー価格を記録。
- `ElseIf ws.Cells(i, “E”).Value < ws.Cells(i, "F").Value And buySignal Then`: 5日移動平均が25日移動平均を下回ったら「売りシグナル」とし、エグジット価格を記録して損益を計算。
- `MsgBox “バックテストが完了しました!”, vbInformation`: バックテスト完了メッセージと結果をExcelシートに出力。
📚 この記事のテーマをまとめた完全ガイド: 株とFXどっちが初心者向け?ゼロから始める比較・ルール・実践完全ガイド
バックテスト結果はあくまで過去のデータに基づいたものであり、未来の利益を保証するものではありません。しかし、ルールの優位性やリスクを測る上で不可欠なプロセスです。このプロセスを通じて、自分の投資アイデアに客観的な裏付けを与えることで、不安や迷いを減らし、自信を持って相場に立ち向かうための「羅針盤」を手に入れられます。2024年8月に一部で発生した暴落局面のような予期せぬ市場の混乱時、あるいはドル円が160円を突破したような為替市場の激変時でも、「自分の売買ルールがこうした状況でどのように機能したか」を事前にバックテストで検証していれば、狼狽売りを防ぎ、冷静な対応を取ることができたかもしれません。
楽天証券(マーケットスピード / RSS)
本書でもリアルタイムデータ取得のサンプルとして指定されています。API連携により、Excelへリアルタイムに近い株価データを引き込むことが可能です。
「エクセルで理想のシステムトレード」を試してみたい方へ

僕みたいに、手作業での分析に限界を感じてる人には、この本は救世主かもしれないね!

まさにその通りです。今回ご紹介した内容は本書のほんの一部。データ取得からバックテスト、さらにはリアルタイムデータ連携や自動発注の考え方まで、実践的な内容が網羅されています。
おすすめポイント
- 高価なソフト不要でシステムトレード環境を構築
- VBA初心者でも安心、丁寧なコード解説
- 過去データに基づいた客観的な売買ルール検証
こんな人向け
- 手作業での投資分析に限界を感じている人
- 自分だけのオリジナルの投資戦略を作りたい人
- プログラミングで投資を効率化したい人
「エクセルで理想のシステムトレード」はこんな方におすすめ:Excelを単なる表計算ソフトではなく、強力な投資ツールへと進化させたい方。
こんな不安はありませんか?
- 「VBAなんて難しそう」→ 本書は初心者向けに基礎から丁寧に解説されています。コピペで使えるコードも多数掲載。
- 「本当に利益が出るの?」→ バックテストはあくまで過去検証。未来の利益を保証するものではありませんが、優位性のあるルールを構築するための強力なツールです。
- 「古い情報ではないか」→ VBAの基礎は普遍的で、Excelのバージョン依存も少ないため、現在でも十分実践可能です。
※本記事はアフィリエイトリンクを含んでいます。リンク経由でご購入いただいた場合、当サイトに報酬が発生することがあります。
本書で学んだパターン認識を試すなら、TradingView を開くのが手早いです。
※ 解約はワンクリック・いつでもOK
今すぐできるアクション

で、結局今日から何をやればいいの?

3ステップで始められますよ。まず、今日紹介した本の冒頭を読んでみてください!
1. ステップ1: Amazonで「エクセルで理想のシステムトレード 自動売買ロボット作成マニュアル」の「試し読み」をチェックする(所要時間: 5分)
2. ステップ2: パソコンでExcelを開き、「開発」タブを表示させる(所要時間: 3分)
3. ステップ3: 上記で紹介したVBAコードをコピー&ペーストし、実際に株価データ取得を試してみる(所要時間: 15分)
【免責・広告表示】本記事はアフィリエイトプログラムに参加しており、リンク経由でご購入・口座開設いただいた場合に報酬が発生することがあります。本記事は投資の学習・情報収集を目的としており、特定の金融商品への投資を勧誘するものではありません。過去のデータや事例は将来の成果を保証するものではありません。株式・ETF・投資信託等への投資には元本割れリスクがあります。投資の最終判断はご自身の責任で行ってください。
コメント