AIとファイナンス

AIとファイナンスの架け橋、それがこのブログの目指すところです。兼業投資家向けに、Pythonを駆使して株やFXの分析を「自分で」行えるようになるための情報を提供します。ニューラルネットワークを活用した市場予測から、実証済みの金融理論まで、全てのコードを公開し、誰もが活用できるように!是非色々なコードで遊んでみてください!

【PythonでAI】テストデータの作成

ここでは今後機械学習ディープラーニングの学習を進めていくためのテストデータを作成します。

 

【使用するメソッド】

     numpy.linspace()

          線形に等間隔な数列を生成します。

     pylab.plt.plot()

          グラフを描画します。

 

【コード】

f:id:MarcelXX:20210113181133p:plain

0003-2create_testdata

今回は y=3x^3 - 4x^2 となるような三次方程式を作ってみました。描画すると以下のようになります。

f:id:MarcelXX:20210113181329p:plain

0003-2create_testdata

今後はプログラムにこの赤い点の座標だけを与えて、先ほどの三次方程式を見つけてくれるかを見ていきます!

実際にプログラムにテストデータとして入力する際は以下のような数列の形です。

f:id:MarcelXX:20210113181713p:plain

0003-3create_testdata

各手法はどこまで元の関数に近づけるでしょうか?楽しみです!

下からコードをコピペしてくださいね!もちろん数字はどんどん変えてしまって大丈夫です! 

 

0003_create_testdata

 

 

【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

 

  

【PythonでAI】強化学習【簡易版】

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

強化学習とは】

そもそも強化学習とは機械学習手法の一つで、プログラム自体が試行錯誤しながら最適な制御を実現してくれます。学習してもらうデータに正解、不正解はありませんが、目的として設定する「報酬」を最大化するための行動を学習するものです。

 

今回は80%の確率で表、20%の確率で裏、となる特殊なコインがあったとします。表裏を予想して最大の報酬を得れるように、賭け予想してもらうプログラムを作りたいです。そのためにはどのようにプログラムに学習させれば良いでしょうか。
(もちろんこの特殊なコインのことはプログラムは知らせずに・・・)

 

【使用するメソッド】

numpy.random

     choice

           与えられた選択肢の中からランダムで1つの選択を返してくれます。

【コード】

f:id:MarcelXX:20210113045554p:plain

0002-1Reinforcement

1行目でnumpyをインポートしました。2行目は「80%の確率で表、20%の確率で裏」という設定を書いています。4~13行目が今回の肝となる関数部分です。こちらも詳しくは【解説版】で見ていきますが、大きな流れとしては以下のことをやっています。

  1. コインを投げてあたりはずれを判定する
  2. あたりなら「報酬」を与え、外れなら何も与えない
  3. 1~2を100回繰り返し獲得した報酬をアウトプットする 

15~17行目では上の1~3の作業を15回行い、平均の獲得報酬を見ています。

皆さんも実行してみてください!


だいたい60~75くらいの値になったのではないでしょうか?もしこのプログラムがランダムに表裏に毎回賭けていたら獲得報酬はおよそ50くらいになるはずです。
(⇑コインが特殊でもランダムに1/2で賭けていたら期待値も0.5になります!) 

ところがそれ以上の報酬を獲得できているということは「プログラムがこの特殊なコインの傾向を見抜いて賭けていた」ということになりますよね!

このコードの細かい説明や期待値の話は【PythonでAI】強化学習【解説版】でお届けします。

 

コードは下からコピペして使ってくださいね!

 

0002_reinforcement

【PythonでAI】教師なし学習【解説版】

 

ここでは教師なし学習の一例として作成したクラスタリングのプログラムの動作を解説していきます。

 

make_blobs() サンプルデータの生成

今回このメソッドはサンプルデータを作成するために使いました。 

n_samples: 生成するサンプルの総数

centers: クラスターの中心の数

random_state: データセット作成のための乱数生成を決定します。 この数字を決めることで何回やっても同じ点群が生成されます。

cluster_std: 中心からの距離の標準偏差

f:id:MarcelXX:20210112113522p:plain

0001-3Clustering

さて、この結果どのような配列ができたのでしょうか?

変数の中をのぞいてみましょう。

f:id:MarcelXX:20210112130128p:plain

0001-4Clustering

まず配列xをのぞいてみると2組の座標が生成されていることがわかりますね。その2組の座標がそれぞれどのクラスターに対応しているかが配列yに表示されています。配列yが今回のサンプルデータセットの「答え」になります。

ただ今回のプログラムは教師なし学習なのでyの配列は使いません!

 

fit() で学習
predict() で予測

 上の2つはscikit-learn機械学習5よくに使われるライブラリ)を使っていく上でまず把握するべきものです!これを見ると9行目で「model」の学習、11行目で予測を行っていることがわかりますね!

f:id:MarcelXX:20210112134836p:plain

0001-5Clustering

 では今回どのようなモデル(model)を作って学習、予測したのでしょうか??

 

Kmeans() 非階層的クラスタ分析(K-平均法)

今回のモデルはK-平均法と呼ばれる手法を用いてサンプルデータを分析しました。この方法の手順は以下の通りです。

  1. 初期値として各点をランダムに、それぞれのクラスタに割り振る
  2. クラスタの中心点を計算し、すべての点を一番近い中心点のクラスタに振り分け直す。
  3. 新しく割り振られた各クラスタの中心点を再度計算し、すべての点を一番近いクラスタに分類しなおす。
  4. 変化が無くなるまで2~3を繰り返す。

結構単純な作業ですよね?ただこれを手計算やExcelなどやろうとすると膨大な時間がかかってしまうのは予想できます。これを自動で素早く行ってくれるのが今回使用したKmeans()です。ではそれぞれの引数の役割を見てみましょう。

n_clusters: データをいくつのクラスタに分類するか。

random_state: 初期値の作成のための乱数決定します。 この数字を決めることで何回やっても同じ初期値が生成されます。

max_iter: 上記の2~3を最大何回反復させるかを決定する。今回みたいに指定しない場合は300回となります。

 

【Let's play around with the numbers!】

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

例えば今回サンプルデータ生成の段階では5つのグループに分かれるように乱数を用いて作成しました。ではKmeans()クラスタの数を8としてみたらどうなるでしょうか?

 予想して実行してみてください・・・

 

f:id:MarcelXX:20210112105335p:plain

0001-6Clustering

f:id:MarcelXX:20210112155516p:plain

0001-7Clustering

どうでしょう、だいたい予想通りでしょうか?上がクラスタの数を5つにした場合で下が8つにした場合です。プログラムが無理くり8個に分けてくれたことがわかりますね!

 

今回は教師なし学習の一例としてK-平均法を用いたクラスタリングを行いました。

 

皆様も是非実際にプログラムを動かしてみてください!

コードは下からコピペして使ってくださいね!

 

0001_clustering

 

 

 

 

【PythonでAI】教師なし学習【簡易版】

ここでは教師なし学習の一例としてクラスタリング(分類)を自動でしてくれるプログラムをPythonを使って書いていきます!

 

【使用するメソッド】

sklearn.cluster

   KMeans

     n個の観測値をk個のクラスターに分類します。

   make_blobs

     好きな数のサンプル(blobs)を生成できます。

 

【コード】

f:id:MarcelXX:20210112134405p:plain

0001-1Clustering


まずは1~3行目で今回使うメソッドをインポートしています。

5行目でサンプルデータの生成、8~11行目が実際に学習を行っている部分です。

13、14行目で結果を表示しました。

実行するとどうなるでしょう??

f:id:MarcelXX:20210112105335p:plain

0001-Clustering

サンプルで生成された点が5個のクラスターに分類されたことがわかりますね!

コードの細かい解説は【AI】教師なし学習【解説版】でお届けします!

 

下からそのままコピペして使ってくださいね!

0001_clustering