EAのオプティマルf算出の途中経過。(のメモ)
とりあえず、Accessだけで何とかしようと思いましたが、集計関数に積算集計がなさそうなのと、計算データ量が多すぎてJOINデータサイズがぶっ飛びメモリが足りませんエラーがでて、Accessだけ作戦は諦めました。
結局、Excelでマクロを用いて、オプティマルfを計算している状況です。
まず、このようなデータレコードをAccess等を元ネタに準備する。
処理単位は、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が導出できます。
後は数値シミュレーションをして、納得して運用を再開するのみ。
計算期間や、f値の変化量を小さくしすぎると計算量が過大になり、
実用的な範囲で、処理完了が困難になります。
Accessや、Excelの限界を感じる計算でした。。。
各曲線の頂点となっているfが、いわゆるオプティマルfです。きっと。
ロット数を求めるには、この後どうするんでしたっけビンスさん。。。
今後の予定として、とりあえずまた敗北(全滅)しそうなHippoには頑張ってもらうとして、
- バルサラの破産確率でトレードした場合
- 定率2%とかでトレードした場合
- オプティマルfを定率としてトレードした場合
の数値シミュレーションをしようと計画しています。

