バックテストの結果はかなり悪いですが、プログラムの流れだけつかんで頂ければと思い、ポピュラーな移動平均線のクロスを使ったルールで簡単に作ってみました。一応私はこのような形を基本にしてバックテスト用のプログラムを作ってますので参考にしてみて下さい。
バックテスト結果の「最低時損益計」はトレード期間中の損益計の最低値を記録したものです。もし最終的に利益が出たとしても保証金にこれだけの余裕がないとこのシステムが成立しないという目安として出してみました。
File01-MA5MA25 Excelファイルのダウンロード
■ バックテストルール
□ 期間は2004年〜2006年の3年間
□ 通貨はUSD/JPN
□ 5日移動平均線が25日移動平均線より上にきたら買い
□ 5日移動平均線が25日移動平均線より下にきたら売り
□ 終値の時点で売買サインが出ていたら翌日の始値で注文
□ スプレット、手数料は計算に入れない
■ バックテスト結果
□ 総トレード数 : 38回
□ 勝ちトレード数 : 15回
□ 負けトレード数 : 23回
□ 最低時損益計 : -847
□ 最終損益計 : -729
■ コード解説
□ 変数の宣言
まず日付、始値、高値、安値、終値の為替データと移動平均線データ格納用の変数を5000日分作りました。こんなに必要無いのですが後々カスタマイズしていくことも考えて多めに作っておきました(多くて困ることも無いので)。あと取引履歴を記録するための変数がトレード500回分です。x、y、zはFor〜Next構文を使う時とかのためにいつも入れてます。
□ 為替データを変数に読み込む
USDのワークシートを開いてFor〜Next構文を使って為替データを変数に格納します。数字と同じ行数のデータを読み込むことになります。例えばhiz(2)にはUSDシートの2行目の日付「2003/ 01/ 01」が入ります。(0)と(1)は使いません。
□ 移動平均線の計算
移動平均線を計算して変数に格納します。移動平均線の計算のために為替データは2003年から入れてあります。25日移動平均線なので本当は24日分でいいのですがこれも後々のことを考えて多めに1年分入れてあります。
□ 売買計算
売買計算の部分に損益計算を入れるか、それともワークシートに表示する時に計算するか、もしくは一々変数に格納しないでそのつどワークシートに表示していくか迷ったのですが、とりあえず分かり易いように損益計算まで入れました。あと最終日だけ別に計算しているのは最終日の終値でクローズして期間の正確な損益を出すためです。
xのFor〜Next構文で計算期間を一日ずつチェックしていき、買いまたは売りの条件を満たしたら取引履歴に記録していくといった流れです。注文時にzに+1を足していく方法で順番に記録していきます。つまりzは売買回数ということになります。
□ 計算結果をワークシートに表示
ここでもxでFor〜Next構文を使って取引履歴を順番にワークシートに表示していきます。変数posrecにはポジションを数値に置き換えて記録しているのでIf〜Then構文を使って「買い」「売り」の文字で表示します。最初から文字で変数に記録することもできるのですが、数値の方がスッキリして見やすいのでこのようにしました。
------- 以下コード -------------------------------------------------------------------------------------
Sub test()
'-----------------------------------------------------------------------
'変数の宣言
'-----------------------------------------------------------------------
Dim hiz(5000) As Date '日付データ
Dim ne1(5000) As Long '始値データ
Dim ne2(5000) As Long '高値データ
Dim ne3(5000) As Long '安値データ
Dim ne4(5000) As Long '終値データ
Dim m05(5000) As Long '5日平均線データ
Dim m25(5000) As Long '25日平均線データ
Dim posrec(500) As Integer '取引履歴 ポジション(1:買 -1:売 0:ノンポジ)
Dim hi1rec(500) As Date '取引履歴 注文時日付
Dim ra1rec(500) As Long '取引履歴 注文時レート
Dim hi2rec(500) As Date '取引履歴 決済時日付
Dim ra2rec(500) As Long '取引履歴 決済時レート
Dim so1rec(500) As Long '取引履歴 損益
Dim so2rec(500) As Long '取引履歴 損益計
Dim x As Long '雑計算用
Dim y As Long '雑計算用
Dim z As Long '雑計算用
'-----------------------------------------------------------------------
'為替データを変数に読み込む
'-----------------------------------------------------------------------
Worksheets("USD").Select 'USDシートを開く
For x = 2 To 5000
hiz(x) = Cells(x, 1).Value
ne1(x) = Cells(x, 2).Value
ne2(x) = Cells(x, 3).Value
ne3(x) = Cells(x, 4).Value
ne4(x) = Cells(x, 5).Value
Next x
'-----------------------------------------------------------------------
'移動平均線の計算
'-----------------------------------------------------------------------
For x = 263 To 1042
m05(x) = WorksheetFunction.Average(Range(Cells(x - 4, 5), Cells(x, 5)))
m25(x) = WorksheetFunction.Average(Range(Cells(x - 24, 5), Cells(x, 5)))
Next x
'-----------------------------------------------------------------------
'売買計算
'-----------------------------------------------------------------------
For x = 263 To 1041 'USDシートの263行目から1041行目までを計算
If posrec(z) <= 0 And m05(x) > m25(x) Then '買いサイン発生の場合
If posrec(z) = -1 Then '現在のポジションが売りの場合
hi2rec(z) = hiz(x + 1) '決済日付に翌日の日付を読み込む
ra2rec(z) = ne1(x + 1) '決済レートに翌日の始値を読み込む
so1rec(z) = ra1rec(z) - ra2rec(z) '損益計算
so2rec(z) = so2rec(z - 1) + so1rec(z) '損益計計算
End If
z = z + 1 '取引履歴を一行移動
posrec(z) = 1 '現在のポジションを売りにする
hi1rec(z) = hiz(x + 1) '注文日付に翌日の日付を読み込む
ra1rec(z) = ne1(x + 1) '注文レートに翌日の始値を読み込む
End If
If posrec(z) >= 0 And m05(x) < m25(x) Then '売りサイン発生の場合
If posrec(z) = 1 Then '現在のポジションが買いの場合
hi2rec(z) = hiz(x + 1) '決済日付に翌日の日付を読み込む
ra2rec(z) = ne1(x + 1) '決済レートに翌日の始値を読み込む
so1rec(z) = ra2rec(z) - ra1rec(z) '損益計算
so2rec(z) = so2rec(z - 1) + so1rec(z) '損益計計算
End If
z = z + 1 '取引履歴を一行移動
posrec(z) = -1 '現在のポジションを買いにする
hi1rec(z) = hiz(x + 1) '注文日付に翌日の日付を読み込む
ra1rec(z) = ne1(x + 1) '注文レートに翌日の始値を読み込む
End If
Next x
'--------最終日計算---------------------
If posrec(z) = 1 Then '現在のポジションが買いの場合
hi2rec(z) = hiz(1042) '最終日の日付を表示
ra2rec(z) = ne4(1042) '最終日のレートを表示
so1rec(z) = ra2rec(z) - ra1rec(z) '損益計算
so2rec(z) = so2rec(z - 1) + so1rec(z) '損益計計算
End If
If posrec(z) = -1 Then '現在のポジションが売りの場合
hi2rec(z) = hiz(1042) '最終日の日付を表示
ra2rec(z) = ne4(1042) '最終日のレートを表示
so1rec(z) = ra1rec(z) - ra2rec(z) '損益計算
so2rec(z) = so2rec(z - 1) + so1rec(z) '損益計計算
End If
'-----------------------------------------------------------------------
'計算結果をワークシートに表示
'-----------------------------------------------------------------------
Worksheets("HOME").Select 'HOMEシートを開く
For x = 1 To z
If posrec(x) = 1 Then 'ポジションが1の場合
Cells(x + 2, 1).Value = "買い" 'セルに「買い」と表示
End If
If posrec(x) = -1 Then 'ポジションが-1の場合
Cells(x + 2, 1).Value = "売り" 'セルに「売り」と表示
End If
Cells(x + 2, 2).Value = hi1rec(x) 'セルに注文日付を表示
Cells(x + 2, 3).Value = ra1rec(x) 'セルに注文レートを表示
Cells(x + 2, 4).Value = hi2rec(x) 'セルに決済日付を表示
Cells(x + 2, 5).Value = ra2rec(x) 'セルに決済レートを表示
Cells(x + 2, 6).Value = so1rec(x) 'セルに損益を表示
Cells(x + 2, 7).Value = so2rec(x) 'セルに損益計を表示
Next x
End Sub |
|