不労所得とは?
それを得るために労働する必要がない所得のこと。 労働の対価として得る賃金・報酬以外による所得を指し、働かずとも得られる収入または収入源という意味で用いられることが多い。
ほしい。
手段
弊社は副業が許されている・・・やるしかない。
でもどうやるか??
- 株
- 資産運用
- 仮想通貨
- アフィリエイト
- エンジニアリング
せっかくなので勉強しながらやる
金になるものを作ろう。どうせなら流行りの技術など学びたい・・・
ということでとりあえず勉強した。
- Coursera Machine Learning
- 知り合いのフリーランスたちとゼロから作るDeep Learningを輪読
- 読んだ
でやってみた。
Deep LearningでBitcoinの価格予測をやってみる
今日はこの記事の説明と追加+補足
Q. ディープラーニングとは?
A. ニューラルネットワークと呼ばれる入出力を持った回路を組み合わせ、レイヤーと呼ばれる構造に分ける。このレイヤー内のニューラルネットワークに値を渡して出力を得る。
Q. 機械学習との違いは?
A. 何を識別子にするかを人が指定するのが機械学習、指定しないのが深層学習(ディープラーニング)
これだけ知っていればとりあえず大丈夫。
雰囲気でやってみた
・作ったもの
3年分のbitcoinの日次の終値から価格を予測するモデル(メソッド)を作る。
8割のデータからこのモデルを作り、残りの2割を使って予測、実測値と比較する。
予測から「翌日値上がりするか」を判定、値上がりすると見越して購入、翌日に下がっていれば売る。売上の合計を計算。
1ヶ月運用。
結果
12万くらいの利益が出そう。ちなみに絶賛BTCは値下がり中・・・
予測結果
できすぎている・・・バグありそう。
コード説明
利用した環境
- virtualenv
- python3
- pip
pythonデバッグで便利なやつ
- bpython
補完や色付けをした状態でインタラクティブに実行できる。
- ipdb
便利デバッガ。これも色付けと補完が効く。
コード説明1
こちらのコードをご覧ください。
実際のコード
実行部
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()
初期化
初期値の設定。この辺はまぁそれ。
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
セットアップ
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:]
予測
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の実装