社内勉強会用　Let's 不労所得

## 不労所得とは？

それを得るために労働する必要がない所得のこと。 労働の対価として得る賃金・報酬以外による所得を指し、働かずとも得られる収入または収入源という意味で用いられることが多い。

--- 

## ほしい。

---

## 手段

弊社は副業が許されている・・・やるしかない。
でもどうやるか？？

- 株
- 資産運用
- 仮想通貨
- アフィリエイト
- **エンジニアリング**

--- 
## せっかくなので勉強しながらやる

金になるものを作ろう。どうせなら流行りの技術など学びたい・・・
ということでとりあえず勉強した。

- [Coursera Machine Learning](https://www.coursera.org/learn/machine-learning)
- 知り合いのフリーランスたちと[ゼロから作るDeep Learning](https://www.oreilly.co.jp/books/9784873117584/)を輪読 
- 読んだ
    - [詳解ディープラーニング TensorFlow・Kerasによる時系列データ処理](http://s0sem0y.hatenablog.com/entry/2017/06/25/025725)
    - [戦略的データサイエンス入門 ―ビジネスに活かすコンセプトとテクニック](https://www.amazon.co.jp/%E6%88%A6%E7%95%A5%E7%9A%84%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%82%B9%E5%85%A5%E9%96%80-%E2%80%95%E3%83%93%E3%82%B8%E3%83%8D%E3%82%B9%E3%81%AB%E6%B4%BB%E3%81%8B%E3%81%99%E3%82%B3%E3%83%B3%E3%82%BB%E3%83%97%E3%83%88%E3%81%A8%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-Foster-Provost/dp/4873116856)

---

## でやってみた。

[Deep LearningでBitcoinの価格予測をやってみる](http://qiita.com/jumbOrNot/items/5b213ebba290b68b1e52)
今日はこの記事の説明と追加＋補足

---

## Q. ディープラーニングとは？

A. ニューラルネットワークと呼ばれる入出力を持った回路を組み合わせ、レイヤーと呼ばれる構造に分ける。このレイヤー内のニューラルネットワークに値を渡して出力を得る。

例） 猫認識
![image.png](https://qiita-image-store.s3.amazonaws.com/0/31237/1a19159f-f498-3787-ceff-ed909687099f.png)

[参考](https://www.google.co.jp/search?q=%E7%8C%AB%E7%94%BB%E5%83%8F+%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0&source=lnms&tbm=isch&sa=X&ved=0ahUKEwiq7szYkKLWAhWIWLwKHSvfDkEQ_AUICigB&biw=1920&bih=983#imgrc=q3KNySOTYAhkIM:)

---
## Q. 機械学習との違いは？

A. 何を識別子にするかを人が指定するのが機械学習、指定しないのが深層学習（ディープラーニング）

技術領域
![image.png](https://qiita-image-store.s3.amazonaws.com/0/31237/6fc5500e-20df-5484-b72d-fa954a73e25b.png)

違いの図
![image.png](https://qiita-image-store.s3.amazonaws.com/0/31237/e3e4d999-29e2-6f60-7744-66822a0f7237.png)

[参考](http://www.sbbit.jp/article/cont1/32033)

---

## これだけ知っていればとりあえず大丈夫。

--- 

![image.png](https://qiita-image-store.s3.amazonaws.com/0/31237/ca436fdd-1eab-12f2-8eb2-5f529aa63ebe.png)

---

## 雰囲気でやってみた

・作ったもの
3年分のbitcoinの日次の終値から価格を予測するモデル（メソッド）を作る。
8割のデータからこのモデルを作り、残りの2割を使って予測、実測値と比較する。
予測から「翌日値上がりするか」を判定、値上がりすると見越して購入、翌日に下がっていれば売る。売上の合計を計算。
1ヶ月運用。

---

## 結果

![image.png](https://qiita-image-store.s3.amazonaws.com/0/31237/a50a8d8d-5223-c055-7b57-3eceb81ce738.png)

12万くらいの利益が出そう。ちなみに絶賛BTCは値下がり中・・・

予測結果

できすぎている・・・バグありそう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/31237/5f54e642-ceea-e7c4-8c0c-aa75d4f9e54d.png)


---

## コード説明

利用した環境

- virtualenv
- python3
- pip

---

## pythonデバッグで便利なやつ

- bpython

補完や色付けをした状態でインタラクティブに実行できる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/31237/23451722-174f-6e04-d510-f5cf76a05b91.png)

- ipdb

便利デバッガ。これも色付けと補完が効く。

---

## コード説明1
こちらのコードをご覧ください。
[実際のコード](https://gist.github.com/jumbo-in-Jap/673206ca50b8a5ccaa325a45aa03c2f0)

---

## 実行部


```py3

if __name__ == "__main__":

    prediction = Prediction()
    prediction.execute()

--------------------------------------
    def execute(self):
        trainX, trainY, testX, testY = self.setup()
        self.execute_predict(trainX, trainY, testX, testY)
        self.plot_graph()
        self.calc_result()


```

---

## 初期化

初期値の設定。この辺はまぁそれ。

```py3
    def __init__(self):
        # 必要なデータ
        self.csv_path = './csv/bitcoin_log.csv'
        self.pre_dataset = None
        self.dataset = None
        self.normalize_val = None

        # 計算結果とモデル
        self.model = None
        self.train_predict = None
        self.test_predict = None

        # データセットのパラメータ設定
        self.steps_of_history = 3
        self.steps_in_future = 1

        # 結果
        self.result = None
```

---

## セットアップ

```py3

    def setup(self):
        self.load_dataset()
        X, Y = self.create_dataset()

        # Build neural network
        net = tflearn.input_data(shape=[None, self.steps_of_history, 1])

        net = tflearn.gru(net, n_units=6)
        net = tflearn.fully_connected(net, 1, activation='linear')
        net = tflearn.regression(net, optimizer='adam', learning_rate=0.01,
                loss='mean_square')

        # Define model
        self.model = tflearn.DNN(net, tensorboard_verbose=1)

        pos = round(len(X) * (1 - 0.2))
        # 8割を訓練データ
        trainX, trainY = X[:pos], Y[:pos]
        # 2割をテストデータにする
        testX, testY   = X[pos:], Y[pos:]
```

---

## 予測

```py3
    def execute_predict(self, trainX, trainY, testX, testY):
        # Start training (apply gradient descent algorithm)
        # 正規化した訓練、テストデータをそれぞれ入れてfittingする
        self.model.fit(trainX, trainY, validation_set=0.1, show_metric=True, batch_size=32, n_epoch=150, run_id='btc')

        # predict
        # 訓練データに基づく再予測
        self.train_predict = self.model.predict(trainX) * self.normalize_val
        # テストデータに基づく実予測
        self.test_predict = self.model.predict(testX) * self.normalize_val
        print('Accuracy: {0:.3f}'.format(self.model.evaluate(testX, testY)[0]))
```

---
##　Q. 結局最初の勉強は必要だったのか？
A. いらん気がする・・・

線形代数の知識などは実装時には意識しなかった。パズルを組み合わせるように実装できる。
それよりも**データに対する最適なモデルの種類**やその**評価方法**を知ることが重要。



---

## 今後の展望

- 複数のモデル、評価方法でシミュレート
- パフォーマンスの一番いいモデルで実際に取引
- ETH/BTCなど社会要因の少ない通過などでやってみる
- 実際の取引用のbotの実装