ExcelVBAでストキャスティクスを計算する

前回までExcelVBAで単純移動平均線、ボリンジャーバンド、MACD、一目均衡表、RSIの計算を紹介しました。

今回はテクニカル分析のストキャスティックスをVBAを使って計算する方法を紹介します。
ストキャスティックスは%K、%D、Slow%Dの5つの線からなる指標です。
各線は0~100の範囲で表すことができ、一般的に数値が小さい(一般的には20%以下)ほど売られすぎ、大きいほど買われ過ぎ(一般的には80%以下)となります。

%Kと%Dの組み合わせをファーストストキャスティクス、%KとSlow%Dの組み合わせをスローストキャスティクスと言います。
ファーストストキャスティクスは反応は早いがダマシも多い、スローストキャスティクスは反応は遅いがダマシが少ないと言われています。

%Kと%D(Slow%D)の2本の線が20以下でゴールデンクロスで買ったり、2本の線が80%以上でデッドクロスで売ったりするなどの使い方があります。

前準備

分析データの準備

まずは、分析する株価または為替のデータを準備する必要があります。

日経平均ならばこちらからCSVデータをダウンロードすることができます。もし、手元に分析したいデータがなければ、こちらで1年間程度の日足のデータを準備してください。

シートにデータを追加する

分析データを入手したら下記の順番でデータをシートに張り付けましょう。

A列は、年月日(昇順)、B列は始値、C列は高値、D列は安値、E列は終値です。F~H列に%K、 %D、Slow%Dの計算した結果を出力します。

B~Eの順番はエクセルでローソク足のグラフを作成するときの並び順に合わせています。

ストキャスティクスのプログラムコード

プログラムコードは5つのプロシージャからなります。下記のプログラムをコピー&ペーストしてF5でプログラムを実行すると%K、%D、Slow%Dの計算結果がシートのF~H列に貼り付けられます。

  • テクニカル分析のメインのプロシージャ(TechnicalAnalysisCalc)
  • ストキャスティクスの計算のプロシージャ(StochasticCalc)
  • 最大値を計算するプロシージャ(MaxCalc)
  • 最小値を計算するプロシージャ(MinCalc)
  • 平均値を計算するプロシージャ(AverageCalc)
Sub TechnicalAnalysisCalc()
'テクニカル指標の計算

    '定数の定義
    Const FIRSTROW As Long = 2 'データ開始の行
    Const MaxP_C As Long = 3 '高値の列数
    Const MinP_C As Long = 4 '安値の列数
    Const CloseP_C As Long = 5 '終値の列数
    Const Stochastic_C As Long = 6   'ストキャスティックスのを出力する最初の列


    '変数の定義
    Dim chartData As Variant    'チャートデータを格納する配列
    Dim LastRow As Long         '最終行を格納する変数
    Dim StochKP, StochDP, StochSlowDP As Long 'ストキャスティックスの各種期間を格納する変数

    'アクティブワークシートの設定(シート名が、Sheet1のとき。シート名が違う場合は変更して下さい)
    Worksheets("Sheet1").Select
    
    '過去の計算データクリア
    Range(Cells(FIRSTROW, Stochastic_C), Cells(Rows.Count, Stochastic_C + 2)).Clear

    '変数の初期化
    StochKP = 14   '%Kの期間(必要に応じて変更してください)
    StochDP = 3 '%Dの期間(必要に応じて変更してください)
    StochSlowDP = 3   'Slow%Dの期間(必要に応じて変更してください)
    LastRow = Cells(Cells(Rows.Count, 1).Row, 1).End(xlUp).Row '最終行の取得
    
    'チャートデータの取得(年月日から終値のデータを取得)
    chartData = Range(Cells(FIRSTROW, 1), Cells(LastRow, CloseP_C))
    
    'ストキャスティックスの計算結果の出力
    Range(Cells(FIRSTROW, Stochastic_C), Cells(LastRow, Stochastic_C + 2)) = StochasticCalc(chartData, MaxP_C, MinP_C, CloseP_C, StochKP, StochDP, StochSlowDP)
End Sub

Function StochasticCalc(chartData, MaxNum, MinNum, CloseNum, kPeriod, dPeriod, slowdPeriod)

    '変数の定義
    Dim RowNum As Long
    Dim CDRowNum As Long
    Dim MinValue As Double
    Dim MaxValue As Double
    Dim Result As Variant   '結果を格納する配列
    
    '最終行の取得
    CDRowNum = UBound(chartData, 1)

    '変数の再定義(動的配列)
    ReDim Result(1 To CDRowNum, 3)
    

    'ストキャスティックスの計算
    For RowNum = kPeriod To CDRowNum
    
        MinValue = MinCalc(chartData, MinNum, RowNum - kPeriod + 1, RowNum)
        MaxValue = MaxCalc(chartData, MaxNum, RowNum - kPeriod + 1, RowNum)
        
        '%Kの計算
        Result(RowNum, 0) = 100 * (chartData(RowNum, CloseNum) - MinValue) / (MaxValue - MinValue)
        
        '%Dの計算
        If RowNum >= kPeriod + dPeriod - 1 Then
            Result(RowNum, 1) = AverageCalc(Result, 0, RowNum - dPeriod + 1, RowNum)
        End If
        
        'Slow%Dの計算
        If RowNum >= kPeriod + dPeriod + slowdPeriod - 2 Then
            Result(RowNum, 2) = AverageCalc(Result, 1, RowNum - slowdPeriod + 1, RowNum)
        End If

    Next RowNum
    
    '結果をセルに出力する
    StochasticCalc = Result

End Function


Function MaxCalc(myArray, columnNum, startNum, endNum)
'最大値を算出する関数

    Dim MaxValue As Double
    Dim i As Long
    
    '最大値の初期値の入力
    MaxValue = myArray(startNum, columnNum)
    
    '最大値をMaxValueに代入
    For i = startNum To endNum
        If myArray(i, columnNum) > MaxValue Then
            MaxValue = myArray(i, columnNum)
        End If
    Next i
    
    MaxCalc = MaxValue
    
End Function

Function MinCalc(myArray, columnNum, startNum, endNum)
'最小値を算出する関数

    Dim MinValue As Double
    Dim i As Long
    
    '最小値の初期値の入力
    MinValue = myArray(startNum, columnNum)
    
    '最小値をMaxValueに代入
    For i = startNum To endNum
        If myArray(i, columnNum) < MinValue Then
            MinValue = myArray(i, columnNum)
        End If
    Next i
    
    MinCalc = MinValue
    
End Function

Function AverageCalc(myArray, columnNum, startNum, endNum) As Double
'引数の概要
'myArrayは元データ、columnNum計算する要素の指定, starwNumは計算をスタートの配列の位置, endNumは計算が終わる配列の位置
    
    '変数の定義
    Dim i As Long
    Dim SumArr As Double
    
    '合計の初期化
    SumArr = 0

    '平均する数値の合計を計算
    For i = startNum To endNum
        SumArr = SumArr + myArray(i, columnNum)
    Next i
    
    '合計値を合計した数で割って平均値を算出し平均値を算出。平均値を返す。
    AverageCalc = SumArr / (endNum - startNum + 1)

End Function

TechnicalAnalysisCalcの概要

メインのプロシージャです。

定数はシートの列の位置を規定しています。列位置が変わってもここの数値を変更するだけで正常に動きます。

分析するデータが張り付けられているシート(Sheet1)をアクティブにしています。シート名を変更したときは、ここを変更してください。

既に計算データがあること想定して、データをクリアしています。

変数の初期化をしています。
ストキャスティクスは%Kの期間、%Dの期間、Slow%Dの期間の3つがあります。%Kの期間は14、%Dの期間は3、Slow%Dの期間は3に設定しています。必要に応じて変更してください。
分析するデータの最終行もここで取得・設定しています。

分析するデータをセルから配列に格納しています。

StochasticCalcを呼び出して、ストキャスティクスの計算を実行し結果をシートに張り付けています。

StochasticCalcの概要

%K、%D、Slow%Dを計算しその結果を返すプロシージャです。

まずはチャートのデータ数を取得しています。
ReDimを使って結果を格納する配列の要素数の規定しています。

%K、%D、Slow%Dを計算を計算し、Resultに計算結果を格納しています。

3つの線は下記のルールに基づき計算します。

  • %K=(当日終値-過去%K期間の最安値)÷(過去%K期間の最高値-過去%K期間の最安値)×100
  • %D=%Kの過去%D期間の平均値
  • Slow%D=%Dの過去Slow%D期間の平均値

%Kの計算で用いる最高値、最安値はそれぞれMaxCalc、MinCalcのプロシージャを呼び出して計算します。

%DおよびSlow%Dの計算で用いる平均の計算はAveragCalcのプロシージャを呼び出して計算します。

最後に、結果を格納した配列を返します。

MaxCalcの概要

このプロシージャは配列の指定された範囲の最大値を計算し、その結果を返すプロシージャです。

指定された範囲で数値の大きさを比較し、最大の値をを返します。

MinCalcの概要

このプロシージャは配列の指定された範囲の最小値を計算し、その結果を返すプロシージャです。

指定された範囲で数値の大きさを比較し、最小の値をを返します。

AverageCalcの概要

このプロシージャは配列の指定された範囲の平均値を計算し、その結果を返すプロシージャです。

指定された範囲の数値を合計し、足した要素の数で割ることで平均値を算出し、その値を返します。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です