R筋

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

【python】bitflyerのAPIを操作 public API・chat編

コインチェックの流出事件から1週間がたちました。この事件を発端にネム以外の仮想通貨も乱高下しています。世の中の大半はそこまで混乱していないみたいですが、コインチェックにお金を預けていた人はもちろん、コインチェック以外の取引所でも仮想通貨の取引をしている人達はまだまだスリリングな日々を過ごしていることでしょう。
bitflyerのチャット履歴を取得して関係各位の混乱を確認いたしましょう。

今回は、チャットに様々な文字列が入ってくるせいで、Rを使うとエラーが起きやすくpythonで取得することにしました。pythonはpybitflyerというbitflyeAPIを簡単に取得できるパッケージがあるため、こちらを使います。

import pybitflyer
api=pybitflyer.API()
chat = api.getchats()
print(chat)

[{'nickname': '実穂ノア♚world🍀LOVE💑', 'message': '皆で稼ぐw', 'date': '2018-01-30T01:29:43.68'}, {'nickname': 'はじめてのお取引', 'message': 'おわりじゃああビットのおわりじゃあ', 'date': '2018-01-30T01:29:44.993'}, {'nickname': '利確', 'message': '現物', 'date': '2018-01-30T01:29:45.92'}, {'nickname': 'こころぴょんぴょん🐰', 'message': 'ぴょぴょんぴょん🐰', 'date': '2018-01-30T01:29:46.793'}, {'nickname': '大根38円', 'message': 'mecyべえww', 'date': '2018-01-30T01:29:48.607'}, {'nickname': 'からだすこやかちゃ〜', 'message': '濃いや', 'date': '2018-01-30T01:29:50.08'}, {'nickname': 'Lチキン', 'message': 'Low', 'date': '2018-01-30T01:29:53.083'}, {'nickname': 'てやんでぃ', 'message': 'あがるパワーはない', 'date': '2018-01-30T01:29:55.963'}, {'nickname': 'みどり🍀', 'message': 'てかリバるんかこれ?www', 'date': '2018-01-30T01:29:56.09'},......

こちらもjson形式で、発言時間、名前、発言内容がとれます。
途中で省略しましたがパラメータを指定しない場合5日前からの発言を取得しますので40メガバイトほどのデータでした。
pandasで整形しています。

import pandas as pd
chat2 = pd.DataFrame(chat)

f:id:anpontan382:20180204120414p:plain
f:id:anpontan382:20180204120453p:plain

5日間で30万件のデータでした。
うーむ内容ゼロ!

コインチェック”,"coincheck","CC"の文字列を含む発言を取り出します。

chat2[chat2["message"].str.contains('コインチェック')|chat2["message"].str.contains('coincheck')|chat2["message"].str.contains('CC')]

f:id:anpontan382:20180204121527p:plain

3,772件でした。
5日間の全履歴の内、約1%はコインチェック関連の発言ということですね。

ちなみに、一番書き込みしている人は誰かを調べてみましたら、

chat2["nickname"].value_counts()

いなごflyer 6105
First order 2913
スキャルプD@バイオプ 2573
チョレイ 2517
☺🐰🐈 Sofia🕊@sofia_bitfx🐮🐻@ピコ 2435

「いなごflyer」さんが圧倒的なコメント量でした。
気になって「いなごflyer」で検索すると、こんなサイトが
inagoflyer.appspot.com
どうやら世界中の取引所の売り数量・買い数量を比較できるようです。取引所ごとにAPIを取得しなくても、すべて見れるというのが凄いですね。また、一定のボリュームを超えたときに音で教えてくれるみたいです。
これを見ながら一気に大きな圧力がかかった方向に便乗する短期売買をしてみるのも楽しいかもね。

家庭内LAN楽しいなランランラン♪

先日の記事

で、スマホアプリのベビーモニタを使ってみたものの、有料だわスマホのカメラじゃ暗闇だと何も訳に立たんわでほとんど実用性はありませんでした。しかし僕は赤ちゃんが寝た後どうしても別室で自由を謳歌したく、結局、暗闇でも使えるネットワークカメラをポチってしまったのでした。

 早速wimaxルータに接続してみるとこいつはすげぇ!赤外線カメラなので暗闇の中でも赤ちゃんの目が開いているか閉じているかまではっきりわかるではありませんか。

またこれは動きを感知する機能があり、常にモニターしていなくても赤ちゃんが動いたときは通知で教えてくれるため、夜中に起きてもすぐに教えてくれるのです。

そんなわけで僕は7,000円で自由を手に入れました。

手に入れた自由時間に僕は考えました「ネットワークカメラって凄いなぁ~楽しいなぁ~もっと色々なものをネットワークにつなげたいよおおお!!!」そして気がつくとルーターをポチっていました。

BUFFALO 11n/a/g/b 300プラス300Mbps 無線LAN親機 WZR-600DHP3

BUFFALO 11n/a/g/b 300プラス300Mbps 無線LAN親機 WZR-600DHP3

 

 これでいろいろと楽しいことができるようになったわけですが、ひとまず我が家のネットワークの全体像を示すとこんな感じです。

 

f:id:anpontan382:20180121230150p:plain

 

活用例を何点かご紹介します。

NAS

ルーターを選ぶ上で重要だったことはUSBストレージがあることで、データバックアップ用に買った3Tの外付けHDDがあるんですが、有線を都度PCに接続してバックアップを取るということが面倒なため、ほとんど使われずに放置していました。

この度ネットワークストレージとして復活を遂げ、家庭内の各端末からのアクセスが可能となったため、バックアップのみならず妻との共有フォルダ、動画のストリーミング視聴などが気軽にできるようになりました。

②ネットワークカメラ

前述の商品です。アプリを導入することで、PC、スマホから視聴ができるようになります。またこの商品の凄いところは、インターネット上のクラウドにも送れるため外からスマホでカメラの映像を確認することもできます。

リモートデスクトップ接続

使わなくなったPCのIPを固定しリモート接続し、さらにwi-fi機能がないテレビと接続してみました。使いみちは今のところ未定です。このPCから、自分で撮った赤ちゃんの画像をテレビに流したりすることを考えています。

将来的には、ポートを開放して自宅サーバにしたいなぁ。

 

この図の他にも妻のPC、スマホタブレットなど10以上の機器をネットワークにつなぎ、トラフィックを監視しながらニヤニヤしています。

今後やってみたいこととはこんな感じです。

・スキャナーで重要書類をスキャンして共有ストレージに保存する。

・外から自宅サーバからキックしてgoogle homeを喋らせる

スマート家電も赤外線家電もGoogle Homeでまとめて操作 - Qiita

Raspberry Pi

などなど。

必要な機器を取り揃えたら果たしていくらかかるかな…自由の代償はでけぇなぁ

【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ドル。今後どうするか迷うところです。