雑記帳

日常を綴っていきます

社会に出るのってヤバくないですか?

春休みに入ったが基本的に暇なのでバイトばかり行っている。朝10時頃に出社し、夜20時くらいに退勤し、家に帰ってビールを飲みながらモンハンをするような毎日を送っているのだが、ある時ふとこう思った。

「社会に出た後ってずっとこういう生活なのでは?」

もちろん、社会に出た後でも色々なイベントはあると思うが、それでもやはり学生時代と比較すると頻度は少ないだろう。このまま行けば僕は数年後、朝出社し、虚ろな目で仕事をこなし、疲れ果てた体で満員電車に揺られ、誰もいない冷たい自室でストロングゼロを飲みながら消耗していくような人間になっていくかもしれない。こうなってしまうともう生きていく意味を見出すのが難しくなってくる。自分がよく恋愛にはあまり興味がないが結婚はしたいと言っているのはこれを防ぎたいがためだ。結婚し、妻子を持つようになれば、彼彼女の生活を支えるという目標の元に自分を散らす事が出来る。しかし独身だとどうだろう。独身生活を楽しんでいる人も多くいるのは知っているが、自分は孤独とうまく付き合っていく方法を知らないため、彼、彼女らのように幸福を造り出すことが出来ない。酒を飲み、嫌な感情を「虚無」で上書きすることしか出来ない。虚無は幸福と異なり、後にも先にも何も残らない。

近頃、某大手新聞社の電子版にて、「誰かと一緒に暮らすという時代は過去のものになりつつあるため、孤独と向き合う方法を身に着けよ」といった旨の記事を見た。これからどんどん独身者は増えていき、結婚しないことが当たり前の時代になってくるらしい。しかし、誰しもが孤独とうまく付き合っていく事が出来るとは思えない。このまま人生のパートナーを持たない人間が増えていき、世のデジタル化も相まって、ついには人間は単なる社会の歯車でしかない冷たいロボットになってしまうのではないかと思う。結局、人間は動物である以上、SNSなどではなく、対面で他愛もないコミュニケーションを取り続ける事が必要であるが故に、独身が許容されてしまう社会というのは一刻も早く捨てねばならないと感じる。

社会人になると基本的に人と人との繋がりが薄くなってしまう。こうなると腹を割って話せる人生のパートナーがいないと冷たいロボットになってしまう。もちろんそうならない人もいるだろうが、自分は間違いなくロボットになるだろう。上記のような事を数日考えているとやるせない気持ちになってしまい、結局自分が生まれてきた意味ってなんなんだろうとか考えたり、やりたいことはもう大体やってそれなりに満足している今人生が終わってもいいやといったネガティブな思考に走ってしまう自分が寂しい。もう少し余裕のある考え方が出来る人間になりたいと思う。

昨年度の振り返りとか今年の目標的な

大学生活

まあ順調だった。去年より全体的に楽になった。というか勉強をほとんどしていない。回路の勉強とかするのが苦痛。というより微塵も興味がない電気工学的な分野に時間を割きたくない。必修に電気系の科目据えるの勘弁して。

技術的な何か

Web開発がメインだった。大半Ruby on Rails書いてた気がする。たまにReactやったり。下半期はずっとPython書いてた。機械学習とかそういうのが多かった。サークルでのゲーム制作でUnity書いたりもした。ちなみに前職(サービス開発系イケイケベンチャー)は12月付けで退職した。今年は某大手でビッグデータとか機械学習的なのやるかも。

今年の目標

論文とか読む機会増えて英語力の足りなさを実感したので英語の勉強したい。というかいい加減にTOEICを受けねば....一回も受けていないのは不味い気がする。技術面は業務で使う技術の習得がメインになると思う。あと政治経済的な知識を深めたい。(卒論とかはそっち系の研究したい感があるため) あとはkaggleのコンペにちょくちょく参加したり。Web開発は去年やったから今年はあんまり触らない方向で。(とかいいつつ今はRuby on Railsを書いている。)

近況的な

帰省でパソコンを東京に置き去りにしてきたのもあって、もともと買い替えたいとおもってたラップトップを買い替えた。MacBookPro 15-inch(mid 2017)にした。新年早々ウン十万飛ぶのはなかなか心臓に悪いもんですね。ただ快適さが段違いなのでいい買い物をしたと思う。

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

みなさんこんばんは。

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

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

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

 

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

アルゴリズムについて

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