読者です 読者をやめる 読者になる 読者になる

予想通り不合理 -FXと機械学習と-

FXの自動売買や機械学習(tensorflowを用いたディープラーニング)について日々の考えをまとめる

Android端末の操作を自動化

kapiparaです。

 

常々Androidアプリの操作を自動化したいという思いがあったので、ついにやってみました。

対象はスマホゲームなのです。

スマホゲームは単純作業の繰り返しと真剣にやる作業の2種類があり、

単純作業が全体の90%、真剣にやる作業が全体の10%というような比率だと

思います。

 

今回の狙いは単純作業90%を自動化し、残りの10%だけを楽しもうというものです。

(単純作業90%があるからこそ10%の時間が楽しいという効果が間違いなくあるので、これをすることで10%の楽しさが減ることは間違いないのですがそこは置いておきます。。)

 

ざっと調べた感じ、FRepを使用するやり方とadbコマンドを使用するやり方があるようです。

①FRep:記録+再生

②adbコマンド:タップやスワイプをコマンドプロンプトから入力できる機能

 

今回は拡張性が明らかに高そうな②adbコマンドでやってみます。

 

【準備】

Android SDKのインストール

 ⇒適当に実施

SDKのtool,platform-toolにpathを通す

 ⇒適当に実施

準備完了!

 

【実行】

コマンドプロンプトを起動

・adb devicesと打ち込む

 ⇒デバイス情報が出る。(デバイスを読み込めているし、pathも通っている)

・あとはinput tap ,input swipeを使って一連の動作を記述

 

FF:オペラオムニアのクリスタル集め用のコマンドを作成したのが下記

 

------------------------

input swipe 930 450 931 451
sleep 2
input swipe 1100 660 1101 661
sleep 2
input swipe 660 200 661 221
sleep 2
input swipe 1100 660 1101 661
sleep 10
input swipe 880 660 881 661
sleep 300
input swipe 1150 660 1151 661
sleep 4
input swipe 1150 660 1151 661
sleep 5

-------------------------

こんな感じで一連の処理を記述するとあとは自動でやってくれます。

これでクリスタル集めが相当楽になる。

 

ただこれではただの記録・再生と変わらないので、次は画面の情報取得と取得した情報をもとに判断(OCRや画像認識+if文かなあ,,)を加えたいと思います。

 

以上。

Kaggle -Youtube-8M Challenge- とりあえずサンプル学習(MoeModel)

kapiparaです。

前回に引き続きYoutube-8M Challengeです。

 

前回はlogistic_modelで限界までトレーニングしたので、今回はもう一つのサンプルモデルであるMoemodelで学習を行います。

 

コマンド↓

python train.py --train_data_pattern='./features/train*.tfrecord' --model=MoeModel --train_dir=$MODEL_DIR/video_level_logistic_model --base_learning_rate=0.03 --export_model_steps=500

・modelにMoeModelを指定

・学習率はある程度高くてよいことが前回わかったので0.03を指定

 

結果↓

INFO:tensorflow:training step 10 | Loss: 1553.99 Examples/sec: 238.09 | Hit@1: 0.60 PERR: 0.44 GAP: 0.39
INFO:tensorflow:training step 510 | Loss: 12.49 Examples/sec: 237.05 | Hit@1: 0.77 PERR: 0.60 GAP: 0.66

 

さらに学習率を下げて学習

python train.py --train_data_pattern='./features/train*.tfrecord' --model=MoeModel --train_dir=$MODEL_DIR/video_level_logistic_model --base_learning_rate=0.005 --export_model_steps=50

・学習率は0.005を指定

 

結果↓

INFO:tensorflow:training step 770 | Loss: 9.66 Examples/sec: 237.90 | Hit@1: 0.77 PERR: 0.61 GAP: 0.68
INFO:tensorflow:training step 980 | Loss: 8.69 Examples/sec: 237.67 | Hit@1: 0.77 PERR: 0.63 GAP: 0.69

 

f:id:kapipara18:20170411020703p:plain

 

 

252位!

 

以上。

 

 

Kaggle -Youtube-8M Challenge- とりあえずサンプルの限界まで学習

kapiparaです。

 

先日に引き続きYoutube-8M challengeをやります。

前回はとにかく結果をsubmitすることだけを考えていたので10stepだけ実行した結果のモデルで作ったCSVをsubmitしましたが、今日は誤差関数が収斂するまで学習を回し続けたモデルを作成し、そのモデルでCSVを作成し、submitします。

 

コマンド↓

python train.py --train_data_pattern='./features/train*.tfrecord' --model=LogisticModel --train_dir=$MODEL_DIR/video_level_logistic_model --export_model_steps=500

 

model:LogisticModel

export_model_steps:500

 

まだ3割ぐらいしかサンプルコードが見れていませんが、とりあえずシンプルに上記の設定で実行。

modelとして何が用意されているか早く確認せねば...

 

学習を回している間に用語勉強↓

・適合率(precision):正であると予測されたもののうち、実際に正であるものの割合

・再現率 (recall):実際に正であるもののうち,正であると予測されたものの割合

 

hit_at_one = eval_util.calculate_hit_at_one(predictions_val, labels_val)
perr = eval_util.calculate_precision_at_equal_recall_rate(predictions_val,labels_val)

 ⇒ソースは見てないがrecallを出しているのは明白
gap = eval_util.calculate_gap(predictions_val, labels_val)

 

・eval_util.calculate_hit_at_one

def calculate_hit_at_one(predictions, actuals):
    top_prediction = numpy.argmax(predictions, 1)

  ⇒これは最大値のインデックスを取得している。意味通り。
    hits = actuals[numpy.arange(actuals.shape[0]), top_prediction]

  ⇒これは..
    return numpy.average(hits)

  ⇒これはhitsの平均を返している。

 

hitsの動きを確認するために実験------------------------------------------

>>> listss = numpy.array([(1,2,3,4,5),(5,4,3,2,1),(3,4,5,1,2)])

>>> print listss
[[1 2 3 4 5]
 [5 4 3 2 1]
 [3 4 5 1 2]]

>>> top = numpy.argmax(listss ,1)

>>> print topp
[4 0 2]

うむ。各行の一番大きい値のインデックスをtop_predictionとして持っている。(横持)

>>> actuals = numpy.array([(0,0,0,0,1),(0,1,0,0,0),(0,0,1,0,0)])

>>> print actuals
[[0 0 0 0 1]
 [0 1 0 0 0]
 [0 0 1 0 0]]

>>> shp = actuals.shape[0]
>>> print shp
3
>>> arg = numpy.arange(shp)
>>> print arg
[0 1 2]

>>> hits = actuals[arg,topp]
>>> print hits
[1 0 1]

-----------------------------------------------------------------------------------

ということで。(pythonもnumpyも初心者ですみませんね..)

hits = actuals[numpy.arange(actuals.shape[0]), top_prediction]

 ⇒hitsは最も確率が高いとしたラベルが当たっているもののカウント。

それの平均を返すということは、hitsは最も高いとしたラベルの正答率と考えてよい。

 

PERRとGAPはまた今度。

 

見た感じ学習が収束した。

INFO:tensorflow:training step 10 | Loss: 3045.63 Examples/sec: 1054.09 | Hit@1: 0.52 PERR: 0.35 GAP: 0.21
INFO:tensorflow:training step 510 | Loss: 43.15 Examples/sec: 1090.50 | Hit@1: 0.69 PERR: 0.52 GAP: 0.54
INFO:tensorflow:training step 1010 | Loss: 16.47 Examples/sec: 1059.01 | Hit@1: 0.74 PERR: 0.57 GAP: 0.61
INFO:tensorflow:training step 1510 | Loss: 12.23 Examples/sec: 1091.07 | Hit@1: 0.77 PERR: 0.59 GAP: 0.63
INFO:tensorflow:training step 2010 | Loss: 10.43 Examples/sec: 1104.52 | Hit@1: 0.75 PERR: 0.60 GAP: 0.64
INFO:tensorflow:training step 2510 | Loss: 9.50 Examples/sec: 1070.70 | Hit@1: 0.77 PERR: 0.61 GAP: 0.67
INFO:tensorflow:training step 3010 | Loss: 8.96 Examples/sec: 1074.41 | Hit@1: 0.75 PERR: 0.59 GAP: 0.65

 

tensorboardを確認するために

tcp:6006のFWルール追加と「HTTPからの接続を許可」をしたがつながらず。

まあ再起動したらうまくいく気もするし明日やろう。

 

submit結果↓

f:id:kapipara18:20170410001900p:plain

 

現在262位!

 

以上

 

 

FX自動売買 -売買ロジック修正-

kapiparaです。

 

前回に(4日前?)に引き続き移動平均線を用いた売買ロジックを作っていきます。

 

再掲↓

----------------------------------------------------------------------

【売買シグナル】

移動平均(5)と移動平均(20)と移動平均(40)が足の短い順かその逆順になったときに買、売を行う。

ロスカット条件】

移動平均(20)を常にストップロスに指定。

【プロフィット条件】

なし

【バックテスト条件】

USDJPY5分

スプレッド6

tickstoryで生成

2017/1/1~2017/4/1の4か月

初期資金150000JPY

----------------------------------------------------------------------

 

再掲結果↓

f:id:kapipara18:20170403233513g:plain

 

では、まずは移動平均線が収斂しているときに売買しないようロジックを追加します。

 

以下の条件を追加するだけです。

   iMA_dist_SM = MathAbs(iMA_short - iMA_middle);
   if(iMA_dist_SM > iMA_threshold_SM)
      iMA_dist_SM_flag = 1;

 

結果↓

f:id:kapipara18:20170409105729g:plain

 

余計な取引が減り、取引数が激減しました。

波形としては似ていますが、かなり健全になってきました。

 

詳細結果↓

テストバー数    18697
モデルティック数    6769870
モデリング品質    n/a
不整合チャートエラー    0
初期証拠金    150000.00
スプレッド    6
純益    -115579.89
総利益    754426.83
総損失    -870006.72
プロフィットファクタ    0.87
期待利得    -109.35
絶対ドローダウン    117070.89
最大ドローダウン    215381.89 (86.74%)
相対ドローダウン    86.74% (215381.89)
総取引数    1057
売りポジション(勝率%)    619 (22.94%)
買いポジション(勝率%)    438 (25.80%)
勝率(%)    255 (24.12%)
負率 (%)    802 (75.88%)
    最大
勝トレード    40432.00
敗トレード    -12792.00
    平均
勝トレード    2958.54
敗トレード    -1084.80
    最大
連勝(金額)    5 (9130.00)
連敗(金額)    29 (-12196.00)
    最大
連勝(トレード数)    40432.00 (1)
連敗(トレード数)    -29655.00 (15)
    平均
連勝    1
連敗    4

 

次に負けトレードの損失制御を行います。

一回の負けで約10%の金額を持っていかれていることが上記の結果からわかるためです。

原因はストップロスが固定幅ではなく中期移動平均にしているためです。

損失を抑え込む手法として、まずは単純にストップロスを固定値にしてみます。

 

変更した箇所は以下の通り↓

middle ⇒ 中期移動平均線の値

Bid - STOP_threshold - SL_threshold BUYSTOPの値-固定値

あとはtrailing stopを同じく固定値に変更

 

今日加えた3要素をチューニング

①短期・中期移動平均間の距離

②ストップロスの幅

トレイリングストップの幅

 

 

結果↓

f:id:kapipara18:20170409114747g:plain

 

テストバー数    18697
モデルティック数    6769870
モデリング品質    n/a
不整合チャートエラー    0
初期証拠金    150000.00
スプレッド    6
純益    42013.93
総利益    427142.00
総損失    -385128.06
プロフィットファクタ    1.11
期待利得    136.85
絶対ドローダウン    22942.00
最大ドローダウン    45655.00 (26.43%)
相対ドローダウン    26.43% (45655.00)
総取引数    307
売りポジション(勝率%)    0 (0.00%)
買いポジション(勝率%)    307 (38.11%)
勝率(%)    117 (38.11%)
負率 (%)    190 (61.89%)
    最大
勝トレード    21402.00
敗トレード    -4400.00
    平均
勝トレード    3650.79
敗トレード    -2026.99
    最大
連勝(金額)    6 (28575.00)
連敗(金額)    11 (-20519.00)
    最大
連勝(トレード数)    28575.00 (6)
連敗(トレード数)    -20519.00 (11)
    平均
連勝    2
連敗    3

 

一応利益が出るようになりました。

ただ4か月で約30%ですし、安定もしていないので実用性は低いですね。

そして売りポジションがなくなってしまいました。

なにかバグっていますね...

 

バグの修正から次回実施します。

 

以上。

 

 

 

 

 

 

Kaggle -Google Cloud & YouTube-8M Video Understanding Challenge- まずは登録③

kapiparaです。

 

ようやくGCEのインスタンス作成が完了したので、Kaggleのサンプルソースを叩いてpredictionデータの作成、submitまで行こうと思います。

 

SSHで接続して気づいたが、

      「環境構築しないといけない?」

 

kapipara18@kaggle1:~$ python --version
Python 2.7.12+

 

おうおう。

 

kapipara18@kaggle1:~$ pip list
The program 'pip' is currently not installed. To run 'pip' please ask your administrator to install the package 'python-pip'

 

あ”-....

Cloud shellとおんなじ設定でいいのでそのままインスタンス作成できればいいのに....

 

sudo apt-get update
sudo apt-get upgrade
sudo apt-get -y install python-pip

pip download tensorflow
pip install --user -U tensorflow*.whl

 

kapipara18@kaggle1:~$ pip list
DEPRECATION: The default format will switch to columns in the future. You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.
appdirs (1.4.3)
boto (2.40.0)
chardet (2.3.0)
crcmod (1.7)
funcsigs (1.0.2)
google-compute-engine (2.2.4)
mock (2.0.0)
numpy (1.12.1)
packaging (16.8)
pbr (2.0.0)
pip (9.0.1)
protobuf (3.2.0)
pyparsing (2.2.0)
requests (2.10.0)
setuptools (34.3.3)
six (1.10.0)
tensorflow (1.0.1)
urllib3 (1.15.1)
wheel (0.29.0)

 

うむ。

ではではgithubのREADMEに戻って。

https://github.com/google/youtube-8m/blob/master/README.md

 

mkdir -p features; cd features
curl data.yt8m.org/download.py | partition=1/video_level/train mirror=asia python

これでDLが始まるのでしばし待機。

 

待機している間に調べもの..

Google Cloud Machine Learning??

Hypertuneでハイパーパラメータのチューニングが手間いらず...だと?

VMインスタンスでしっぽりやろうとしている今の状態。あってる??

ベータ版だけど気になりすぎるので勉強する。

 

curl data.yt8m.org/download.py | partition=1/video_level/validate mirror=asia python
curl data.yt8m.org/download.py | partition=1/video_level/test mirror=asia python

一旦全部DL

 
そして学習

MODEL_DIR=/tmp/yt8m
python train.py --train_data_pattern='./features/train*.tfrecord' --model=LogisticModel --train_dir=$MODEL_DIR/video_level_logistic_model
ディレクトリパスは若干変更。
checkpointを吐いたらすぐにctrl + Cで終了。

python eval.py --eval_data_pattern='./features/validate*.tfrecord' --model=LogisticModel --train_dir=$MODEL_DIR/video_level_logistic_model --run_once=True
で評価。してみたが、validateデータのバッチごとの認識精度を出すだけか。

python inference.py --output_file=$MODEL_DIR/video_level_logistic_model/predictions.csv --input_data_pattern='./features/test*.tfrecord' --train_dir=$MODEL_DIR/video_level_logistic_model
そしてついにprediction.csc作成。

INFO:tensorflow:Done with inference. The output file was written to /tmp/yt8m/video_level_logistic_model/predictions.csv
SSHでつないだコンソールの機能を使って最後にcsvのDLをやったが、これが死ぬほど遅い。びっくりするぐらい遅い。遅いというよりはファイルサイズの問題だと思うが、死ぬほど時間がかかる...
遅すぎるので一旦キャンセルして圧縮。

192439310 Apr  6 15:14 predictions.csv

192439310 Apr  6 15:14 predictions.csv
 76328240 Apr  6 15:14 predictions.csv.gz

約3分の1になった。これでなんとか今日中に行けそうだが..
圧縮したりDLしたりっていう行為自体いまいちな気がする。

ダウンロードが完了したのでKaggleで電話番号の登録をしていざsubmit。

f:id:kapipara18:20170407010113p:plain

うむ。うまくいった。採点中...

f:id:kapipara18:20170407010230p:plain

きた!302位!笑

ようやく名前は載ったので、これから精度向上策をどんどん打っていく。

以上。

style="-moz-user-select: text; position: absolute; top: -99px;">INFO:tensorflow:Done with inference. The output file was written to /tmp/yt8m/video_level_logistic_model/predictions.csv

kapipara18@kaggle1:~/youtube-8m$

kapipara18@kaggle1:~/youtube-8m$

 

Google Cloud Platform -GCE VMインスタンス作成-

kapiparaです。

 

Youtube-8M Challengeで大規模データ解析をするためにGCEのインスタンスを作成します。

GPUを使いたいですが、一旦CPUでかつサンプル回せそうな「n1-standard-4」に決定。

 

Google Compute Engine の料金  |  Compute Engine ドキュメント  |  Google Cloud Platform

 

その他もろもろ以下の通り。

マシンタイプ:vCPU x4(n1-standard-4)

OS: Ubuntu 16.10

ディスク:45GB

あとは全部推奨

 

f:id:kapipara18:20170405231237p:plain

 

インスタンスの作成ボタンを押してから実に19秒でインスタンス完成。

AWSよりもかなり早い。

 

どうやってSSH接続するのか一瞬悩んだが、画面の「SSH」というボタンからコマンドを作成⇒クリックでコマンド発行という流れでトントン拍子に進んでいき、無事接続完了。

kapipara18@kaggle1:~$ df .
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/sda1       45551936 1198252  44337300   3% /
kapipara18@kaggle1:~$ df .
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/sda1       45551936 1198252  44337300   3% /

 

kapipara18@kaggle1:~$ df .
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/sda1       45551936 1198252  44337300   3% /
kapipara18@kaggle1:~$ df .
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/sda1       45551936 1198252  44337300   3% /
kapipara18@kaggle1:~$ df .
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/sda1       45551936 1198252  44337300   3% /

df.

Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/sda1       45551936 1198252  44337300   3% /

うむ。ちゃんと45GBある。

 

明日このインスタンス上でYoutube-8MのDLとサンプルの実行、認識結果CSVのULを行う。。。

なかなかランキングインまでかかるな。

 

 

Kaggle -Google Cloud & YouTube-8M Video Understanding Challenge- まずは登録②

kapiparaです。

前回の続きです。

 

4. Connect to and Run the Starter Code

    • We have created starter code in github that you can run in Cloud ML as a starting point to learn how to train, evaluate, and create predictions.
    • Cloud MLを動かして学習・評価・予想ができるスターターコードをgithubに置いといた。
    • In your cloud shell, type the following into the command line to clone the YouTube-8M github repo:
    • githubからクローンするためにとりあえず下のコマンドを打ってみよう。
git clone https://github.com/google/youtube-8m.git
  • Go to the github repo README and follow the starter code instructions hereafter until you have completed the training, evaluation & inference steps. Each command line creates a job in Cloud ML, and its progress can be followed in the cloud shell console to give you a sense for how the model is converging. Then return back to this tutorial to generate a predictions file for submission, explained in Step 6 below.
  • githubのREADMEを読んで勉強して帰ってきたらStep6よりあとやってSubmission用の予想ファイルを作成しよう。
  • We also provide some helpful tips below, to refer to as you are running through the starter code.
  • スターターコードを走らせる時用のtipsもあるから見てね。

READMEの内容

①tensorflow 1.0.0以上かつpython2.7以上が必要

②コマンド叩いてディレクトリを作成して小さいサイズ(ビデオレベル)のYoutube-8M deta setをとりあえずDL(mirror=Asiaにするのを忘れずに。)

ついでにvalidate,testもDL。

③コマンドを叩いて学習を実施。

④デフォルト設定だと--train_dirにcheckpointを出力してしまうので、トライ&エラーをしているフェーズにおいては、--start_new_modelの引数渡してcheckpointを無視する設定にするの推奨。

⑤モデルの評価を実行。

⑥Tensorboardを確認。

⑦いい感じだったらinferenceコマンドを実行してpredictions.csvを作成。

5. Download your Predictions File to make a Kaggle Submission

上でStep6って書いてあるけど思いっきり5のこと。すったもんだの末の誤植か。。

  • Running the inference command in the Starter Code (Step 5 above) generates a predictions file (predictions.csv). A gs:// link should be given to you when your inference job is finished. You can find this at the end of the log for your inference job by following the instructions under Job Logs, below. View the log to find the gs:// link by clicking on "View Logs" for the job.
  • inferenceコマンドを叩けばpredictions.csvがどっかにできるので、ジョブログを確認しよう。ジョブログからgs:// link見つけてgsutilでダウンロードしよう。
  • Download your predictions.csv file to your local computer.
      • Option 1: You can download it via gsutil:
    gsutil cp gs://{your bucket}/{your model}/predictions.csv .
  • Option 2: You can also download via the Google Cloud Console. Minimize Cloud Shell & navigate to the Console's upper-left drop down menu, go to "Storage" (about midway down the menu). Select the bucket and navigate to the folder where you have saved the predictions.csv file in the steps above.
  • Google Cloud Consoleを使ってダウンロードする方法もあるよ。

 

まで読んだが、ファイルのDLが思いのほか長いのでevaluationから今度実行する。

 

以上。