2016-03-28 18 views
0

私は、Simon Otzigerのおかげで、光沢と量子ストラットを組み合わせた素晴らしい例で、ストラテジーの累積リターンとリターンのピークをグラフ化する関数をクロスオーバーしました。ソースコードはhereです。ほとんどの場合、コードは正常に機能しますが、一部のデータではピークを正しくグラフ化できません。volemont/insights:chart.EquityCurve.R:累積リターンのピークをグラフ化するバグ?

コードは簡略化されていますが、キーロジックは変更されません。私は3つの例の戦略からコピーされた3つのデータセット(cumPNL1、cumPNL2、cumPNL3)を使ってコードを実行しました。最初のデータはコードがピークを正しくグラフ化できない原因になります。

次のコードをcumPNL1、cumPNL2、およびcumPNL3で個別に実行しました。 cumPNL2とcumPNL3の両方を使用すると、コードは累積リターンラインとピークポイントを正常に生成できます。しかし、cumPNL1では、コードは線のみを生成することができますが、ピークは正しい位置にありません。

cumPNL2とcumPNL3に基づくpeakIndexの両方が最初の値がTRUEであることに気づいたので、コードを変更してpeakIndex[1] <- TRUEという行を追加すると、修正されたコードでcumPNL1が正常に動作します。

今は変更されたコードで動作しますが、なぜこのように動作しているのかわかりません。誰か見てもらえますか?おかげ

cumPNL1 <- c(-193,-345,-406,-472,-562,-543,-450,-460,-544,-659,-581,-342,-384,276,-858,-257.99) 
cumPNL2 <- c(35.64,4.95,-2.97,-6.93,11.88,-19.8,-26.73,-39.6,-49.5,-50.49,-51.48,-48.51,-50.49,-55.44,143.55,770.22,745.47,691.02,847.44,1141.47,1007.82,1392.93,1855.26,1863.18,2536.38,2778.93,2811.6,2859.12,2417.58) 
cumPNL3 <- c(35.64,4.95,-2.97,-6.93,11.88,-19.8,-26.73,-39.6,-49.5,-50.49,-51.48,-48.51,-50.49,-55.44,143.55,770.22,745.47,691.02,847.44,1141.47,1007.82,1392.93,1855.26,1863.18,2536.38,2778.93,2811.6,2859.12,2417.58) 


peakIndex <- c(cumPNL3[1] > 0, diff(cummax(cumPNL3)) > 0) 
# peakIndex[1] <- TRUE 

dev.new() 

plot(cumPNL3, type='n', xlab="index of trades", ylab="returns in cash", main="cumulative returns and peaks") 
grid() 
lines(cumPNL3)  
points(cbind(1 : length(cumPNL3), cumPNL3)[peakIndex, ], 
     pch=19, col='green', cex=0.6) 

legend(
    x='bottomright', inset=0.1, 
    legend=c('Net Profit','Peaks'), 
    lty=c(1, NA), pch=c(NA, 19), 
    col=c('black','green') 
) 

答えて

1

cumPNL1は単一のピークを有し、Rは、長さ2の数値ベクトルを数値行列の次元を低減points関数は、x軸インデックスを使用して、y軸上の2つの数値ベクトル値をプロット1および2:

peakIndex1 <- c(cumPNL1[1] > 0, diff(cummax(cumPNL1)) > 0) 
peakIndex3 <- c(cumPNL3[1] > 0, diff(cummax(cumPNL3)) > 0) 

str(cbind(1 : length(cumPNL1), cumPNL1)[peakIndex1,]) 
str(cbind(1 : length(cumPNL3), cumPNL3)[peakIndex3,]) 

出力:

> str(cbind(1 : length(cumPNL1), cumPNL1)[peakIndex1,]) 
num [1:12, 1:2] 1 15 16 19 20 22 23 24 25 26 ... 
- attr(*, "dimnames")=List of 2 
    ..$ : NULL 
    ..$ : chr [1:2] "" "cumPNL1" 
> str(cbind(1 : length(cumPNL3), cumPNL3)[peakIndex3,]) 
Named num [1:2] 14 276 
- attr(*, "names")= chr [1:2] "" "cumPNL3" 

通常plot = FALSEを設定すると01、例えば、オブジェクトを保持します、この場合は何とか動作しません。問題の報告

points(seq_along(cumPNL3)[peakIndex], cumPNL3[peakIndex], pch = 19, 
    col = 'green', cex = 0.6) 

ありがとう:ただし、以下の修正問題にpointsラインを変更します。私は明日GitHubに修正をプッシュします。