VS codeでiPhone実機で動作するReact Nativeアプリをデバック!!

最近初Macを買いました。最初はXCodeでSwiftと戯れていたのですが、Visual Studioに慣れた体には少し大変です。
今回はMac上でアプリを作成するのですが、ターゲットとしてはAndriodもあります。クロスプラットフォームの開発にはいくつかあって、.net派の私にとってはXamarinが第一選択肢になるのですが、最近はReactも使っているのでReact Naitiveでチャレンジしてみます。
React Naitive はFacebookから提供されていますが、Facebook以外からも多くのアプリが提供されています。クロスプラットフォームデファクトになる可能性もあると感じています。

Mac上で開発するので、VS code を使用して開発します。React Naitiveのプロジェクトというかワークススペースはreact-native initコマンドをつかって簡単に作成でき、そのフォルダをVS codeで開けばそのまま開発できます。デバッグReact Native Tools拡張機能を追加することで簡単にできます。

これは簡単だと思っていたのですが、今回BLEを利用するアプリなのでiPhoneの実機で動かさないといけないのですが、その方法が分からずVSCodeでは無理かなと思っていました。

それができることが分かったので紹介しておきます。

まず最初にiPhoneの実機にインストールできるようにするios-deployをインストールします。

npm install -g ios-deploy

環境によってはエラーが出ますが、私の環境では以下のコマンドでインストールできました。

sudo npm install -g --unsafe-perm=true ios-deploy

次にVS Codeを起動してVS Codeのメニューのデバッグ(虫)アイコンを選択します。左上にデバッグのラベルがありその右のスピンの選択項目から構成の追加を選択するとlaunch.jsonファイルが開かれるので以下のような構成を追加します。

        {
            "name": "iPhone",
            "program": "${workspaceRoot}/.vscode/launchReactNative.js",
            "type": "reactnative",
            "request": "launch",
            "platform": "ios",
            "target": "device",
            "sourceMaps": true,
            "outDir": "${workspaceRoot}/.vscode/.react"
        },

設定を保存すると追加したiPhoneが選択可能になるので、選択してデバッグを実行すると実機にインストールされデバッグできるようになります。

これでとりあえずコードと戯れる環境が出来たので色々試していきます。

2017年振り返り

今年は案外良い年になったと思う

Keep

今年は楽しく新しいことにチャレンジができた。この楽しくできたのが良かった
・TRYしたかったDeep Learningを使ったFXもやることはできた
・新しい楽しみとして映画館で映画を見ることもできた
・My FinTechもNASDAQ空売り失敗はあったものの、BP,DBの逆張り戦略で大負けせずに過ごせた
・コードもいっぱい書いた。reactやwebpack、typescriptで作成するモダンWebアプリの生産性は素晴らしかった

Problem

やはりスタートアップ関連に課題は多い
・スタートアップ関連については徐々に話があるようになったがまだまだテイクオフできそうなシナリオにはなっていない
・作っている物自体は悪くないと思っているが、2番手のエリアは難しいのかもしれない
Amazon プライムでビデオを見すぎて夜の睡眠の質が落ちてしまった。結果プログラムを書く量が減ってしまった

Try

・やはりスタートアップ関連、おととしにピボットして今年3年目の勝負の時、見ただけで欲しくなるものを目指す
・FinTech関連で自動化のレベルを上げたい。現状でもいろいろ分析できる仕組みを作り上げたが、もう少しインテリジェンスな仕組みにしたい
強化学習のモデルをもう少し上手にできるノウハウを得たい。このエリアの知見を養いたい
・あと健康であるように。パフォーマンスを最大限にできるように。去年同窓会で話題になったバターコーヒーにもチャレンジかな

来年も皆様にとっても良いお年になるように

CNTKの強化学習でFXトレードする(おまけ)

先日の投稿の後、いくつか異なるモデルを学習させましたが、結局何もトレードしないモデルばかりが出来てしました。
ポジションを取るときの報酬のマイナスをかなり小さくしましたが、長く学習させるとそのようになるようです。
FXしないほうが良いということなんでしょうかね。

CNTKの強化学習でFXトレードする(最終日)

とりあえず強化学習を試しましたが今回のこの結果では実戦投入は難しそうです。
今後、学習モデルや、報酬の与え方、使う情報を変えて試してみます。

しかし、機械学習関連の道具は凄く進んでいますね。強化学習も本当に簡単に使えるようになっています。
難しい理論的なことは理解していないですが、とりあえず感覚的な理解でもそれなりに利用できてしまいます。
機械学習的な筋の良さやテクニックは理論的に詳しいほうがいいんでしょうか、ビジネスシナリオに機械学習の技術を適用する上ではこの程度でも十分な気がします。
ガンガン活用していきたいですね。

あと最後に、学習したモデルをC#などで使いたい場合の話ですが、通常のCNTKのモデルとして読み込み利用できます。
観測した状態値を入力すると、アクションごとに数値が配列で帰ってくるので最大値のアクションを選択するようにすればOKです。

string modelFilePath = @"C:\cntk\Examples\save\stock.model";
modelFunc = Function.Load(modelFilePath, DeviceDescriptor.CPUDevice);
...
modelFunc.Evaluate(inputDataMap, outputDataMap, DeviceDescriptor.CPUDevice);
var result = outputDataMap[outputVars[0]];
//アクションごとに数値が配列で帰ってくるので最大値のアクションを選択
var resultdata = result.GetDenseData<float>(outputVars[0]); 

ヨコシマな野望は満たされませんでしたが、今年のやりたいことリストの1つは達成できました。

CNTKの強化学習でFXトレードする(3日目)

FX1年分のデータを学習させました。たまにプラスにはなりますが、おおくがマイナスの状態です。勝ちパターンを見つけてるとはいいがたいですね。

episode: 1 local_step: 1440 global_step: 1440 sum_rewards: -162.59999999999937 sum_count: 921 epsilon: 0.85744
episode: 2 local_step: 1440 global_step: 2880 sum_rewards: -136.40000000000077 sum_count: 768 epsilon: 0.71488
episode: 3 local_step: 1440 global_step: 4320 sum_rewards: -124.60000000000133 sum_count: 695 epsilon: 0.57232
...
episode: 8 local_step: 1440 global_step: 11520 sum_rewards: -47.60000000000014 sum_count: 242 epsilon: 0.01
episode: 9 local_step: 1440 global_step: 12960 sum_rewards: -3.600000000000004 sum_count: 36 epsilon: 0.01
episode: 10 local_step: 1440 global_step: 14400 sum_rewards: 0.0 sum_count: 4 epsilon: 0.01
episode: 11 local_step: 1440 global_step: 15840 sum_rewards: -1.2000000000000013 sum_count: 12 epsilon: 0.01
...
episode: 99 local_step: 1440 global_step: 141720 sum_rewards: 1.1999999999999993 sum_count: 26 epsilon: 0.01
episode: 100 local_step: 1380 global_step: 143100 sum_rewards: -4.400000000000001 sum_count: 20 epsilon: 0.01
episode: 101 local_step: 1440 global_step: 144540 sum_rewards: -1.0 sum_count: 7 epsilon: 0.01
...
episode: 199 local_step: 1440 global_step: 284130 sum_rewards: -1.6000000000000008 sum_count: 16 epsilon: 0.01
episode: 200 local_step: 1440 global_step: 285570 sum_rewards: -4.000000000000001 sum_count: 20 epsilon: 0.01
episode: 201 local_step: 1396 global_step: 286966 sum_rewards: -14.79999999999999 sum_count: 90 epsilon: 0.01
...
episode: 303 local_step: 1440 global_step: 432946 sum_rewards: -6.600000000000004 sum_count: 91 epsilon: 0.01
episode: 304 local_step: 1440 global_step: 434386 sum_rewards: -3.000000000000001 sum_count: 33 epsilon: 0.01

このモデルを評価すると、常にロングを出し続けるような学習をしているようです。長めのトレンドにのっかる戦略なんでしょうか???
2015年2月〜2016年5月のデータを使った学習させたのですが、この期間は通算ではドル安でなのでそれもおかしいそうです。
学習を1日データ単位(7:00〜)にしたのが影響している可能性もありますし、やはりランダムウォークな動きで予測不可能なものなのかもしれません。

もう少し長い足で試してみるか、異常値検出的なやり方か、いろいろ試すしてみる方法はありますが、答えがあるかも含めてやっぱりわかりませんね

CNTKの強化学習でFXトレードする(2日目)

今日はFX用の強化学習のモデルを作成しようと思います。
まずは通貨ですがドル円で1分足を使うようにします。観測値としては時系列の足データを利用する方法もありますが、ここはまずは複数の時間軸の移動平均を利用することにします。GPUパワーはあまりないので、生データよりも少し傾向があるデータを使うことで早く学習してくれることを期待しています。
報酬はもちろん獲得したpipsになりますが、売り買いを指示する際にはリスクが発生しますので、そのコストをマイナスの報酬にします。具体的には、pipsについてはトレードを開始した際の価格±5pipsで固定します。これが達成できた時点で報酬を与えます。勝った場合は+1.2、負けた場合は-0.8です。これは売り買いをした際に-0.2の報酬にしているためで合計1.0になるようにしました。

まとめると、以下のような感じです。
 ・FXの状態は複数の移動平均値を利用
 ・報酬は損益のpipsをベースに売買時のリスクも考慮する

プログラムは以下のような感じです。部分的なコードで意味不明化かもしれませんが、単純なコードなのはわかってもらえると思います。

    while local_step < len(data):
        reward = 0
        if action == 1:
            reward = -0.2
            shortAction.append(data[local_step][5+2])
        if action == 2:
            reward = -0.2
            longAction.append(data[local_step][5+2])

        pip = 0.05
        for lAction in longAction:
            if lAction - pip > data[local_step][5]:
                reward = reward -0.8
                longAction.remove(lAction)
            elif lAction + pip < data[local_step][5+1]:
                reward = reward +1.2
                longAction.remove(lAction)
    ...

これで動かすことができるのですが、このプログラムが本当にうまく学習するかわからないので、規則性のあるデータでまずは試してみたいと思います。
ということでSIN関数を利用して学習させます。

このデータをベースに実際に実行してみます。結果はこんな感じです。sum_rewardsがプラスであれば利益が出ています。うまく学習していますね。

episode: 1 local_step: 1000 global_step: 1000 sum_rewards: -119.00000000000122 sum_count: 653 epsilon: 0.901
episode: 2 local_step: 1000 global_step: 2000 sum_rewards: -113.00000000000101 sum_count: 573 epsilon: 0.802
episode: 3 local_step: 1000 global_step: 3000 sum_rewards: -87.60000000000079 sum_count: 486 epsilon: 0.703
episode: 4 local_step: 1000 global_step: 4000 sum_rewards: -72.4000000000005 sum_count: 424 epsilon: 0.604
episode: 5 local_step: 1000 global_step: 5000 sum_rewards: -55.00000000000028 sum_count: 337 epsilon: 0.505
episode: 6 local_step: 1000 global_step: 6000 sum_rewards: -74.40000000000043 sum_count: 344 epsilon: 0.406
episode: 7 local_step: 1000 global_step: 7000 sum_rewards: -33.79999999999992 sum_count: 209 epsilon: 0.30700000000000005
episode: 8 local_step: 1000 global_step: 8000 sum_rewards: -25.999999999999925 sum_count: 170 epsilon: 0.20799999999999996
episode: 9 local_step: 1000 global_step: 9000 sum_rewards: -16.39999999999998 sum_count: 116 epsilon: 0.10899999999999997
episode: 10 local_step: 1000 global_step: 10000 sum_rewards: -5.600000000000003 sum_count: 50 epsilon: 0.01
episode: 11 local_step: 1000 global_step: 11000 sum_rewards: -11.599999999999984 sum_count: 68 epsilon: 0.01
episode: 12 local_step: 1000 global_step: 12000 sum_rewards: 4.3999999999999995 sum_count: 32 epsilon: 0.01
episode: 13 local_step: 1000 global_step: 13000 sum_rewards: 11.2 sum_count: 20 epsilon: 0.01

これでプログラムとしては学習できるものになっていることが確認できました。
次回、FXの過去データで試してみます。

CNTKの強化学習でFXトレードする(1日目)

明日有給を取ったので今日から4連休です。時間ができたので以前から試してみたかったCNTKのdeeprlライブラリを利用した強化学習DQN)ベースのFX自動売買システムの構築にチャレンジしてみます。
過去、既に統計的方法や機械学習の様々な方法、ディープラーニング(DNNやCNN、LSTM)などいろいろな方法でチャレンジしてきましたがあまり結果がよろしくありませんでした。10連敗というある意味すごい記録を打ち立てたこともあります。
FXは囲碁や将棋のような完全情報ゲームでないためチャート上に答えがない可能性もありますが、現代の年金術としての可能性にかけてみようという男のロマンというかヨコシマな思いです。

まずはdeeprlの使い方ですが、CNTKの強化学習用パッケージdeeprlの使い方を参考にしました。
OpenAI Gymを使ったサンプルが提供されているので、その内容を読み解けば使い方がわかりそうです。

まず以下の部分が最も重要で、CNTKで提供している強化学習エンジン部分の初期化処理のようです。
強化学習の各種設定は設定ファイルに記載してそれを読み込むような手法で第1引数がそれにあたります。CNTKインストールしていると該当のフォルダにいくつか設定がありますので、中身を見てみてください。

agent = qlearning.QLearning(config_filename='config_examples/qlearning.config', 
                            o_space=o_space, 
                            a_space=a_space)

次にo_space,a_spaceの部分ですが、こちらはOpenAI Gymの取得して設定している値になっていましたが、いろいろ調べるとo_spaceについては現在のゲーム自体の状態を表して情報で、a_spaceはゲームの操作(Action)の状態を宣言しているものでした。
FXでいればo_spaceはチャートの情報、a_spaceは買い(long),売り(short),何もしないなどを表しています。

具体的に以下の例ですと、チャートの情報を5個の実数(-1.0〜1.0)で表現し、ユーザアクションを3つの操作で表すよとした場合の表現になります。

o_space = gym.spaces.Box(-1.0,1.0, (5,))
a_space= gym.spaces.Discrete(3)

あとはゲームを開始して強化学習させます。

#ゲームの開始
action, debug_info = agent.start(observation)  

#loop
  #ゲームの実行
 #reward = game(action)

  #次のゲーム操作
  action, debug_info = agent.step(reward, observation)  

とりあえず主要なポイントこれだけのようなので、あとは観測値の種類、学習やり方や報酬の与え方をいろいろ工夫しながらモデルを作成していくことになりそうです。