先月は8万の損。
何だよクソが、人生始まってから負けてばかりじゃねぇかよ。
先月なんて事実上安値で売ったようなもんだ。クソが。
でもいい。
いや、よくないんだけど、それ以上にいいことがあったかもしれない。
そう、俺は遂に、遂に、
優良な新しいアルゴリズムの作成に成功したからだ!!
・
・
・
・
・
by 専業トレーダーになって1000万損した男の末路
考えることは同じだね・・・・。
そして時代は繰り返す。
現在のシステムトレード挑戦は人生で3回目(VBS→C言語→Protra・OmegaChart)です。
年毎の取引回数と総合利益を表示する
マネックス証券のトレードステーションでの自動売買が主流になりつつあります。
10年前は多くのソフトが存在しました。
- トレードステーション(日本語版)
- 最適分散投資の「イザナミ」
- Tactico (タクティコ)
- シストレ魂
- システムトレードの達人
- MultiCharts (マルチチャート)
- 株式投資ソフト「パイロン」
- Alpha Chart
- OmegaChart (提供中止)
- Fchart’s (エフチャート)
- Protra
- ストックナビ 2008
過去にはオープンソフトも存在していましたが、最近は存在しなくなってきました。
10年前から保守のみ継続のオープンソフト「protra」は機能が足りなすぎます。
バックテスト用と割りきっても、かゆいところに手が届きません。
たとえば、バックテスト結果に対して毎年の利益と取引回数が知りたいです。
資産が10年で10倍になる手法でも、資産の2倍負ける年があればシステムトレードを引退してしまう可能性があるためです。
今回はprotra自体を修正して使ってみます。
修正したソースコード
C#を読んで思い通りに修正するのは初めてです。
組み込み関数等はググれば分かります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
--- ./Performance.cs 2017-06-25 17:15:56.994185200 +0900 +++ "protra-protra_trunk-r534/PtSim/Performance.cs" 2017-06-25 13:57:13.806673400 +0900 @@ -20,6 +20,7 @@ using System; using System.ComponentModel; +using System.Collections.Generic; using Protra.Lib.Config; using Protra.Lib.Data; using Protra.Lib.Lang.Builtins; @@ -47,6 +48,8 @@ private float _bookMaxPosition; // 時価の最大ポジション private float _marketMaxPosition; // 簿価の最大ポジション private float _totalProfit; // 総利益 + private Dictionary<int, float> _allTradesYear; // 各年のトレード数 + private Dictionary<int, float> _totalProfitYear; // 各年の総利益 private float _winTotalProfit; // 勝ちトレード総利益 private float _winMaxProfit; // 勝ちトレード最大利益 private float _loseMaxLoss; // 負けトレード最大損失 @@ -67,6 +70,8 @@ _name = name; _brandList = brandList; _timeFrame = timeFrame; + _allTradesYear = new Dictionary<int, float>(); + _totalProfitYear = new Dictionary<int, float>(); } /// @@ -183,7 +188,7 @@ realTotalBuy -= (totalBuy = (float)position * log.Price); else if (position < 0) realTotalSell -= (totalSell = (float)-position * log.Price); - EvaluateTrade(log.Order == Order.Sell, (log.Date - startDate).Days, realTotalBuy, realTotalSell); + EvaluateTrade(log.Order == Order.Sell, (log.Date - startDate).Days, realTotalBuy, realTotalSell, log.Date.Year); } if (position != 0) _runningTrades++; @@ -198,7 +203,7 @@ return realProfits; } - private void EvaluateTrade(bool isLong, int term, float totalBuy, float totalSell) + private void EvaluateTrade(bool isLong, int term, float totalBuy, float totalSell, int year) { _allTrades++; var ratio = isLong ? totalSell / totalBuy - 1 : 1 - totalBuy / totalSell; // 空売りは売りポジションが分母 @@ -206,6 +211,14 @@ _allTerm += term; var profit = totalSell - totalBuy; _totalProfit += profit; + // 年度別のトータル資金 + if(_totalProfitYear.ContainsKey(year) == true){ + _totalProfitYear[year] += profit; + _allTradesYear[year] ++; + } else { + _totalProfitYear.Add(year, profit); + _allTradesYear.Add(year, 1); + } if (totalSell > totalBuy) // 勝ち { _winTrades++; @@ -314,6 +327,19 @@ _winTotalProfit / -loseTotalLoss, _bookMaxDrowDown, _marketMaxDrowDown, _runningTrades)); + + + appendText(string.Format( + "----------------------------------------\n" + + "各毎の利益額\n")); + // Dictionaryの内容をコピーして、List + List<KeyValuePair<int, float>> list = new List<KeyValuePair<int, float>>(_allTradesYear); + list.Sort((a, b) => a.Key - b.Key); //昇順 + + foreach (KeyValuePair<int, float> pair in list) + { + appendText(string.Format("{0}年\t{1}\t{2:c}\n", pair.Key, pair.Value, _totalProfitYear[pair.Key])); + } } } } |
実際の画面はこんな感じです。
やりたいことは実現できました。
少しずつテクニカル指標に対する理解も深まってきたので、いつか聖杯を発見したい!