R筋

プログラミング、金融、育児

【R】bitFlyerのAPIを操作 public API・ticker編

過去のブログで板情報を取得しました。
anpontan382.hatenablog.com
今回はティッカー情報です。
ティッカー情報は、取得時点のベストプライス・ボリュームなどです。自動売買ツールを作る上では条件判定に必要になるでしょう。
早速コードはこちら~

#最初は前回同様です
#ライブラリロード
library(rjson)
library(RCurl)

#エンドポイントを設定
endpoint <- "https://api.bitflyer.jp/v1/"

#パラメータに対応
getboard <- paste(endpoint,"getticker?product_code=BTC_JPY",sep="")

#tickerを蓄積するデータフレームを作成
ticker_DB <- data.frame(matrix(rep(NA, 12), nrow=1))[numeric(0), ]
colnames(ticker_DB) <- c("product_code","timestamp","tick_id","best_bid","best_ask",  
                          "best_bid_size","best_ask_size","total_bid_depth","total_ask_depth","ltp",              
                          "volume","volume_by_product")

#1000回取得します
for (i in 1:1000){

  #json→リスト変換→data.frame
  json <- getURL(getboard)
  ticker <- fromJSON(json)
  ticker <- as.data.frame(ticker)

  #0.1秒待つ(bitFlyerへのアクセスは1分間に200回が上限です)
  Sys.sleep(0.1)

  #取得したtickerを格納
  ticker_DB <- rbind(ticker_DB,ticker)
}

1000行のティッカー情報が取れました。
f:id:anpontan382:20180115224605p:plain

timestampは世界標準時UTC)のため、日本時間(JST)にすると
2018-01-15 22:27:44から10分間のデータになります。

f:id:anpontan382:20180115225337p:plain
サマリーを見てみますとこの5分間の間は、ltp(最終取引価格)が170万8千円~171万3千円で推移したことがわかります。この5分でうまくやれば5,000円手に入ったわけだ。

plot(ticker_DB$ltp,type="l")

f:id:anpontan382:20180115230551p:plain
プロットするとこんな感じ。
よーしそれじゃ早速タイムマシンで22:27:44に戻ってみんなも5000円ゲットじゃぞ~

【R】主成分分析でベビーカーを分類

主成分分析とは、色々な項目で計測されているサンプルに対して、主成分と呼ばれる新しく合成した少数の尺度を使って分析する手法です。
例えば、BMIは身長と体重から算出される肥満度を表す指標ですが、これがあることで、1つの指標だけで複数のサンプルを比較することが容易になります。
スマホのスペックには、バッテリー容量、画面解像度、重量、バイブの強さがあるとします。これらから主成分を抽出する場合、バイブの強さはあまりスマホによって変わらないので、情報量が少ない(分散が少ない)ため、尺度を減らす上で捨てられることになりそうです。またバッテリー容量と重量は相関がありそうなため、一つにまとめて新たな尺度にできるのではないでしょうか。
このような形で、スマホのスペックをいくつかの尺度で説明することで、特徴を把握し、機種の分類に役立てます。

主成分分析は次の流れで行います。
1)分散共分散行列(相関行列)を作成する
分散共分散行列→各計測値の単位が同じときに使用
相関行列→各計測値の単位がバラバラの場合に標準化できる
2)主成分を求める
分散共分散行列(相関行列)から固有値ベクトルを算出する

Rでは標準でprcomp()関数が用意されており、上記の計算をまとめて実施してくれます。レッツトライ!

あまりいい例になりませんでしたが、妻のブログでベビーカーのスペックをまとめていたので、この主成分分析を行います。
adijo.hatenablog.com

商品毎に、価格、重量、カゴ容量を表にした
babycar.csvを作りました。
f:id:anpontan382:20180108164332p:plain

#取り込み
library(readr)
baby <- read_csv("~/babycar.csv")
baby <- as.data.frame(baby)
#商品名を列名に設定
rownames(baby) <- c(baby$product)

#商品名以外を再度取り出し
baby <- baby[,2:4]

#主成分分析を実行
#scale=Tは相関行列での計算
result <- prcomp(baby,scale=T)

 summary(result)
#Importance of components%s:
#                         PC1    PC2    PC3
#Standard deviation     1.2063 0.9330 0.8212
#Proportion of Variance 0.4851 0.2902 0.2248
#Cumulative Proportion  0.4851 0.7752 1.0000

Proportion of Variancとは、各主成分の寄与率を表し、
Cumulative Proportion とは、累積寄与率を表します。
各主成分の寄与率とは、その主成分で全体のどれだけを表せるかを示しており、
第1主成分~第N主成分までで、全体のどれだけを表せるかの表示となります。
今回のケースでは第2主成分までで77%を説明できることになります。
一般的にも70%を超えるまで主成分を取り出すことが目安になっています。

resule$rotation
#               PC1        PC2        PC3
#price    0.6385902 -0.1918353 -0.7452528
#weight   0.5982140 -0.4854510  0.6375557
#capacity 0.4840895  0.8529575  0.1952457

$rotationが主成分を表す固有ベクトルです。

result$x
#                            PC1        PC2         PC3
#Runfee ef            -1.3555083 -0.3347032  0.34179979
#PATTAN               -1.3742207  0.5686794  0.51548585
#Premige               0.6631685 -1.2076507 -0.84968911
#MECHACAL HANDY       -0.3616031 -0.1325712 -0.96859595
#NEMURIE               0.4879116 -0.5742262 -0.12697994
#LUXUNA Comfort        1.2294453  1.2064958 -0.98609744
#SMOOOVE premium       1.7452139  0.9801604  1.16819540
#magical air plus     -1.5209180  0.7904333 -0.08955709
#Air Buggy COCO BRAKE  0.4865108 -1.2966176  0.99543849

$xは主成分得点と呼ばれます。
Σ各固有ベクトル×各計測値で算出され、
固有ベクトルによって描画するにあたり、その座標の意味を持っています。

cor(result$x,baby)
#         price     weight  capacity
#PC1  0.7703448  0.7216382 0.5839673
#PC2 -0.1789771 -0.4529125 0.7957860
#PC3 -0.6119936  0.5235539 0.1603336

主成分と計測値との相関係数を求めることで、主成分負荷量を算出します。
この数値が大きいほど、各変数が主成分に与える影響力が大きいことを表します。
この例では、第1主成分と相関が高いのは同じ位で、price,weightで第2主成分ではcapacityです。

biplot(resule,choices=c(1,2))

f:id:anpontan382:20180108210607p:plain
biplotは個体と変数を重ねて主成分空間上に描画します。

この図を見ると、価格・容量が高い「ラクーナコンフォート」「スムーブ」グループと、重量・価格が高い「Premige」「エアバギー」グループ、安い「PATTAN」「マジカルエアープラス」グループがあることがわかります。

重量と容量などは似た数値なので、この例だとイマイチ結果から言えることが少ないですが、「走行性」「安全性」「重量」などそれぞれ異なる項目をうまいこと数値化できると、それぞれの性質ごとにグループ分けすることができそうですね。このくらいの商品数なら全部の数値を見ていっても自分にあったベビーカーを選ぶことはできそうですが、もしベビーカーが1,000種類位あって、そのデータが全部取れて入れば、まず主成分分析をして、自分が重視する商品グループ決めた上で、その中で一番合っている商品を選ぶみたいな活用ができるかもですね。

Google HomeとTwitterの連携が意外と楽しい!

 先日の記事、

 で、Google HomeTwitterの連携をしましたが、このGoogle HomeからTwitterを更新するのが、意外と楽しくて、このブログをPCで見たときのサイドバーにもTwitterのタイムラインを載せちゃいました。

細かい点ですが、いくつか改良を加え使い勝手を良くしたので、その辺をご紹介します。かなり縦長ですが、こちらがTwitterGoogle Homeを連携するIFTTTの設定画面。

f:id:anpontan382:20180107200434p:plain

①What do you want to say?

にはGoogle Homeでトリガーとなる発言を登録しますが、optional2つと併せて3つまで設定可能です。「twitter○○」「twitterに○○と投稿して」「twitterに○○と書く」の3つを投稿していますが、「投稿する」とか「書いて」とかみたいな微妙な違いでも投稿できないため、「twitter○○」が一番使い勝手が良いです。

Tweet text

には実際にツイートする文章を設定します。「TextField」がGoogle Homeに話した言葉ですが、それ以外にも、「 -from Google Home #2017aug_baby」というのを設定しました。

「 -from Google Home」をつけたのは、Google Homeが聞き間違いをしたりして意味不明のツイートをした場合、責任の所在はGoogle Home にあることを明確にするためつけました。それと当然だけど赤ちゃん語は、Google Homeが聞き取れないので、息子が「アンギャー」と言ったときに、それをツイートしようとしたら、こうなりました。

「ギャッギュ」と言ったときはこう。

そんな感じでわけわからん発言が多いので、悪いのはGoogle Homeですよというアピールですね。

「#2017aug_baby」は、同じ月齢のママ友作りのためのハッシュタグに使われることが多いらしいという話を妻から聞いたのでつけました。このハッシュタグから見に来た人がいたとしても、他のツイートが意味不明すぎてママ友になってくれないだろうけどね。

 

ともあれ、僕からでも妻からでも「OK google」でツイッターに息子の成長での気づきを書き込めるので、妻も事あるごとに「OK google」しています。

 

デメリットとしては、過去のツイートも3回に1回位は「うまく聞き取れませんでした」というエラーです。また長文だとほとんどエラー。この辺はもう少し精度が上がってくれると日記のような使い方もできるのかなぁ。

とはいえ今の感じでも、あとから見直したら楽しいものになりそうです。これからも普通の毎日をマメに記していきたいと思います。

 

 

【R】bitFlyerのAPIを操作 public API・borad編

ビットコインバブルに乗っかりまして、
仮想通貨取引所でおなじみbitFlyerの、開発者向けAPIを操作して、
億り人を目指します。

bitFlyer Lightning APIでは3種類のAPIが提供されています。
・HTTP Public API
→ログイン不要で、板情報、歩み情報等取引所が公表する値を取得出来ます。
・HTTP Private API
→ログインが必要で、入出金やトレードなど取引が行なえます。
・Realtime API
→板情報をリアルタイムに取得出来ます。

今回はRcurlを使ってPublic APIにアクセスしてみたいと思います。

#使用パッケージをインストール
install.packages("RCurl")
install.packages("rjson")

#ライブラリロード
library(rjson)
library(RCurl)

#エンドポイントを設定
endpoint <- "https://api.bitflyer.jp/v1/"

#パラメータに対応
getboard <- paste(endpoint,"getboard?product_code=BTC_JPY",sep="")

#json→リスト変換
json <-getURL(getboard)
board <- fromJSON(json)

#リストを分割してデータフレームへ
asks <- data.frame(do.call("rbind",board$asks))
bids <- data.frame(do.call("rbind",board$bids))

asks <- data.frame(unlist(asks$price),unlist(asks$size))
bids <- data.frame(unlist(bids$price),unlist(bids$size))

#askは降順
asks <-asks[order(asks$unlist.asks.price.,decreasing = TRUE),]

#それぞれを3列に修正
asks <- data.frame(asks,rep(0,nrow(asks)))
bids <- data.frame(rep(0,nrow(bids)),bids)

#askはpriceとvolmeを入替
asks <- asks[,c(2,1,3)]

#列名を統一
colnames(asks) <- c("ask", "price", "bid")
colnames(bids) <- c("ask", "price", "bid")

#結合
ita <- rbind(asks,bids)

jsonの扱いが初めてだったため、無理やり感が凄いですが、板情報のような形に出来ました。

f:id:anpontan382:20180104225355j:plain

適当に分析します。

 dim(ita)
[1] 5344    3
#約5000行のデータです。

#中値が178万位なので、150万以上200万以下で抽出してみます
sub <- dplyr::filter(ita,ita$price > 1500000 & 2000000 > ita$price )

#askの合計は1281BTC
sum(sub$ask)
[1] 1281.779
#bidの合計は1100BTC
> sum(sub$bid)
[1] 1100.294

売り圧力が強いため、今後の価格は下落方向でしょう!!!(錯乱)

スマホをベビーモニタにする

寝室の赤ちゃんの様子を確認する

数時間おきに寝て起きてを繰り返す赤ちゃんとの生活では、赤ちゃんが寝ている間にいかに他のタスクを進めるかが重要になってくる。その為、赤ちゃんのバイオリズムには常に目を光らせ、即時の対応が求められている。

僕ら夫婦は普段、朝早起きして各自のしたい作業を行うことにしているのだが、その間、僕らは居間、子供は寝室という状態となるため、10分おきに子供の様子を見に行き、起きていないか確認していた。

 これが結構手間だし、大人が動く物音で子供が起きてしまうということもあり、解決策ないかと色々と調べてみると、amazonではベビーモニタという商品で、赤ちゃんの様子を確認できるカメラとモニタが売られているようだ。

 双方向通信や子守唄機能もあるようだが、僕に必要なのは隣の部屋の映像が見れればいいだけなため、悩むところ、、そんなわけで更に調べるとスマホのアプリでも実現できることがわかった。

Track Viewでスマホを遠隔操作

TrackViewというアプリを導入すると同一アカウント内の端末同士でカメラの遠隔操作が可能になる。

複数スマホandroid or iphone)間やスマホとPC(windows or mac)間等、自由に連携が可能である。

僕は、使わなくなったandroidスマホを遠隔操作される側、居間のPCを遠隔操作する側として使用することにした。イメージはこういう感じになる。

f:id:anpontan382:20180101211051j:plain

イメージ図

設定方法はとても簡単、まずスマホとPCにTrack Viewをインストールする。スマホgoogle playストアから、PCはTrackView - Downloadからダンロードする。起動後、ログインを要求されるため、同一のgoogleアカウントでログインするだけだ。

f:id:anpontan382:20180101211845j:plain

 ログインしたそれぞれの端末に番号が振られ、操作ができるようになる。PC版の起動画面は上記の通りになっている。スマホの端末番号の横のカメラマークを押せば録画が始まる。

f:id:anpontan382:20180101212748j:plain

映っているのは最近お気に入りの絵本「ぶーぶーぶー」

画面の下のボタンで、カメラのイン・アウト切り替え、フラッシュの有無、回転、などもコントロールができる。PCで作業しているときは別のモニタを確認しなくても良いのが便利だし、可愛い瞬間は録画してPCに保存しておくことも可能なのは、専用ベビーモニタにはない大きなメリットである。

これによって僕の朝活の質は飛躍的に向上し、毎日の朝活が待ち遠しいほどになった。そして起床時間も5時から4時、3時と早まっていき、シエスタの導入を余儀なくされている。

そんなわけでTrack Viewは他にもスマホの場所を探したり音を出したりと、入れておくと色々と役立つことが多そうだ。でも悪用しちゃダメよ♡

追記

f:id:anpontan382:20180102084605j:plain

Track Viewは有料ソフトであるため、継続使用には課金が必要です。僕も使えなくなってしまいました。最低限でも月2ドル。今後どうするか迷うところです。

google Homeを子育てに活用するぞ

 
おひさ!

気がつくと、このブログも放置して半年が経ってしまいました。

そして年末の暇に任せて復活し、半年間放置の言い訳とかを書くことにしました。

そもそもRの小技集をメモするブログだったんで、言い訳とか書く必要もないっちゃあないんですが、この半年間で仕事でRを使う頻度がだいぶ減り、プログラミング意外の設計の仕事が増えたことで、今後もRの記事しばりが厳しそうという状況になりました。そしてこの半年での大きな出来事は第一子が生まれました!現在4ヶ月半まで成長しましたが、妻と2交代制で24時間監視体制を敷く必要が生じ、これも週末は1日中パソコンをいじっていた僕の活動パターンを大きく変えることとなり、「R筋」の放置が加速したのでした。まぁ可愛いからいいや。

google homeを買った

流行りに乗っかって買いました。買う前に想定していた使い方は、子供に色々な音を聞かせてあげようというものでした。

我が子お気に入りの「じゃあじゃあびりびり」という本がありまして、犬の声や水の音など様々な効果音が書かれているんですが、都度、google homeにその効果音を聞き、ただの読み聞かせではない、圧倒的リアル読み聞かせが可能になったと自負しておりますの!

じゃあじゃあびりびり (まついのりこのあかちゃんのほん)

じゃあじゃあびりびり (まついのりこのあかちゃんのほん)

 

 とはいえ、google homeは16000円程度ですが、効果音マシンだけだとこの値段はあまりおすすめできず、他にも子育てに活用できる方法はないかと色々と試しています。とりあえず定番は、LINEやTwitterと連携するというもので、それぞれ実用性を試してみました。

LINEの連携

google homeに話した内容をLINE Notifyというアカウントの発言として、通知させることが可能です。以下の記事を参考にしました。

yuki-no-yabo.com

つまづきやすいポイントとしては、google homeとLINEとを連携するIFTTTを設定した際、LINEに追加される「Line Notify」というアカウントを含めたグループをLINEで作成するということです。Line Notifyを招待するではなく、「招待」→グループ作成→メンバーを選ぶでやるんですよ皆さん!普段からグループLINE来ない人には分かりませんよお!

f:id:anpontan382:20171231163327p:plain

わっちゃんというのは僕の子供の名前

日付と内容から活用具合を察して頂きたいが、指を切り落とされた時でもなければ、実用性はあまりない。まず、「LINEで○○と送って」という予め決めた命令文を必ず使う必要があり、接続詞が違っていても正しく認識出来ない。また、文面を送る前に確認することが出来ず、変な日本語のLINEが送られることも多い。妻が何度か試し、ある程度要領を得た結果、上記のLINEが外出中の僕に届いたが、それ以降使われることはなかった。

Twitterの連携

これも上記の記事を参考にIFTTTですぐに実現できた。僕はtwitterのアカウントがなかったので、新規に作成した。twitter自体を今日から始めたので実用性は未知数だが、例えば子供を抱きながら、ふと感じた子供の成長を口に出す時、文章の前後に「twitterで○○と投稿して」という独り言にすれば、それがこうなる。 

習慣になれば、気楽に何気ないことを記録していくことができるんじゃないでしょうか。それで、あとから子供の成長と併せて振り返ると楽しいんじゃないかなと思う。

 
 

 

 

【R】quantmodでファイナンスデータを取得

ファイナンスデータの取得・分析に強いquantmodのget系関数でできることをを挙げます。

toyota <- getSymbols("7203",src="yahooj",auto.assign=FALSE)

参考:
www.dmjtmj-stock.com

getSymbols.yahooj()を使って
getSymbols('7203.T',src='yahooj')でも可能ですね。

トヨタの10年間の4本値

YJ7203.Open YJ7203.High YJ7203.Low YJ7203.Close YJ7203.Volume YJ7203.Adjusted
2007-01-04 8110 8140 8060 8090 6986200 8090
2007-01-05 8100 8100 7860 7900 10876000 7900
2007-01-09 7900 7930 7810 7870 9750900 7870
2007-01-10 7890 7890 7660 7690 11632000 7690
2007-01-11 7750 7790 7630 7660 10417100 7660
2007-01-12 7740 7840 7720 7820 11302500 7820


getFX("USD/JPY")

過去半年間の為替レートが取得できます。

USD.JPY
2017-03-01 113.4712
2017-03-02 114.1899
2017-03-03 114.3148
2017-03-04 114.0033
2017-03-05 114.0050
2017-03-06 113.8457

getDividends("IBM", from = "1970-01-01", to = Sys.Date())

1970-01-01からのIBMの配当データが取得できます。
東証の株価データの取得については分かりませんでした。。

getFin('NASDAQ:AAPL')
viewFin(NASDAQ.AAPL.f, "CF", "A")

4半期分のファイナンスデータが取得できます。
Google Financeから取得しているとのことですが、
こちらも東証については取得方法がわからず…

2016-09-24
Net Income/Starting Line 45687
Depreciation/Depletion 10505
Amortization NA
Deferred Taxes 4938
Non-Cash Items 4210
Changes in Working Capital 484
Cash from Operating Activities 65824
Capital Expenditures -13548
Other Investing Cash Flow Items, Total -32429
Cash from Investing Activities -45977
Financing Cash Flow Items -1163
Total Cash Dividends Paid -12150
Issuance (Retirement) of Stock, Net -29227
Issuance (Retirement) of Debt, Net 22057
Cash from Financing Activities -20483
Foreign Exchange Effects NA
Net Change in Cash -636
Cash Interest Paid, Supplemental 1316
Cash Taxes Paid, Supplemental 10444
2015-09-26
Net Income/Starting Line 53394
Depreciation/Depletion 11257
Amortization NA
Deferred Taxes 1382
Non-Cash Items 3586
Changes in Working Capital 11647
Cash from Operating Activities 81266
Capital Expenditures -11488
Other Investing Cash Flow Items, Total -44786
Cash from Investing Activities -56274
Financing Cash Flow Items -750
Total Cash Dividends Paid -11561
Issuance (Retirement) of Stock, Net -34710
Issuance (Retirement) of Debt, Net 29305
Cash from Financing Activities -17716
Foreign Exchange Effects NA
Net Change in Cash 7276
Cash Interest Paid, Supplemental 514
Cash Taxes Paid, Supplemental 13252

getMetals("gold")

金/ドル相場
https://www.oanda.com/lang/ja/
から取得します。

getOptionChain()

http://secwords.com/%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%BB%E3%83%81%E3%82%A7%E3%82%A4%E3%83%B3.htmlsecwords.com
だそうです。

getQuate()

現在の株価を取得できます。
今日は日曜日なので試してないです。

getSymbols.csv
getSymbols.FRED
getSymbols.google
getSymbols.MySQL
getSymbols.oanda
getSymbols.rda
getSymbols.SQLite
getSymbols.yahoo

その他ソースを指定して取得する関数たち