単純移動平均とモーメンタムの関係について

                                                      • -

(追記 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)