単純移動平均とモーメンタムの関係について
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
(追記 2016/01/28)
当初エントリー内容に新しく内容を追加。また、プログラムの変数名も自分が分かりやすいように変更。ただし、最終的な結果は同じで変更は無し。
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
必要なライブラリの読み込み。
require(quantmod) require(TTR) require(PerformanceAnalytics)
株価データの取得とリターンの計算。
#株価データの取得(国際石油開発帝石(株)を取得) getSymbols('1605', from = '2006-01-01', src='yahooj') #Ad関数で調整後株価を取得。endpoints関数で指定した期間の最終日の株価の添字を求める。 #つまり、月の最終営業日の調整後価格を取得(月足の終値に相当) monthly1605 <- Ad(YJ1605)[endpoints(YJ1605, on = 'months')] #リターンを計算する。 monthly1605rets <- Return.calculate(monthly1605)
#月足終値データをlag関数で10ヶ月後ろにずらし、元データから引く。それをずらした期間で割る。 #つまり、10ヶ月の価格の単位時間あたりの変化率。 signalTSMOM <- (monthly1605 - lag(monthly1605, 10))/10 #10ヶ月単純移動平均を1ヶ月後ろにずらしたものとの差分を計算 signalDiffMA <- diff(SMA(monthly1605, 10))
ここでの操作は次のようなもの。
10ヶ月の価格の差(月足価格の10ヶ月ラグ)
=P0-P10
=(P0-P1)+(P1-P2)+・・・+(P8-P9)+(P9-P10)
=(P0+P1+・・・+P8+P9)−(P1+P2・・・+P9+P10)
=10*(10ヶ月SMA0−10ヶ月SMA1)従って、両辺を10で割ると、
(P0-P10)/10=10ヶ月SMA0−10ヶ月SMA1
となる。つまり、
月足価格の10ヶ月ラグ/10=10ヶ月SMAの1ヶ月ラグ
グラフをかいてみると同じ。
※)もちろん値を確認。
> par(mfrow=c(1,2)) > plot(signalTSMOM) > plot(signalDiffMA)
# rounding just sum(round(signalTSMOM, 3)==round(signalDiffMA, 3), na.rm=TRUE) [1] 108
# 月足の期間10ヶ月のモーメンタム(これを10で割ったもの) signalTSMOM <- (monthly1605 - lag(monthly1605, 10))/10 # 月足10EMAのモーメンタム signalDiffEMA <- diff(EMA(monthly1605, 10)) # SMAとEMAについて、戦略の結果を計算する # ※)ここでsmaStratと名づけている変数は厳密には単純なモーメンタムだが、前述の説明通りこれはSMAの定数倍 # 月足ベースでのリターン(株価変化率)に、各モーメンタム戦略の結果が正の場合にモーメンタム(株価変化)をかける # ※)lag関数の性質から、モーメンタムが負の場合は0をかけることになる。 smaStrat <- monthly1605rets * lag(signalTSMOM > 0) emaStrat <- monthly1605rets * lag(signalDiffEMA > 0) # 戦略結果を結合して成績を見る comparison <- cbind(smaStrat , emaStrat) colnames(comparison) <- c("DiffSMA10", "DiffEMA10") charts.PerformanceSummary(comparison) table.AnnualizedReturns(comparison) DiffSMA10 DiffEMA10 Annualized Return -0.0835 -0.0886 Annualized Std Dev 0.1673 0.1879 Annualized Sharpe (Rf=0%) -0.4993 -0.4716
この結果を見ると、EMA戦略の方がSMA戦略よりパフォーマンスが悪いが、EMA戦略はSMA戦略から導かれるので当たり前という話。
元ネタはここ。
全てのソース。
require(quantmod) require(TTR) require(PerformanceAnalytics) #株価データの取得(国際石油開発帝石(株)を取得) getSymbols('1605', from = '2006-01-01', src='yahooj') #Ad関数で調整後株価を取得。endpoints関数で指定した期間の最終日の株価の添字を求める。 #つまり、月の最終営業日の調整後価格を取得(月足の終値に相当) monthly1605 <- Ad(YJ1605)[endpoints(YJ1605, on = 'months')] #リターンを計算する。 monthly1605rets <- Return.calculate(monthly1605) #月足終値データをlag関数で10ヶ月後ろにずらし、元データから引く。それをずらした期間で割る。 #つまり、10ヶ月の価格の単位時間あたりの変化率。 signalTSMOM <- (monthly1605 - lag(monthly1605, 10))/10 #10ヶ月単純移動平均を1ヶ月後ろにずらしたものとの差分を計算 signalDiffMA <- diff(SMA(monthly1605, 10)) # 月足の期間10ヶ月のモーメンタム(これを10で割ったもの) signalTSMOM <- (monthly1605 - lag(monthly1605, 10))/10 # 月足10EMAのモーメンタム signalDiffEMA <- diff(EMA(monthly1605, 10)) # SMAとEMAについて、戦略の結果を計算する # 月足ベースでのリターン(株価変化率)に、各モーメンタム戦略の結果が正の場合にモーメンタム(株価変化)をかける # ※)lag関数の性質から、モーメンタムが負の場合は0をかけることになる。 smaStrat <- monthly1605rets * lag(signalTSMOM > 0) emaStrat <- monthly1605rets * lag(signalDiffEMA > 0) # 戦略結果を結合して成績を見る comparison <- cbind(smaStrat , emaStrat) colnames(comparison) <- c("DiffSMA10", "DiffEMA10") charts.PerformanceSummary(comparison) table.AnnualizedReturns(comparison)