AIとファイナンス

このブログではプログラミング言語Pythonを通じてAIとFinanceの懸け橋となるプログラムの作成を行っていきます! 具体的にはニューラルネットワークを構築して将来の市場の動きを予測することを目標としています。 ブログを進めていく中で、Pythonのコードはもちろん金融で確立された理論やその他のトピックもご紹介します。

【PythonでAI】強化学習【解説版】

ここでは強化学習の一例で作成した、コイントスの結果を予測するプログラムの解説を行います。

 

ssp はコインの性質、asp はプログラムの賭け方

f:id:MarcelXX:20210113073007p:plain

簡易版でもご説明した通りsspでは80%の確率で表、20%の確率で裏というこのコインの性質を定義しています。「1」が表、「0」を裏として、この数列からランダムに数字を一つ取り出すと4/5の確率(80%)で「1」=表がでます。

f:id:MarcelXX:20210113073037p:plain

この数列はプログラムがどのように賭けるかを定義しています。この数列からランダムに数字を一つ取り出すと「1」=表に賭ける確率も「0」=裏に賭ける確率も同じく50%ずつです。今回行った強化学習ではこの数列(賭け方)をコインの特性に合わせて進化させました。

for構文でコイントスの結果予想を100回実行!

f:id:MarcelXX:20210113073423p:plain

0002-2Reinforcement

ここで、
a = np.random.choice(asp)コイントスの結果の予想です。
s = np.random.choice(ssp)は実際の結果です。

このプログラム文を和訳すると下記のようになります。

f:id:MarcelXX:20210113074545p:plain

0002-3Reinforcement

ここで大事なのは「結果」をaspに記録したという点です。

.append()は数列にかっこの中身を足してください、という意味です。例えば一回コインを投げて「1」=表が出たらaspという数列はどうなるでしょうか?

「1」を数列に足すのでasp = [1, 0, 1]となります。この新しい数列で結果を予想するとどうなるでしょう?

今度は2/3の確率で「1」=表と予想してくれることがお分かりになりますでしょうか。
コイントスの回数が増えると、aspの数列もだんだん増えてきて精度の高い予想ができるようになります。

この結果、報酬が最大化できたわけですね!!

【Let's play around with the numbers and Codes!】

プログラムがどのように動いているかを理解する上で一番大事なのは変数やパラメーターを変えて遊んでみることです。

今回はプログラムが学習してだんだん予想の精度が上がるようにしましたがもしこれを学習せずにただ1/2の予想を繰り返すだけにしたらどんな結果になっていたでしょうか?

せっかくなのでやってみましょう!やり方は簡単、コードの12行目をコメントアウトするだけです。

f:id:MarcelXX:20210113082810p:plain

0002-4Reinforcement

動きましたか?だいたい50を中心とした数字が報酬の平均としてアウトプットされたのではないでしょうか。
期待値の話をすると、もし表裏の選択が50%ずつのまま予想し続けると、

    表に賭けて当たる確率 = 4/5×1/2 = 4/10

    裏に賭けて当たる確率 = 1/5×1/2 = 1/10

    当たる確率 = 4/10 + 1/10 = 1/2 

ということで、コインが特殊だろうが何だろうが50%の確率で当たることがわかります。

その一方で、もし今回のプログラムのようにコインの特殊性を看破して80%の確率で表、20%の確率で裏に賭けるようにしたら当たる確率は変わるでしょうか?

    表に賭けて当たる確率 = 4/5×4/5 = 16/25

    裏に賭けて当たる確率 = 1/5×1/5 = 1/25

    当たる確率 = 16/25 + 1/25 = 17/25 = 0.68

御覧のように的中する確率が先ほどに比べて36%増加しました!

このようにプログラミングの力でその時々に応じて状況を把握し、正しい決断を行っていくことができます。金融市場でも応用できそうですよね!

 

今回使用したコードは以下からコピペしてお使いください。

0002_reinforcement