雑記帳

日常を綴っていきます

ディープラーニングを用いた仮想通貨価格の予測

みなさんこんばんは。

さて、本題に入りますが、昨今の仮想通貨市場は非常にアツいものがありますね。今年に入って、様々な仮想通貨の価値が暴騰してウハウハな人もいるかと思われます。このような状況下にあるため、当然投資家の数も鰻登りなわけでして......その投資家の中には、「全て自動で取引をさせたい」と考えているものぐさな投資家もいるのではないでしょうか。結論から言いますと、そういった人たちは恐らく機械学習を用いて価格変動の予測といった大仰な事はしていません。何故なら、仮想通貨の価格変動はランダムウォークであり、機械学習を用いても価格変動を予測することはかなり難しいからです。本当に価格変動の予測から一攫千金を狙いたいのであればこのような記事の情報など鵜呑みにせず、研究に励んでいただきたいです。

それなのに今回、どうして私がこのような事をやるに至ったかといいますと、単純に機械学習でどの程度価格変動を予測することが出来るかという技術的な面に興味があったからです。決して「なにもしなくてもお金がほしい」なんて野心を抱いていたわけではありません。

それでは、今回は私が組んだ予測プログラムの簡単な解説をしていきたいと思います。

 

なお、本記事の情報を元に取引を行い、いかなる損害を被ったとしても筆者は一切責任を負いません。

アルゴリズムについて

 今回は予測にRNNの一種であるLSTM(Long-Short Term Memory)を用いました。LSTMの詳しい理論に関しては、私よりも頭のいい方ががわかりやすい記事を書いてくださっているので割愛します。

qiita.com

モデル構成としては以下のような感じになります。特に工夫している点はありません。

f:id:shikugawa:20171207101609p:plain

ハイパーパラメータの調整に関しては今回はベイズ最適化を使用しています。ハイパーパラメータの最適化に関してはグリッドサーチやベイズ最適化がよく知られているものかと思われますが(私はこの二つしか知りません)、グリッドサーチは候補として挙げられるパラメーターで総当り的に計算していく為に、あまりにも学習に時間がかかってしまいます。ベイズ最適化は特に、「形がわからない関数」の最適解を求める手法の一つなのですが、機械学習においては候補として挙げられるパラメーターの中から、大域的最適解となりうるパラメーターを獲得関数を用いて検出し、モデルのハイパーパラメータに適用するといった計算時間が短縮できる手法になります。詳しい理論については難しくてわかりません。私は数学が苦手なので、数学に自信がある方は色々調べて私に噛み砕いて解説して頂けるとありがたいです。

今回はLSTMを用いた実装しかしていないのですが、Convolution1Dを用いたCNNによる時系列データの予測法とかQRNNという最新のRNNを用いた手法等も存在しているみたいなのでいつか試してみたいです。今はkerasがあるのでこういうのの実装も楽です。

データの加工

当初はデータはCryptowatch APIを用いて収集していたのですが、短期スパンのデータを収集するに当たってはAPI側の制限に引っかかってしまうためにやめました。

Public Market REST API - Cryptowatch

代わりにこちらを用いました。

Bitcoin Historical Data | Kaggle

これめちゃくちゃすごいです。なんと三年前からのCoincheckのBTC/JPYの一分足時系列データです。私の友人が見つけてきてくれたのですが最初見た時ひっくり返りました。

しかし、このデータセットではあまりにもカラムの要素数が少ないです。今回私は取引時間帯と幾つかのテクニカル指標を追加しました。

取引時間帯

為替においては一般に取引が盛んな時間帯、盛んでない時間帯というものがあります。これは仮想通貨においても例外ではないでしょう。そこで、カラムに定義されているタイムスタンプから時間を算出してhourカラムとして定義しました。

テクニカル指標

テクニカル指標とは、為替において過去のデータから算出された様々な指標のことであり、テクニカル分析に使われます。為替に明るくない人でも移動平均線とか名前だけは聞いたことがあるのではないでしょうか。

今回実装したのはボリンジャーバンド一目均衡表(の中で使われる転換線)です。

ボリンジャーバンドとは?

 (過去25日分の移動平均) + n * (過去25日分の標準偏差) で表されます。nには任意の整数が入るのですが、一般にはn=1, 2が使われます。このボリンジャーバンドを突っ切っていると買われすぎ、売られすぎといった指標を判断することが出来ます。これ自体はpandasのrolling関数で楽に実装出来るのでオススメです。

一目均衡表とは?

非常に広く使われているテクニカル指標の一つであり, 基準線, 転換線, 先行スパン, 遅行スパンで構成されます。比較的長いスパンでの取引に適しているらしいです。今回は基準線しか実装していないのですしていないのですが, 後に全部実装していきたいと思います。はい。

結果

正解率は大体68%です。ダメですね。これを実運用したら間違いなく損しますので当ブログで紹介したコードを用いて取引したい人は自己責任でお願いします。破産しても知りません。

イキリグラフ

f:id:shikugawa:20171209000412p:plain

学習効率最悪です。ディープラーニングやめたい。

計算グラフ

f:id:shikugawa:20171209000448p:plain

その他グラフ

f:id:shikugawa:20171209000613p:plain

ソースコード

ブログ記事用

Unityで2Dゲームを作ってみた話

私は大学でゲーム創作サークルに入っていたが、1年時はゲームを製作しなかった上に個人でも一度もゲームを作ったことがなく、ゲーム製作に関しては未経験だった。私たちのサークルではUnityがゲームエンジンとしては主流である。しかしもちろん私は一度もそれに触れたことがなかった。


そんな僕が今年はUnityを使った2Dアクションゲームを製作することになった。


丁度2ヶ月前、Unityに慣れる為にチュートリアルを見ながら適当なゲームを作ってみた。Unityは確かに僕のようなド素人でも数日あれば簡単なゲームが作れることがわかり感動した。


そして本題のアクションゲームの製作に取り掛かった。ただ、私はUnityの機能を何一つ知らなかった為にスクリプト側で無理矢理な実装を施していることがほとんどであり、経験者である友人達に色々教えてもらい知見を獲得した。

こういったUIを制御するようなアプリケーションをほとんど作ったことがなかった為に、コルーチンといった概念の理解に苦労した。

また、効率的なプログラムの設計というのがうまく出来ていなかったために機能追加が非常に困難だったり、Unityによるゲーム製作を通して今まで意識することのなかった事柄の習得に大いに貢献できたと思う。


改めてUnityのすごさを実感したので個人で何か作ってみたいと思った。

Unityによるゲーム製作は大規模なプログラムを構築する上でのエッセンスが凝縮されているように思うので、ゲーム製作に興味がなかったとしても、例えWebエンジニアであったとしても試しに何か作ってみることをオススメする。

私にとってのプログラミング

私は今、大学において情報科学を専攻する身であり、将来はエンジニアかなんかになるんだろうなあと漠然とした将来図がある。

思えば、自分がプログラミングをしようと思った決定的な出来事はなかったように思う。高校二年生の時点で、何かTwitter APIを使った小さいプログラムを書いていた。自分が初めて書いたコードはRaspberry Piの状態をTwitterに通知するといったものだったように思う。

当時の自分は何か新しい事をしたい。周囲と違った何かをしたい。という思いでいたのだと思う。事実、プログラミングを拙いながらも習得した自分は、学業に専念する周囲の人々とは違った存在になれている感じていたかもしれない。そして、漠然と、大学は情報系の学科に進もうと決めた。

私が結局進学した大学は、二年から学科に配属される。一年時は共通科目で線形代数やら解析やらを学んだ。一年時に教わった数学は難解なもので、全く理解できなかったため、勉強を放棄した。自分が理系に来たことすら間違いだったのではないかとすら思うようになっていた。事実、一年時は成績も大して良くなく、その結果が自分の無気力に拍車をかけた。もうその時点では、高校生の頃に抱いていた、「情報科学を学びたい」という気持ちは風前の灯火程度であったように思う。自分のGithubのContributionsを見ても分かるように、ほとんどコードを書く気力なんてなかった。

そして、配属学科を選択することになった。結局、情報系の学科に進むことになった。自分はその時点では、サーバーやらネットワークといったインフラ寄りの技術にしか興味がなかったために、インフラ寄りの勉強を頑張ろうと思っていた。丁度この頃に、自分は都内のベンチャー企業で働き始めた。自分はRuby on Railsを書くことになった。Ruby on Railsのコードを書くのは楽しかった。何故楽しかったのかを説明するのは難しいのだが、とにかく楽しかった。わからないなりに色々調べてコードを書く楽しさ、高校生でプログラミングを始めた頃抱いていた感情を思い起こされた。

情報系の学科は、自然とプログラミングが出来る人は出来る人で固まっていく。自分の周りにはとても技術力の高い人が多かった。そういった人たちと共に講義を受ける日々で自分のプログラミングに対する情熱は俄然、上がっていった。GithubのContributionsを見てもこれは明らかで、二年が始まった数ヶ月で昨年度書いたコードの量を凌駕していたと思う。

 しかし結局、学科の勉強ですらこれは自分が学びたいことと直結しているのかと疑問を抱くようになった。アルゴリズムとデータ構造の講義では競技プログラミングの問題が課題となっていたのだが、自分は優秀な周りの人々と比べると解けているとは言い難かった。自分はやはり才能がないのではないかと思うようになった。そして、自分は本当にこのままプログラミングの道を志していいのだろうかと感じるようになった。競技プログラミングのような、複雑なアルゴリズムを考案する能力のない自分は理系に来たことが間違いだったのではないかと再び思うようになった。

結局、自分は興味があったサーバーやインフラの知識が周囲より勝っていただけで、プログラミングそのものの技術は他の人々より低かったのだ。これは自分が今までそういった勉強をなにも行ってこなかったからだという結論に至った。優秀な人達は、毎日競技プログラミングの問題を解いたり、書籍を読んだりしていて、相応に努力していたのだ。

そして、自分にとってプログラミングって何なんだろうという疑問に至るようになった。自分はプログラミングが好きか?と問われると間違いなくノーと答える。別にプログラミングそのものが好きなわけではない。

では何故プログラミングしているのか?

それは、自分が成し遂げたい事を実現する手段がたまたまプログラミングであったからだ。プログラミングという行為は手段にすぎない。

PyConJP 2017 に参加した話

私はPythonを書くことはめったになく、大概の事をRubyで済ませてしまうRubyオタクなのだが、PyConが弊大学で開催されるとのことで、先着20名がタダで参加できる事になっていたために、タダ飯を食らえたらそれで良いといった気持ちで参加を臨んだ。拝聴した公演は以下のものである。

一日目

・野球を科学する技術〜Pythonを用いた統計ライブラリ作成と分析基盤構築

Pythonで大量データ処理!PySparkを用いたデータ分析のきほん

Djangoフレームワークのユーザーモデルと認証

PythonとRを行ったり来たり

Pythonによる文章自動生成入門!Python ✖︎ 自然言語処理 ✖︎ ディープラーニング

・プロダクト開発して分かったDjangoの深~いパーミッション管理の話

Python機械学習によるWebセキュリティの自動化

二日目

Pythonで実現する4コマ漫画の分析・評論 2017

・The theory of Serverless development by Python (理論から学ぶPythonによるサーバレス開発)

・Geospatial data analysis and visualization in Python

・ディープニューラルネット確率的プログラミングライブラリEdward

Pythonにおけるデバッグ手法

AWS APIGateway + Python Lambda + NEologdで作るサーバレス日本語形態素解析API

総括

自分はデータサイエンスやサーバーサイドに興味があったのでそういった話に偏っているが、公演全体を通して、少しPythonに関心を持つようになったと思う。Rubyはカッコいいけどガバガバ言語なので他人の書いたコードが解読不能になったり、バグが意味不明な箇所で起こってたりすることが多いので、Pythonのようにシンプルな構文は集団開発ではかなり有効だと感じた。ただ、Pythonは日本語ドキュメントが少なめなので、英弱である私にとってはかなりつらいものになりそうなので、まだまだ使っていくことはないんだろうなと。ただ、今流行りのマイクロサービスアーキテクチャだったりディープなラーニングだったりを実現するにはPythonしかないので使いこなせるようにはなりたいと思った。ハッカソンに出た時にサーバーサイドで画像処理とかしたいし。

Cookpad Ruby Hack Challenge に参加した話

8/30~31にクックパッド本社で開催されたRuby Hack Challengeとやらに参加してきました。僕は普段Rubyを一番使っており、馴染みの言語の裏側を知りたいという想いで臨みました。

一日目

Rubyコミッターの笹田さんの作成した講義資料を読みつつ、MRIの実装についての理解を深めていくという内容でした。中身はもちろんガッツリC言語だけど、大学の講義でC言語を使っているので分かるのか....と思いきや、MRIのC APIリファレンスがあまりなくて理解するのに結構苦労しました。

二日目

一日目に学んだことを活かしつつ、自分で決めた課題をこなすという内容でした。僕は、実行中のメソッドの可視化機能の実装をしようと試みていたのですが、Rubyの標準ライブラリとしてTracePointという実行中のメソッドを表示する機能が提供されていたので僕の出番はありせんでした。恐るべしMRI、ってことで仕方ないので僕はTracePointのラッパーgemを書きました。

Easytrace

実行メソッドをグラフにして可視化出来たりしたら面白そうなので今後の機能追加項目として検討します。

二日目はRuby開発者のまつもとゆきひろさんがいらっしゃってRubyの設計思想について話して頂いたり、Rubyのコミッターの方々が大勢いらっしゃって、Rubyの実装について壇上で白熱した議論を交わしたりしていました。名だたるプログラマー達がは議論を戦わせる様は圧巻で、感動物でしたね。

総括

いままで中身を気にせずにRubyを書いており、中身を弄るのは怖いと思っていたのですが、このイベントを通して中身を見ることに対するハードルがが下がったように想います。とても充実した二日間でした。クックパッド社は雰囲気がとても良く、来年はインターンに参加してみたいと想いました。

いろんなとこに行ってた話

この二週間で北海道を含め、実家への帰省として兵庫、大阪に行ってたり、四年間文通を続けてきた彼女に会うために和歌山県に行ってたり、とにかく日本中を駆け回ってました。この二週間、ほとんど鈍行に揺られており、二週間のうち3分の1は電車の中で過ごしていたと言っても過言ではないくらいです。慣れって怖いもので、大阪〜東京間の鈍行移動で何も疲労感を感じていないのです。

と言うわけで、長い旅が終結したので明日からサボってた日報を再開します。

 

 

 

 

 

 

 

 

 

 

 

 

 

追記: 四年間文通を続けてきた和歌山県在住の彼女と言うのは僕の脳内に棲みつく観念的存在であると言えます。

青春18切符北海道紀行 2日目

青春18切符北海道紀行2日目、という事で今日は函館から札幌までの移動。この移動、実はかなり壮大な旅だったりする。北の大地の雄大さを感じた一日だった。

本日の移動

f:id:shikugawa:20170813232650p:plainざっとこんな感じ。函館、札幌以外の停車駅はほとんどが昭和の匂いを感じさせる、時代に取り残されたが如く装いであった。海岸沿いの駅は海風で錆びていたり、それはもう、人から見放され、打ち捨てられていると表現してもいいくらいだ。本日の停車駅からめぼしい場所を三つ、ピックアップしていく。

1

函館駅から単両のワンマン運転気動車で揺られることn分。地図ではわかりにくいが、森駅という駅に到着する。JR函館本線函館発長万部行の列車に乗ったのだが、何故かこの森駅で30分ほど停車したので降車して駅をぶらりと。

f:id:shikugawa:20170813233428j:plainとは言っても何もない。清々しいほど何もない。在るのは眼前に広がる大海のみである。天気はあいにくであるが、このような天気の方が最果ての大地っぽくて雰囲気が出てよい。

2

森駅から更に揺られること1時間半程、長万部駅に到着。この駅、おしゃまんべと呼ぶらしい。いかにも北海道らしい地名である。

f:id:shikugawa:20170813234132j:plainさて、この駅も周りには何もない。森駅と違い、大海ではなく、東京○△大学長万部キャンパスが広がっているらしい。大学に入学したばかりの浮足立った新入生達をこのような最果ての地に輸送する東京○△大学、鬼畜の所業だ。東京で育ったシティーボーイ達の中には発狂する者までいてもおかしくはない。

閑話休題。旅の話に戻そう。丁度この駅に到着したのが昼頃だったのでここでお昼を頂くことに。

f:id:shikugawa:20170813234542j:plain

駅前に立つかなやレストランのかにカレーを頂く。このレストラン、どうやら歴史の長い地元の名店らしい。閑散とした町並みとは不釣り合いな程店内は客で賑わっていた。しかし、店の装いは時代の取り残された街の雰囲気と変わらない、どこか懐かしいものを感じさせる装いだ。この店ではかにめしが人気らしいが、私はかにカレーに目がとまったので敢えてこれを注文したのだ。店の雰囲気に違わず、家庭的な温もりを感じさせる味であった。

3

長万部からまたまた2両編成の気動車に揺られ、小樽を経由し、札幌に向かう。札幌は今まで通り過ぎてきた町並みとは打って変わって、近代的な装いの町並みだ。碁盤の目のように整理された区画は開拓時代の名残を感じさせる。

やっぱり札幌といえばラーメンっしょ!w

って事でラーメンが大好きな私は真っ先に味噌ラーメン屋に向かう。

f:id:shikugawa:20170813235417j:plain

札幌駅から少し離れた場所にある空という店のチャーシュー麺(味噌)、トッピングのバターを載せて頂く。程よくきいた味噌の香りとチャーシューの柔らかさが堪らない。気がつけば完飲していた。ごちそうさまでした。

そしてすすきの駅周辺を経由し、大通公園へ。ここでは各所でビアガーデンが開催されており、祭囃子が鳴り響いていた。どうやら夏祭り?を開催しているようだ。祭囃子に引かれて盆踊り会場に向かう。

f:id:shikugawa:20170814000007j:plain

テレビ塔と盆踊り会場を一緒に載せて一枚。この写真は一眼レフで撮りたかったのだが電池が切れてしまっていたために断念。少し残念だったが、祭囃子を聞いているとそんなモヤモヤも吹き飛んでしまう。まさに夏の風物詩。都会の喧騒を彩る、懐かしき旋律。会場の賑わいを後に、札幌名物の時計台に向かう。

f:id:shikugawa:20170814000256j:plainこじんまりとしているが、白塗りの舎は明治時代の面影を感じさせる。時間が遅かったが、中で吹奏楽コンサートが開催されていたために入ることが出来た。どうやらこの時計台は定期的にコンサート等で用いられているらしい。

 

ということで、今日はこのあたりで。明日は札幌から帯広まで移動します。