より深くquantmodで解析してみよう!

前回扱ったquantmodを使って色々解析してみようっていう試み。

初心者からプロまで納得のFXTF | キャッシュバックあり!

解析に使う

前回の記事で使ったデータを使用します。

そこまでのデータ準備は以下のようにしましょう。

install.packages("quantmod")
data <- read.csv("O1.csv")
data$time <- as.POSIXct(data$time,tz="Asia/Tokyo",origin = "1970-01-01")
timename <- data[,1]
tdata<- data[-1]
rownames(tdata) <- timename
xdata <- as.xts(tdata)

このデータ形状を扱える関数は沢山あり、以下のようなものです。

Op(x) # 始値の取得
Hi(x) # 高値の取得
Lo(x) # 安値の取得
Cl(x) # 終値の取得
Vo(x) # 取引量の取得
Ad(x) # 調整済み価格の取得(調整済みデータがあれば)
seriesHi(x) # 最高値 Max(Hi(x))を付けたデータ
seriesLo(x) # 最安値を付けたデータ
seriesIncr(x, thresh=0, diff.=1L) # 1つ前に比べて上昇してるか
seriesDecr(x, thresh=0, diff.=1L) # 1つ前に比べて下落してるか
OpCl(x) # 始値に対しての増減(%)
ClCl(x) # ひとつ前の終値に対しての増減
HiCl(x) # 高値と終値の比率
LoCl(x) # 安値と終値の比率
LoHi(x) # 高安値の比率
OpHi(x) # 始値と高値の比率
OpLo(x) # 始値と安値の比率
OpOp(x) # ひとつ前の始値の比率
HL(x) # 高安値の取得
HLC(x) # 高安終値の取得
OHLC(x) # 高安値、始値、終値の取得
OHLCV(x) # OHLCにvolumeも取得

xにはxts化したデータが入ります。すなわち、本記事上では「xdata」が該当します。

他に収益率を返すものもあります。

allReturns(x, subset=NULL, type='arithmetic', leading=TRUE) #以下はすべて引数一緒
yearlyReturn(x) # 年間のリターンを計算 subsetで期間を指定
annualReturn(x) # type = は単発計算か連続計算か、指定はlog
quarterlyReturn(x) 
monthlyReturn(x) 
weeklyReturn(x)
dailyReturn(x)

leadingがFALSEにしても計算結果変わらなくて、ちょっとわからなかったです、、、 すみません。

期間データが不完全な時に計算結果を返すか否かだと思うのですが…

また、山と谷を検出するような関数もあります。が、ちょっとうまくデータを抜き取れていない感じがします。

p <- findPeaks(sin(seq(1,10,.1)))
v <- findValleys(sin(seq(1,10,.1)))
sin(seq(1,10,.1))[p]
plot(sin(seq(1,10,.1))[p])
plot(sin(seq(1,10,.1)),type='l')
points(p,sin(seq(1,10,.1))[p])
points(v,sin(seq(1,10,.1))[v])

こちらはサイン関数の山と谷を検出しています。

p <- findPeaks(ddata$xdata.High) # 日足データの山を検出
v <- findValleys(ddata$xdata.Low) # 日足データの谷を検出
ddata[p]
ddata[v]

あっている…?のかな。 ちょっと微妙ですが、計算上はこうなってる様子。

時系列を活用した解析

続いて、時系列をうまい事使った関数を紹介

nddata <- Next(ddata , 1) # 1つ次のOpenを格納 high等を選びたいなら$high等で指定
lddata <- Lag(ddata$xdata.Close,3) # 3つ前の終値を格納
ddata[1:5] # 比較しやすいように先頭5行を見てみる
nddata[1:5]
lddata[1:5]

前後にずれたデータが作れました。

これを応用して、予測モデルを組んでみます。

quantmodで予測してみる!

model <- specifyModel(Next(OpCl(ddata))~Lag(OpHi(xdata),0:3)) # 日足の始値終値比を1分足の始値高値比の0~3を使って予測するモデルを定義
bmodel <- buildModel(model,method = "lm",training.per = c("2023-07-24","2023-07-31")) # modelの計算式でtraining.perで指定した期間を使用し学習する。方法はlm(線形回帰)
results <- tradeModel(bmodel) # 入力されている全期間を用いて予測モデルに従うとどの程度のリターンが得られるか
results$return

負けまくりですね… きっと、予測すべき目的変数や、説明変数、計算方法が良くないのだと思います。

model <- specifyModel(Next(OpCl(xdata))~Lag(OpHi(xdata),0:300)) #予測対象を1分足にして、300分前まで使ってみる
bmodel <- buildModel(model,method = "lm",training.per = c("2023-07-24","2023-07-31"))
results <- tradeModel(bmodel)
results$return

現実的なトレードではありませんが、一応黒字が出るかもしれないモデルになりました。まぁ1分足をずーっと計算して、トレードし続けるという絶望です。恐らく手数料負けします。

予測のための計算式を変えてみましょう。

今回は決定木という意思決定法を用いる、randomforestという方法を選んでみました。

回帰というよりは分類に強い機械学習法のひとつです。

install.packages("randomForest")
library(randomForest)
model <- specifyModel(Next(OpCl(ddata))~Lag(OpHi(xdata),0:3)) #日足の始値終値比を予測
bmodel <- buildModel(model,method = "randomForest",training.per = c("2023-07-24","2023-07-31"))
# モデル形成のロジックを決定木を使うランダムフォレストに変更してみた
results <- tradeModel(bmodel)
results$return

翌日の日足終値を予測するモデルで、そこそこ勝てそうな結果が得られました。

変数を変えてみたり、ロジックを変えてみて色々やると、恒常的に勝てる何かが見つかるかもしれませんよ! 使えるロジックと、パッケージは以下を参照してください。

method [package] # 使用可能なmethod[パッケージ名]
# install.packages(パッケージ名) した後に、 library(パッケージ名)すれば使えるようになります
# パッケージ名が無いものはRにもとから入っている予測方法です。ものによって要求される変数等が異なります。
lm
glm
loess
step
ppr
rpart[rpart]
tree[tree]
randomForest[randomForest] 
mars[mda]
polymars[polspline] 
lars[lars]
rq[quantreg] 
lqs[MASS] 
rlm[MASS] 
svm[e1071]
nnet[nnet]

急に進みすぎた感はありますが、Rって使えますよね!今後も、ぼちぼち紹介していきます

おすすめFXアイテム

過去検証や分析はMT4かFT4、Trading viewがおすすめです。

無料が良い人はMT4で、MT4を使わせてくれる口座を使用すると良いです。おすすめはFXTF

ガチで過去検証をやりたい人はFT4、

チャート分析に毎月課金してもいいよって人はTrading viewがおすすめです。無料もあります

Twitterでフォローしよう

おすすめの記事