LoginSignup
5
8

More than 3 years have passed since last update.

【投資・R】統計や機械学習使って金持ちになりたい~チャート理解~【第1話】

Posted at

時系列データって結構ログとして残ってるから、分析として仕事が回ってきたりする。
今後もきっと扱うだろうし勉強しなきゃ。

はー、おかねほしい。

お金のためなら勉強も頑張れる気がして、勉強ついでに学んだことを吐き出していく。
とりあえず株からやってみるか。

まずplot・・・したかった・・

調べてみると「quantmod」ってライブラリがサクっとplotしてくれるらしい。
さらには何人かのブログを見るとurlからcsv引っ張ってきて分析できるスクリプト残してくれている!

って思ったけど、リンクがつぶれてたり、会社側がファイナンス情報の提供辞めてたり・・・

library(RFinanceYJ)
ってのがあるらしいぞ!

ってこれもアクセスできへんやんけ。
csvが有料DL設定になってはじかれるようになったんか・・・

時給自足で

でも株をplotのチャートとかどうなってるのか知らん。
キャンドルチャートは箱ひげとは違うみたいだし・・・
出来高ってのは取引量の事らしいから別でplotしたほうがいいんやろな。
さらには調整した出来高なんて項目まであるわ・・・

まあとりあえずplotしよ。

株のデータを集めました。

image.png

最初の3つだけ外れ値を含んでいそうなので除きます。
とりあえず「高値・hight」と「底値・low」と「出来高・trading_volume」を描けたらそれっぽくなるかと。

やってみる

data2<-read.csv(data)
df<-data2
df$ind<-c(1:nrow(df))

time <- as.POSIXct(df$date, "%Y-%m-%d", tz="Japan")
ct_seq <- seq(as.POSIXct("2010-12-15","%Y-%m-%d",tz="Japan"), 
  as.POSIXct("2019-09-20","%Y-%m-%d",tz="Japan"), 24*60*60)
ind <- c(1:length(ct_seq))
plot_label <- data.frame(ind=ind, day=ct_seq)

get_ind <- NULL
for(i in 1:length(time)){
  df_bind <- plot_label[plot_label$day == time[i],]
  get_ind <- rbind(get_ind, df_bind)
}

#plot
options(scipen=100)
par(mfrow=c(2,1))
par(mar=c(5,6,2,6))

xaxis_length<-20
set_at <- seq(1, length(ct_seq), length=xaxis_length)

plot(c(1:length(ct_seq)), c(rep(max(df$hight), 
     length(ct_seq)-1), min(df$hight)), type="n", 
     ylim=c(min(df$hight), max(df$hight)), 
     xlab="",ylab="",xaxt="n",yaxt="n")

points(get_ind$ind, df$hight, type="l", col="red")
points(get_ind$ind, df$low  , type="l", col="blue")

axis(side=1, labels=as.character(ct_seq)[set_at],
     las=2, at=set_at)
axis(side=1,tck=1,lty="dotted",labels=F)
axis(side=2,tck=1,lty="dotted")

par(mar=c(2,6,2,6))

plot(c(1:length(ct_seq)), c(rep(max(df$trading_volume),length(ct_seq)-1),min(df$trading_volume)), type="n", xlab="",ylab="",xaxt="n",yaxt="n")

points(get_ind$ind, df$trading_volume,type="l",col="green")

axis(side=3,at=set_at,xlab="",labels=F)
axis(side=2,tck=1,lty="dotted")
axis(side=1,tck=1,lty="dotted",label=F,at=set_at)

image.png

それっぽい図が描けた。

株チャートの表現を勉強・ボリンジャーバンド作成

キャンドルチャートはあきらめた!
移動平均とか、ボリンジャーバンドとか表現方法があるんやなー
追加してみよ。

data2<-read.csv(data)
df<-data2
df$ind<-c(1:nrow(df))

ct_seq <- seq(as.POSIXct("2010-12-15","%Y-%m-%d",tz="Japan"), as.POSIXct("2019-09-20","%Y-%m-%d",tz="Japan"),24*60*60)
ind <- c(1:length(ct_seq))
plot_label <- data.frame(ind=ind, day=ct_seq)

#移動平均を20ごとに求めるよう設定
N<-20

M_line<-NULL
FOR<-nrow(df)-(N-1)
for(i in 1:FOR){
end<-N-1
end<-end+i
cal <- sum((df$hight[i:end] + df$low[i:end])/2) /N
M_line<-c(M_line,cal)
}

head_cut<-N-1
df2<-df[-c(1:head_cut),]

df2$M_line<-M_line

#ボリンジャーバンドとやらをN日間の終値から計算した標準偏差に対して2sigmaで設定

sig<-1.96

ts_sd <- df$close

N<-20

M_line_sd <- NULL
FOR<-nrow(df)-(N-1)
for(i in 1:FOR){
end<-N-1
end<-end+i
cal <- sd(ts_sd[i:end])
M_line_sd<-c(M_line_sd,cal)
}


df2$M_line_sd<-M_line_sd

head_cut<-N-1
df3<-df2[-c(1:head_cut),]

df3$lower_sd<-df3$M_line-(df3$M_line_sd*sig)
df3$upper_sd<-df3$M_line+(df3$M_line_sd*sig)

time <- as.POSIXct(df3$date, "%Y-%m-%d", tz="Japan")

get_ind <- NULL
for(i in 1:length(time)){
  df_bind <- plot_label[plot_label$day == time[i],]
  get_ind <- rbind(get_ind, df_bind)
}

options(scipen=100)
par(mfrow=c(3,1))
par(mar=c(5,6,2,6))

xaxis_length<-20
set_at <- seq(1, length(ct_seq), length=xaxis_length)

plot(c(1:length(ct_seq)), c(rep(max(df3$hight), 
     length(ct_seq)-1), min(df3$hight)), type="n", 
     ylim=c(min(df3$hight), max(df3$hight)), 
     xlab="",ylab="",xaxt="n",yaxt="n")

points(get_ind$ind, df3$hight, type="l", col="red")
points(get_ind$ind, df3$low  , type="l", col="blue")

axis(side=1, labels=as.character(ct_seq)[set_at],
     las=2, at=set_at)
axis(side=1,tck=1,lty="dotted",labels=F)
axis(side=2,tck=1,lty="dotted")

par(mar=c(5,6,2,6))

plot(c(1:length(ct_seq)), c(rep(max(df3$upper_sd), 
     length(ct_seq)-1), min(df3$lower_sd)), type="n", 
     ylim=c(min(df3$hight), max(df3$hight)), 
     xlab="",ylab="",xaxt="n",yaxt="n")

points(get_ind$ind, df3$hight, type="l", col="red")
points(get_ind$ind, df3$low  , type="l", col="blue")

points(get_ind$ind, df3$M_line, type="l", col="black")

points(get_ind$ind,df3$lower_sd, type="l", col="orange")
points(get_ind$ind,df3$upper_sd, type="l", col="orange")

axis(side=1, labels=as.character(ct_seq)[set_at],
     las=2, at=set_at)
axis(side=1,tck=1,lty="dotted",labels=F)
axis(side=2,tck=1,lty="dotted")
axis(side=3,at=set_at,xlab="",labels=F)

par(mar=c(2,6,2,6))

plot(c(1:length(ct_seq)), c(rep(max(df3$trading_volume),length(ct_seq)-1),min(df3$trading_volume)), type="n", xlab="",ylab="",xaxt="n",yaxt="n")

points(get_ind$ind, df3$trading_volume,type="l",col="green")

axis(side=3,at=set_at,xlab="",labels=F)
axis(side=2,tck=1,lty="dotted")
axis(side=1,tck=1,lty="dotted",label=F,at=set_at)

図の真ん中に追加。

image.png

ボリンジャーバンドは20日間の移動平均を計算するのと同じように、
過去20日間の終値から標準偏差を計算したものをシグマとして考えた(終値の標準偏差の移動平均)。
・この値に2を掛け、移動平均と足したものがボリンジャーバンドの上限
・この値に-2を掛け、移動平均と足したものがボリンジャーバンドの下限

時系列データ中に発生するばらつきが正規分布に従うと考えて、
そのばらつきの幅から考えて95%くらいはこの辺りにデータが出現するだろう。と考えてのものだと解釈した。

確かに拡大してみると上限も下限もほとんどこの値に入っている。

image.png

つまり、現在価値がボリンジャーバンドの下限に触れそうなら、次の瞬間には上がり調子になる可能性が高い。

シンプルにバンドだけ見たい。

par(mar=c(8,6,2,6))

xaxis_length<-20
set_at <- seq(1, length(ct_seq), length=xaxis_length)

plot(c(1:length(ct_seq)), c(rep(max(df3$hight), 
     length(ct_seq)-1), min(df3$hight)), type="n", 
     ylim=c(min(df3$hight), max(df3$hight)), 
     xlab="",ylab="",xaxt="n",yaxt="n")

points(get_ind$ind, df3$M_line, type="l", col="black")

points(get_ind$ind,df3$lower_sd, type="l", col="orange")
points(get_ind$ind,df3$upper_sd, type="l", col="orange")

axis(side=1, labels=as.character(ct_seq)[set_at],
     las=2, at=set_at)
axis(side=1,tck=1,lty="dotted",labels=F)
axis(side=2,tck=1,lty="dotted")

image.png

なんだか最近下降しているようだけど、なにか周期性や今後の進む方向が見つかれば、
買うか買わないか考えられそうな気がしませんか?
たとえば、最近下降気味でも、最後は上がってますよね?
これも今までの周期傾向から下がっても不思議ではないタイミングで、
たまたま多めに下がっただけなら、
安いうちに買って上がるのを待つことができそうですよね????

お金持ちになれそうな気がしてきました!!

次回は周期調節のためのデータの前処理

株を教えて

5
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
8