ITickerによるテクニカル分析検証例

ITickerのダウンロード

三点チャージ

はらみ線

チャネルブレイクアウト

曜日と株価

ゴールデンクロスとデッドクロス

検証:チャネルブレイクアウト
チャネルブレイクアウトはトレンドフォローのシステムとして広く知られているものです。
株価が設定した期間の最高値を上回った場合「買い」、設定した期間の最安値を下回ったら「売り」という手法です。
検索例
当日の終値が過去39日の最高値を上回った場合の検索例です。


シミュレーション例
[ウィザードでの設定例]
ITickerではウィザードを使って各項目を設定するだけで様々なシミュレーションを簡単に行うことが出来ます。
また、ユーザ定義でユーザ独自の判定条件を定義・設定することができます。


指標2領域の[設定]では下図のような買い条件として40日の最高値を求める関数を定義しています。
・上記 Sub UserDef0(hC, aRet) 〜 End Sub の中身です
'ここから
Dim aMax, aHi, i, cnt
Set aMax = ITCreateObjArrayData
Set aHi = ITCreateObjArrayData
aHi.SetHistData hC, "hi"
aMax.CalMax aHi, 39
cnt = hc.GetCnt()
aRet.Init cnt, 0
For i=39 To cnt-1
  If hC.GetClose(i) > aMax.GetData(i-1) Then
    aRet.SetData i, 1
  End If
Next
aMax.Release
aHi.Release
'ここまで
◎以下のような操作で上記コードをユーザ定義のエディット画面にコピーできます。
  1. マウスで「'ここから」〜「'ここまで」までを選択
  2. 右クリック→コピー(C)でクリップボードにコピー
  3. ユーザ定義を開く
  4. エディット画面上でマウス右クリック
  5. 貼り付け(P)を選択
指標3領域の[設定]では下図のような手仕舞い条件として20日の最安値を求める関数を定義しています。
・上記 Sub UserDef1(hC, aRet) 〜 End Sub の中身です
'ここから
Dim aMin, aLow, i, cnt
Set aMin = ITCreateObjArrayData
Set aLow = ITCreateObjArrayData
aLow.SetHistData hC, "low"
aMin.CalMin aLow, 19
cnt = hc.GetCnt()
aRet.Init cnt, 0
For i=19 To cnt-1
  If hC.GetClose(i) < aMin.GetData(i-1) Then
    aRet.SetData i, 1
  End If
Next
aMin.Release
aLow.Release
'ここまで
◎以下のような操作で上記コードをユーザ定義のエディット画面にコピーできます。
  1. マウスで「'ここから」〜「'ここまで」までを選択
  2. 右クリック→コピー(C)でクリップボードにコピー
  3. ユーザ定義を開く
  4. エディット画面上でマウス右クリック
  5. 貼り付け(P)を選択
上記設定を実行させた場合のチャート例です。
ウィザードのバックテストはシグナルが出た翌営業日の始値で売買を行います。


[スクリプトの作成例]
ウィザードを使用しないで、ユーザがスクリプトを作成して様々な処理を行うことも出来ます。
以下のサンプルスクリプトは、アイザワ証券のHPに掲載されている「(12)順張り=トレンドフォローの例」等を参考にさせてもらって、ITickerでの検証用スクリプトを作成してみました。
  • 売買ルールは以下の様にしています。
    • 売買シグナルの翌営業日の始値で売買
    • 新規に売買した後は、反対売買のシグナルが出るまで同じシグナルは無視して売買は行わない
  • シグナルの条件は以下の様にしています。
    • 新規
      • 買:当日の終値が、終値ベースで40日間の高値の場合
      • 売:当日の終値が、終値ベースで40日間の安値の場合
    • 返済
      • 買の売り返済:当日の終値が、終値ベースで20日間の安値の場合
      • 売の買い返済:当日の終値が、終値ベースで20日間の高値の場合
  • シグナルのマーキングを行います。
  • 売買した場合の取引値・日をラインで表示します。(利益時は緑線、損した時は赤線)
  • 最後に売買記録をダイアログで表示します。

こういった検証の場合、シグナルが出た後の反対売買のやり方によっても成績が大きく異なります。ここでは単純に20日後に反対売買を行っているだけです。ロスカットやルール変更・追加等、後は皆さんの工夫次第です。

◎以下のような操作を行えば、下記サンプルスクリプトがそのまま実行出来ます。
  1. マウスで「'//スクリプト開始」〜「'//スクリプト終わり」までを選択
  2. 右クリック→コピー(C)でクリップボードにコピー
  3. メモ帳などのテキストエディターに貼り付け
  4. 名前はなんでも構いませんが、拡張子を必ずitcにして保存。
    (*メモ帳で保存する場合は、ファイルの種類を必ず「すべてのファイル」に指定して拡張子itcを付けて保存して下さい。)
  5. ITickerからチャートを開き、をクリック。
  6. 選択のダイアログから保存したファイルを選択。
尚、売買判定期間を変えたい場合は、スクリプト中の以下の部分

Const TERM_START = 40 '新規売買の判定期間
Const TERM_RET = 20 '反対売買の判定期間

を変更するだけでOKです。

'//スクリプト開始
Option Explicit '変数の明示的な宣言を強制

'//////////////////////
'//関数の定義
'//
'期間内の最高値判定(最高値:True、以外:False)
Function BreakMax(term, index, hC)
    Dim j
    BreakMax = False
    If index-1 < term Then Exit Function

    For j=index-1 To index-Term Step -1
        If hC.GetClose(index) <= hC.GetClose(j) Then Exit Function
    Next
    BreakMax = True
End Function

'期間内の最安値の判定(最安値:True、以外:False)
Function BreakMin(term, index, hC)
    Dim j
    BreakMin = False
    If index-1 < term Then Exit Function

    For j=index-1 To index-Term Step -1
        If hC.GetClose(index) >= hC.GetClose(j) Then Exit Function
    Next
    BreakMin = True
End Function

'売買取引のライン引き、差額を返す
Function Trade(i0, i1, pL, hC)
    Dim x0, x1, y0, y1
    Dim col
    x0 = ITGetXPixelFromIndex(i0)
    y0 = hC.GetOpen(i0)
    x1 = ITGetXPixelFromIndex(i1)
    y1 = hC.GetOpen(i1)

    Trade = Round(y1 - y0, 3)
    If Trade > 0 Then
        col = RGB(0,196,0)
    ElseIf Trade < 0 Then
        col = RGB(255,0,0)
    Else
        col = RGB(0,0,255)
    End if

    '取引のライン引き
    pL.SetCnd ITAreaStock, ITStyleSolid, 2, ITModeCopypen
    pL.SetData x0, y0, x1, y1, True, col
End Function

'////////////////////////////
'// オブジェクト・変数の設定
'//
'テクニカル計算、チャート作成用
Dim hChart
Dim markBreak
Dim colBuy, colSell
colBuy = RGB(191,191,127)
colSell = RGB(191,191,255)

'//売買検証用
Dim index, indexStart
Dim nowStatus, fRecord
Dim strLog
Dim sum, diff
Dim cntWin, cntEven, cntLoss
Dim cntLine 'ライン線数の判定用
Const TERM_START = 40 '新規売買の判定期間
Const TERM_RET = 20 '反対売買の判定期間
Const LINE_MAX = 200 'ライン線の最大数
Const STATUS_SELL = -1
Const STATUS_BUY = 1
Const STATUS_IDLE = 0

'「ITCreateObjStdPen」はスクリプト内で一回しか設定できません。
ITCreateObjStdPen 1
Set markBreak = ITObjStdPen(0)

'「ITCreateLinePen」はスクリプト内で一回しか設定できません。
ITCreateObjLinePen LINE_MAX

'時系列データオブジェクトITObjHistDataを作成
Set hChart = ITCreateObjHistData

'///////////////////////////
'// テクニカル計算、チャート作成
'//
hChart.SetCurrentChart '現在開いているチャートの時系列データを取得

'ブレイクアウトマークの設定
markBreak.SetCnd ITAreaStock, ITChartBar2, ITStyleSolid, ITRosokuWidth , ITModeMaskpen

'////////////////////
'//売買検証
'//
nowStatus = STATUS_IDLE
strLog = "": cntLine = 0: sum = 0
cntWin =0: cntLoss = 0: cntEven = 0
For index = TERM_START-1 To hChart.GetCnt-1
    fRecord = False
    Select Case nowStatus
        Case STATUS_IDLE
            If BreakMax(TERM_START, index-1, hChart) = True Then
                '新規買
                nowStatus = STATUS_BUY
                indexStart = index
                markBreak.SetData index-1, 100, 0, True, colBuy
            ElseIf BreakMin(TERM_START, index-1, hChart) = True Then
                '新規売
                nowStatus = STATUS_SELL
                indexStart = index
                markBreak.SetData index-1, 100, 0, True, colSell
            End If
        Case STATUS_BUY
            If BreakMin(TERM_RET, index-1, hChart) = True Then
                '返済売
                nowStatus = STATUS_IDLE
                markBreak.SetData index-1, 100, 0, True, colSell
                If cntLine < LINE_Max Then
                    diff = Trade(indexStart, index, ITObjLinePen(cntLine), hChart)
                    cntLine = cntLine + 1
                    fRecord = True
                End If
            End If
        Case STATUS_SELL
            If BreakMax(TERM_RET, index-1, hChart) = True Then
                '返済買
                nowStatus = STATUS_IDLE
                markBreak.SetData index-1, 100, 0, True, colBuy
                If cntLine < LINE_Max Then
                    diff = Trade(index, indexStart, ITObjLinePen(cntLine), hChart)
                    cntLine = cntLine + 1
                    fRecord = True
                End If
            End If
    End Select

    '記録の追加
    If fRecord = True Then
        If diff > 0 Then
            cntWin = cntWin + 1
        ElseIf diff < 0 Then
            cntLoss = cntLoss + 1
        Else
            cntEven = cntEven + 1
        End if
        sum = sum + diff
        strLog = hChart.GetDate(index) & ": " & diff & vbNewLine & strLog
    End If
Next

ITDraw 'セットしたPenを画面に出力
strLog = "Loss: " & cntLoss & "回" & vbNewLine & strLog
strLog = "Even: " & cntEven & "回" & vbNewLine & strLog
strLog = "Win : " & cntWin & "回" & vbNewLine & strLog
strLog = "Total: " & sum & vbNewLine & strLog
ITMsgBox strLog '売買記録の表示
'//
'// スクリプト終わり 

[トップページへ戻る]