オプティマルf

EAのオプティマルf算出の途中経過。(のメモ)

 

とりあえず、Accessだけで何とかしようと思いましたが、集計関数に積算集計がなさそうなのと、計算データ量が多すぎてJOINデータサイズがぶっ飛びメモリが足りませんエラーがでて、Accessだけ作戦は諦めました。

結局、Excelでマクロを用いて、オプティマルfを計算している状況です。

 

まず、このようなデータレコードをAccess等を元ネタに準備する。

50126-re

 

 

処理単位は、EAName・Symbol毎にしています。

他に、損益のPips情報(といいますか、単利損益)が必須です。

 

上記集計単位に対して、オプティマルfを変化させた場合の

TWRを算出し(ここまで実現している状況)、TWRが最大となったfが

即ちオプティマルfとなります。

 

 

 

ExcelのVisualBasicコードは下記のようなもので、TWRまで算出できます。


Sub CalcTWR()
    Dim RecKey As String
    Dim NextRecKey As String

    Dim FVal As Double
    Dim FStepVal As Double
    Dim FLastVal As Double

    Dim HPRVal As Double
    Dim TWRVal As Double
    Dim MinPips As Double

    Dim LineIndicator As Long
    Dim LastLineNumber As Long

    Dim EARangeStarts As Long
    Dim EARangeEnds As Long
    Dim IndiRangeProcess As Long

    Dim RecsSheetName As String
    Dim TwrSheetName  As String

    Dim RecPipsColInd As Integer
    Dim TwrSheetRowInd As Integer
    Dim TwrSheetColInd As Integer

    '初期設定
    RecsSheetName = "RECS"
    TwrSheetName = "TWR"

    RecPipsColInd = 5

    'TWR計算結果の格納シートの初期化
    Worksheets(TwrSheetName).Cells.Clear
    Worksheets(TwrSheetName).Cells(1, 1) = "f"

    '初期状態の準備
    TwrSheetColInd = 1
    LineIndicator = 2
    EARangeStarts = 2
    LastLineNumber = Worksheets(RecsSheetName).Range("A1").End(xlDown).Row
    RecKey = GeneratePerformingKey(Worksheets(RecsSheetName).Cells(LineIndicator, 1), Worksheets(RecsSheetName).Cells(LineIndicator, 2))

    MinPips = 100000
    FVal = 0.001
    FStepVal = 0.005
    FLastVal = 0.9

    '処理本体
    For LineIndicator = 2 To LastLineNumber Step 1

        '最大損失を押さえる
        If (MinPips > Worksheets(RecsSheetName).Cells(LineIndicator, RecPipsColInd)) Then
            MinPips = Worksheets(RecsSheetName).Cells(LineIndicator, RecPipsColInd)
        End If

        NextRecKey = GeneratePerformingKey(Worksheets(RecsSheetName).Cells(LineIndicator + 1, 1), Worksheets(RecsSheetName).Cells(LineIndicator + 1, 2))

        'キーブレイク処理 (キーはEA_IDと通貨ペア)
        If RecKey <> NextRecKey Then

            EARangeEnds = LineIndicator
            TwrSheetColInd = TwrSheetColInd + 1
            TwrSheetRowInd = 1

            'TWRシートの見出しを設定する
            Worksheets(TwrSheetName).Cells(TwrSheetRowInd, TwrSheetColInd) = RecKey
            TwrSheetRowInd = TwrSheetRowInd + 1

            '1EA、1通貨ペアの間でオプティマルf値を変化させTWRの算出を行う
            For FVal = 0.001 To FLastVal Step FStepVal

                TWRVal = 1

                For IndiRangeProcess = EARangeStarts To EARangeEnds Step 1
                    HPRVal = CalcHPR(Worksheets(RecsSheetName).Cells(IndiRangeProcess, RecPipsColInd), MinPips, FVal)
                    TWRVal = TWRVal * HPRVal
                Next IndiRangeProcess

                '1つのf値について、TWRの算出が完了した
                Worksheets(TwrSheetName).Cells(TwrSheetRowInd, 1) = FVal
                Worksheets(TwrSheetName).Cells(TwrSheetRowInd, TwrSheetColInd) = TWRVal
                TwrSheetRowInd = TwrSheetRowInd + 1

            Next FVal

            'TWRの算出が終わったら次の処理単位決定にむけて準備する
            RecKey = NextRecKey
            EARangeStarts = LineIndicator + 1
            MinPips = 100000

        End If

    Next LineIndicator

End Sub

Function CalcHPR(ByVal pips As Double, ByVal MinPips As Double, ByVal f As Double) As Double
    CalcHPR = 1 + (f * (-1 * pips / MinPips))
End Function

Function GeneratePerformingKey(ByVal EA As String, ByVal Symbol As String) As String
    GeneratePerformingKey = EA & "_" & Symbol
End Function

 

以上で、下記のピクチャのような数値列と、オプティマルfが導出できます。

後は数値シミュレーションをして、納得して運用を再開するのみ。

50126-opf

 

計算期間や、f値の変化量を小さくしすぎると計算量が過大になり、

実用的な範囲で、処理完了が困難になります。

 

Accessや、Excelの限界を感じる計算でした。。。

 

各曲線の頂点となっているfが、いわゆるオプティマルfです。きっと。

ロット数を求めるには、この後どうするんでしたっけビンスさん。。。

 

 

 

今後の予定として、とりあえずまた敗北(全滅)しそうなHippoには頑張ってもらうとして

  • バルサラの破産確率でトレードした場合
  • 定率2%とかでトレードした場合
  • オプティマルfを定率としてトレードした場合

の数値シミュレーションをしようと計画しています。

 

 

コメントを残す