AIとファイナンス

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

【PythonでAI】ディープラーニング(深層学習)入門【その4】

このシリーズも折り返し地点を越えました。前回までで人口ニューラルネットワークがどのような動きをするかがわかったと思います。その中で、重みづけであったり、バイアスであったり、予想をするうえでプログラムが勝手に決めてくれる部分があるということがわかりましたね。今回は「活性化関数」について見ていきましょう。

 

(※)このシリーズはディープラーニング(深層学習)入門と題して全7回のシリーズでお届けしています。初めて御覧になる方はこちらを一度ご覧ください。

 

【活性化関数とは】

伝達関数とも呼ばれる活性化関数は、ニューラルネットワークで重要な役割を果たします。少し数学的な言い方をすると、 ニューラルネットワーク非線形性を導入するために使用されます。

f:id:MarcelXX:20210117092034p:plainf:id:MarcelXX:20210117134555p:plain

第3回で学習したように、活性化関数を適用しないと各ニューロンの出力は上記の式のようにz =(入力*重み)+バイアスとなります。この出力は単純な線形回帰に似ていますよね? 活性化関数の目的は、出力を非線形変換して、データ内の複雑なパターンを学習することです。

次に、一般的に使用される興味深い活性化関数のいくつかを見てみましょう。自分のモデルにどのような活性化関数を使うかは自分で決めれます!

 

シグモイド関数

シグモイド関数は、最も一般的に使用される活性化関数の1つです。 どんな出力値でも0から1の間に押しつぶす働きをしてくれます。

また、この式は微分可能なので任意の2点で曲線の傾きを見つけることができます。 これは単調であり、完全に増加しないか、減少しないことを意味します。

 

f:id:MarcelXX:20210121090045p:plain

0005-7Deeplearning

f:id:MarcelXX:20210121090117p:plain

0005-10Deeplearning


 

 

【双曲線正接関数】

下の絵をご覧いただくとわかるとおり、「シグモイド関数と何が違うんだ」といいたくなるくらいそっくりですね!この関数も目的は出力の値を一定の範囲内に抑えることです。この関数は出力を-1~1の間に押しつぶしてくれる関数だということがわかりますね!

f:id:MarcelXX:20210121085957p:plain

0005-9Deeplearning

f:id:MarcelXX:20210121090219p:plain

0005-10Deeplearning

【正規化線形ユニット】

正規化線形ユニット(ReLU)関数は、シグモイド関数と並んで最も一般的に使用される活性化関数の1つです。 0から無限大までの値を出力します。 以下の関数、グラフをご覧いただくとわかる通り、負の数字をが出力されてきたらすべて0にして次のニューロンに情報を渡してしまいます。その一方で正の出力はそのまま次のニューロンに伝えてくれます。

f:id:MarcelXX:20210121091000p:plain

0005-11Deeplearning

f:id:MarcelXX:20210121091034p:plain

0005-12Deeplearning


とりあえず今回は3種類の活性化関数を見てみました!ここで全部網羅するつもりは無く、まずはだいたいどのようなものなのかを把握していただければ全く問題ありません。

次回はいよいよ、人工ニューラルネットワークがどのように「学習」をしているのか、その核となる、順方向伝搬、逆方向伝搬について見ていきます。

 

 

 

 

 

 

 

 

 

 

【PythonでAI】ディープラーニング(深層学習)入門【その3】

第3回のテーマは「人工ニューラルネットワーク」です。

前回は個々の人工ニューロンの動きについて理解しましたね!とは言え単体のニューロンでは複雑なタスクは実行できないので今回は複数のニューロンを組み合わせた人工ニューラルネットワークArtificial Neural Network: ANN)について理解していきます。

 

(※)このシリーズはディープラーニング(深層学習)入門と題して全7回のシリーズでお届けしています。初めて御覧になる方はこちらを一度ご覧ください。

 

人工ニューラルネットワーク

私たちの脳は何十億ものニューロンを層状に積み重ねてネットワークを形成しています。 人工ニューラルネットワークも層状に配置され人工ニューロンの集合として構成されます。一般的には、次の3種類の層(レイヤー)があります。

入力層:Input Layer
隠れ層:Hidden Layer
出力層:Output Layer
各層には複数のニューロンがあり、1つの層のニューロンは他の層のすべてのニューロンと相互作用します。 ただし、同じ層のニューロンは互いに相互作用しません。 ただし、同じ層のニューロンには接続がありません。 ノードまたはユニットという用語を使用して、人工ニューラルネットワークニューロンを表します。

典型的なANNを次の図に示します。

f:id:MarcelXX:20210118015239p:plain

0005-6Deeplearnig

 

 

 

【入力層】

この層はその名の通り、データを入力するそうになります。例えば、翌日の株価を予測するにあたって「前日の高値と安値が関係している」という仮説を持っていたとしましょう。その際は、入力層のニューロンの数は「高値」と「安値」の2つになります。このように自分の仮設や予測したいものに合わせて自分で自由に設計できます。

 

 【隠れ層】

隠れ層は、入力と出力の間の複雑な関係を導き出す役割があります。 つまり、非表示レイヤーはデータセット内のパターンを識別した上で、 データの特徴を抽出します。隠れ層は何層作っても大丈夫ですし各層に何個の人工ニューロンを配置しても大丈夫です。ただ、層やニューロンの数を増やしすぎると計算負荷が掛かるうえ、増やしたからと言って精度が上がり続けるわけでもありません。自分の目的に合わせた設計が必要です。 隠れ層を複数設計した場合、そのネットワークはディープニューラルネットワークDeep Neural Network: DNN)と呼ばれます。

  

【出力層】

入力を処理した後、隠れ層はその結果を出力層に送信します。出力層のニューロンの数は、そのネットワークで解決したい問題のタイプに基づいています。先ほどの株価の予測がしたいのであればニューロンの数は1つです。もし株価が「上がる」か「下がる」を予測するのであればニューロンの数は2つになりますね。

 

自分が設計したニューロンの数だけ、重み付けやバイアスの値が出てきます(前回を参照してください。例えば上の写真の例では入力層のニューロン一個当たり未知数は重み付けとバイアスが1個づつで計2個です。入力層にはニューロンが二個あるので合計4個になります。隠れ層のニューロンは一個当たり計3つの未知数(重み付け:2、バイアス:1)があるので層全体では9個です。

このように計算していくとニューロンが少し増えただけで無数の未知数を計算する必要があることがわかりますね。これをどのように自動的に決めていくのでしょうか?それについては第5回に解説するとして、次回は、前回お話して活性化関数について見ていきます。

 

 

 

 

 

 

 

【PythonでAI】ディープラーニング(深層学習)入門【その2】

今回のテーマは「生物学的ニューロンと人工ニューロンの違い」です。

まずニューロンとは何か、脳内のニューロンが実際にどのように機能するかを探り、人口ニューロンについて理解していきましょう!

 

(※)このシリーズはディープラーニング(深層学習)入門と題して全7回のシリーズでお届けしています。初めて御覧になる方はこちらを一度ご覧ください。

 

ニューロンとは】

ニューロンは、人間の脳の基本的な計算単位として定義できます。私たちの脳には約1,000億個のニューロンが含まれています。すべてのニューロンは、シナプスと呼ばれる構造を介して相互に接続されています。シナプスは主に、外部環境からの入力の受信、筋肉に運動命令を送信す役割などを担っています。

ニューロンは、樹状突起と呼ばれる枝のような構造を介して他のニューロンから入力を受け取ります。これらの入力は強化または弱められます。つまり、それらは重要度に応じて重み付けされるということですね。

中央の細胞体で重みづけされた情報が合計され、後続の他のニューロンに送信されます。

生物学的ニューロンの図を下に示します。

f:id:MarcelXX:20210116171212p:plain

0005-1Deeplearning

「重みづけ」という単語が出てきましたが、これをわかりやすくするための例として、あなたが車を買うときのことを考えてみてください。多くの人にとって車を買うのは大きな決断ですが、人によって重要な情報は変わってきます。「かっこくて速い車に乗りたい」という人であれば車の見た目や色、エンジン排気量などの情報が重要になってくるでしょう。その一方で、「最低限の出費で押さえたい」という人にとって重要なのは価格や燃費です。同じ車を見て、まったく同じ種類の情報をもらっても人によって重視する情報は異なりますニューロンも同じです!

f:id:MarcelXX:20210116180129p:plain

0005-2Deeplearning

上の例で面白いのはどちらの人も判断材料で「エンジン」の情報に重みを付けています。それはエンジンの性能は車のスピードにも、税金や燃費にも密接に関わってくるからですね。つまり、内容が全く同じでも人によってプラスの重みづけをすることもあればマイナスの重みづけをすることもあるということです。そしてこれも、ニューロンでも同じことが言えます!!

 

【人工ニューロン

ある程度生物学的ニューロンのことがわかったので次は人工ニューロンについてみていきましょう。

といっても簡単です!要は上の内容をコンピューターでもわかるように数学的なモデルであらわしてあげればいいだけです。まず先ほどのニューロンを人工的に表すと以下のようになります。ここでバイアスという値が出てきますが今はあまり気にしないでください。

f:id:MarcelXX:20210117092034p:plain

0005-3Deeplearning

まず、入力された各情報はそれぞれ固有の値で重みづけされ、これまたこの人工ニューロン固有のバイアスが足されます。ここまで見ると以下のようにを表せますね。

f:id:MarcelXX:20210117134555p:plain

0005-4Deeplearning

このままではまだ線形回帰と同じなので合計された値をさらに活性化関数(または伝達関数)に代入します。これについては詳しく第5回で解説してきますのでとりあえず「関数を決めるんだ」くらいに思っておいてくださいね。

f:id:MarcelXX:20210117134817p:plain

0005-5Deeplearning

このようにして複数の入力xから一つの出力yを得るわけですね!このyは後続の人工ニューロンに渡されたり全体の結果として出力されたりします。

さて、この例ではニューロン固有の値が「重みづけ」で3個、「バイアス」で1個、合計4個出てきました。この固有の値は一体誰が決めるのでしょうか?

なんとディープラーニングではこの値が自動でプログラムが決めてくれるのです!!

最終的にはどのような方法でこれを行っているか見ていきますが、まずは今回1つしか出てこなかった人工ニューロンを、本当の脳と同じように複数増やしたらどうなるのか見てみましょう!

次回は「人工ニューラルネットワークとその層」と題してさらにディープな世界に足を踏み入れていきます。

 

 

 

 

【PythonでAI】ディープラーニング(深層学習)入門【その1】

今回はディープラーニング入門編のその1です。まずは簡単な概念から説明していき、最終的にはPythonニューラルネットワークを構築していきます。

 

(※)KerasScikit-learnなどのライブラリーには直ぐに使える深層学習のフレームワークが多数ありますが、今回はディープラーニングを理解するためお馴染みのnumpymatplotlibのみ使用して構築します。

 

ディープラーニングとは】

そもそもディープラーニングは、人間の脳のニューラルネットワークに触発された機械学習の一分野です。10年以上前からある理論ですが、計算の進歩と膨大な量のデータの可用性により、従来の機械学習よりも優れているとされ、絶大な人気があります。すでに、画像認識、自然言語処理NLP)、音声認識など、現実の生活の様々なシーンで利用されています。もちろん、このブログの目的でもあるファイナンスへの応用、「株など様々な金融商品の買い時・売り時の判断」、「財務諸表からの企業分析」にも使われています。

 

【学習の流れ】

今回も含めて全7回ディープラーニングの学習を進めていきます。残念ながら第7回までPythonを使ったコーディングはお休みですがこの全7回をすべてクリアすることで最低限の知識が必ず身につきます。是非最後までお付き合いください!

  1. ディープラーニングとは
  2. 生物学的ニューロンと人工ニューロンの違い
  3. 人工ニューラルネットワークとその層
  4. 活性化関数
  5. ニューラルネットワークの順方向、逆方向の伝播
  6. 勾配チェックアルゴリズム
  7. 人工ニューラルネットワークをゼロから構築

 

 

それでは次回から本格的にディープラーニングのディープな世界にダイブして行きます!ご期待ください!

 

 

 

 

 

【PythonでAI】y_hatとは?【コラム】

皆さん機械学習やプログラミングの教科書を見ると、学習の結果予想した値の変数名をy_hatとしているのをよく見かけると思います。

f:id:MarcelXX:20210115114746p:plain

column0001

このy_hat、一体何かの略なのでしょうか?

実は統計用語と深い関係があります。下の式を見てください。

f:id:MarcelXX:20210115115350p:plain

column0001

この式は以前行った最小二乗回帰の概念の式ですが、ここでアルファベットの「y」に注目すると「^」マークが上についているのがお分かりになりますか?

小さな帽子(hat)が乗っているみたいで可愛いですね。

この記号を英語で言うと「y_hat」となり、Pythonを含めた多くのプログラミング言語でこの記号自体出力できない、もしくはめんどくさいためこのようにプログラムの文中では「y_hat」と表記しているんですね!

ちなみに統計学の教科書で「y_hat」が出てくると以下のような意味になります。

「y_hat」(ŷと表記)は、回帰方程式におけるy(従属変数)の予測値です。 これは、応答変数の平均値と見なすこともできます。
https://www.statisticshowto.com/の記事を和訳)

つまり最小二乗法などの回帰分析の結果を「y_hat」と一般に表している、といことですね。

なので、皆さんも今後様々なプログラムを見ていく中で「y_hat」を見かけたら、

この行で予想をしているんだな」、

とあたりがつけられるようになりましたね。

 

 

【PythonでAI】最小二乗回帰【その2】

前回に引き続きここでは最小二乗回帰を使ってデータセットの関係性を予測していきたいと思います。

 

【前回のまとめ】

一次関数と仮定しての回帰は正直かなり微妙な出来だったと思います(下図)。これで「予想できました!」と言われても・・・って感じですね。そこで今回は関数の次数を上げて、2~4次関数と仮定してデータセットを予想してみたいと思います。

 

【コード】

f:id:MarcelXX:20210115102423p:plain

0004-1OLSregression(2)

前回使用したnp.polyfit()を今回も使います。16行目以降にそれぞれ、2~4次関数と仮定して回帰(予想)をしてくれるように書いています。25行目以降はグラフに重ねて表示してくれるプログラムです。実行すると以下のようになります。

f:id:MarcelXX:20210115112035p:plain

0004-2OLSregression(2)

さて、だんだんデータセットに予想した線が近づいてきたのがお分かりいただけるかと思います。ところで今回は1次~4次まで、合計4本予想をしているはずのですが、今見えている線は3本しかありません。これはなぜでしょうか?

理由は、もともとのデータセット自体が3次関数なので、np.polyfit()で4次関数として予想しても4乗の項の係数(a*x^4のa)がゼロとして出力されています。なので4次関数の結果が3次関数の上に重なっており、全体として1本、線が少ないように見えているんですね。

 

前回の1次関数よりかは精度が上がったし、もともとのデータセットの関数を今回のプログラムでしっかり看破することができました。とはいえ今回はもともとのデータセット自体関数で作成していますし、実際の金融市場がn次関数であらわされているとはとても思えないですよね!

なぜAIとファイナンスを題材にするブログでこのあまり使えなさそうな手法をご紹介したかというと以下の2点があります。

  1. 最小二乗回帰も立派な機械学習(AI)の一手法だから
  2. ディープラーニングを理解する上で必要不可欠だから

金融市場を席巻しているアルゴリズミックトレーディング(人間の感情に左右されずに機械的金融商品を売買する手法の総称)ではディープラーニングを多く取り入れています。このブログでも次回以降はディープラーニングについて取り扱っていきます。

 

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

0004_OLSregression(2)

【PythonでAI】最小二乗回帰【その1】

ここでは以前作成したテストデータを使います。テストデータを与えて最小二乗回帰という方法を使用して入力と出力の関係性を予想できるでしょうか??

 

【最小二乗回帰とは】

そもそも統計的回帰の問題では入力値と出力値の間の関数関係に可能な限り近似する関数を見つけることが目的です。

例えば、今回の入力値と出力値が一次関数の関係性なるべくがあると予想しましょう。
(どう見ても違いますがとりあえずです!)

f:id:MarcelXX:20210114175222p:plain

0004-1OLSregression

当然とりあえずで引いている線なので作ったデータセットとは乖離していますよね?この乖離をなるべく小さくした線を最終的に引くことができればうまく予想できたといえそうです!
では乖離を小さくするというのはどいう状況のことなのでしょう?

最小二乗回帰という方法を用いて予想をする場合のフローは以下の通りです。

  1. とりあえず予想で直線を引いてみます(y=ax + bの形)
  2. 予想で引いた線とデータセットの差をすべての点で取ります
  3. 2.でとった値をそれぞれ二乗した上で足し合わせます
  4. 3.の値がより小さくなるように線を引き直します。
  5. 2~4を繰り返して3.が最小となる直線(aとbの値)を見つけます

f:id:MarcelXX:20210114180753p:plain

0004-2OLSregression

結構シンプルですよね?これ、言うのは簡単ですが実際に計算しようとすると大変なんです。上のフローでも図でも当たり前のように「足した値が最小となるように」なんて言っていますが実際にどのように計算するかなんて検討がつく方はなかなかいないんじゃないでしょうか。

そこをいとも簡単にやってくれるのがPythonなんですね!早速コードで見てましょう!

 

【コード】

f:id:MarcelXX:20210115042631p:plain

0004-3OLSregression

お気づきになりましたでしょうか?なんと15~18行目の計3行を足しただけでコードが完成しました!(1~14行目はデータセット作成のためのコードです)これを実行すると以下のようになります。

f:id:MarcelXX:20210115042852p:plain

0004-4OLSregression

引いてある青い直線が今回の最小二乗回帰を用いてプログラムが予想してくれたものになります。コードの細かい部分を見てみましょう。

f:id:MarcelXX:20210115043459p:plain

0004-5OLSregression

今回のポイントはnp.polyfit()ですね!15行目を和訳すると「xとyの関係性を一次関数だとして最小二乗回帰してください」となります。「a, b = 」とあるのはy = ax + bのaとbを教えて欲しい、という意味です。

16行目で一次関数の形にしてあげているのがわかると思います。これをテストデータと重ねて描画すると先ほどのグラフのようになるということですね!

 

さて、この予想ですが皆さんはどのように思われますか?この予想された一次関数で元々のデータセットの特徴を捉えられているといえるでしょうか?
おそらく答えは「ノー」ですよね。

与えられたデータセットが日経225の終値だとして、この手法で翌日の終値を予想できるかというとさすがに厳しそうです。

次回はもう少し精度を上げて予想できるようにしていきます!

 

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

0004_OLSregression