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を定率としてトレードした場合
の数値シミュレーションをしようと計画しています。