夏休みの
自由研究
動的モード分解による市場価格変動解析
データ駆動モデルについて仕事でやっていて、
5年前に動的モード分解(DMD)について調べた時は難しい文献ばかりで断念していたのですが、
Washington大学のBrunton教授のHPでレクチャーの動画が公開してあり、
Data-driven Science & Engineering
Section 7.2: Dynamic Mode Decomposition (DMD)
そこで驚くほど簡単に説明してあリました。(このテキストを私は購入しましたが、円安のためすごい値上がりしてしまいました。旧版のテキスト( 基本部分はほとんど同じ)がHPからダウンロードできます)
研究2の流体解析にも適用してみましたが、
ちょうど夏の連休で1週間あったので、従来から疑問に思っていた、市場価格変動に適用してみました。
これについては、そのうち自分が売買する参考に使えないかという気が全く無いとは言えませんが、
一番は、昔から経済というのがよく分からないので、それを自分なりに腑に落ちるようにしたい、ということがあります。
車やエンジン燃焼のシステム制御では、センサをいっぱい取り付けてそれらを入力にしてフィードバック制御してうまくやっているのに、経済というシステムに対してはなんか理念的に考えたことを元にやっているような気がして、ちゃんと制御系を設計してやれば、バブルだとか不景気だとかインフレだとかデフレだとか不都合なことが無くせるのではないか、その手始めに手近なところから、といったところです。
若い頃、経済学部の人にそういったことを聞いてみましたが、私にはピンとこない回答しかなかったので。電磁波の伝搬とか天気の変化とかと同様に物理モデルに落とせれば分かった感じがすると思うのです。
こういったDMDの応用は既にいろいろやられているようなのですが、検索しても出てこないので、多分そのままでは役に立つ結果は出ないのだろうと思いましたが、題材としては手軽なので、試しにやってみようということです。
少し家の者に手伝ってもらい、手元にあった2020年の株価変動データに適用してみました。
既知のように(注1)市場価格変動は非線形でカオスを含んでいるのに対し、今回適用した基本的なDMDは非線形の系には対応していますが、モードとして支配的な周期成分を抽出するものなので、完全に把握できるはずは無いですが、ローレンツ・アトラクタのように準周期的な期間が続いたのちに突然別の準周期的な状態に移行するような挙動を示すなら、短期間の準周期成分が把握できる可能性はあると思いました。
注1:
高安秀樹, 経済物理学の発見
高安秀樹,高安美佐子,エコノフィジックス 市場に潜む物理法則
2020年株価変動解析
2020年の東証上場銘柄の終値データが入手できた4038銘柄中、全ての日のデータが揃っていた3272銘柄を対象として、
半年分1月6日〜6月30日のデータ120点の行列dmatcについて、
X = dmatc(:,1:119);
X’ = dmatc(:,2:120);
として、特異値分解に基づくDMDを適用しました。(処理は全てMATLAB R2022a home Licenseで計算しています。)
全銘柄について初日1月6日の値で正規化して、横並びで比較できるようにしています。
コロナ禍が発生した年なので、その影響があるかもしれません。
抽出したモードの固有値マップ(極配置)はこのようになりました:

縦軸Yは周波数[1/day] 横軸Xは1日のゲイン(増加比)です。
負の周波数は無視して、ゲインが大きな極についてX, Yの値を記してあります。
ゲインが1より大、すなわち発散傾向のモードが1つあります。1より誤差程度大きいだけですが。
ゲインが大きなモードについてどういう要素(銘柄)の寄与が大きいかを見るために、それぞれ上位10要素を表示してみます。
モードとは固有ベクトルのことですが、各要素の値(大きさと位相を持った複素数)がどの様な組み合わせになっているかを示しているということで、この様な解析ではモード(日本語では姿態)と呼ばれるそうです。
(1) Gain: X=1.0003[1/day] , Freq: Y=0.0936035[1/day], 周期: 1/Y =10.68[days] のモード
"2191" "テラ"
"3686" "ディーエルイ"
"3998" "すららネット"
"6897" "ツインバード"
"3020" "アプライド"
"1757" "クレアホール"
"9973" "小僧寿し"
"2370" "メディネット"
"6090" "ヒューマンメ"
"3542" "ベガコーポ"
:
(2) Gain: X=0.999392[1/day] , Freq: Y=0.261522[1/day], 周期: 1/Y =3.82[days] のモード
"2191" "テラ"
"3998" "すららネット"
"8256" "プロルート丸"
"3686" "ディーエルイ"
"1757" "クレアホール"
"6897" "ツインバード"
"1552" "国際のETF_VI"
"4519" "中外製薬"
"3202" "ダイトウボウ"
"7707" "プレシジョン"
:
(3) Gain: X=0.99796[1/day] , Freq: Y=0.22456[1/day], 周期: 1/Y =4.45[days] のモード
"2191" "テラ"
"3998" "すららネット"
"1757" "クレアホール"
"7610" "テイツー"
"3409" "北日本紡績"
"3020" "アプライド"
"1552" "国際のETF_VI"
"7707" "プレシジョン"
"3604" "川本産業"
"2035" "日経VI先物指"
:
(4) Gain: X=0.99793[1/day] , Freq: Y=0.035269[1/day], 周期: 1/Y =28.35[days] のモード
"7707" "プレシジョン"
"9973" "小僧寿し"
"6897" "ツインバード"
"3998" "すららネット"
"3686" "ディーエルイ"
"1757" "クレアホール"
"4571" "ナノキャリア"
"4477" "BASE"
"3409" "北日本紡績"
"3927" "フーバーブレ"
:
(5) Gain: X=0.99372[1/day] , Freq: Y=0.46058[1/day], 周期: 1/Y =2.17[days] のモード
"1689" "ETFS天然ガス"
"2191" "テラ"
"3998" "すららネット"
"8256" "プロルート丸"
"9973" "小僧寿し"
"7610" "テイツー"
"2370" "メディネット"
"3409" "北日本紡績"
"4477" "BASE"
"4563" "アンジェス"
:
(6) Gain: X=0.9952[1/day] , Freq: Y=0.016901[1/day], 周期: 1/Y =59.17[days] のモード
"2191" "テラ"
"7707" "プレシジョン"
"1757" "クレアホール"
"3686" "ディーエルイ"
"8256" "プロルート丸"
"3788" "GMOクラウ"
"9973" "小僧寿し"
"6897" "ツインバード"
"3998" "すららネット"
"3020" "アプライド"
:
(7) Gain: X=0.99806[1/day] , Freq: Y=0[1/day], 周期: 1/Y =Inf[days] のモード
"2191" "テラ"
"7707" "プレシジョン"
"3604" "川本産業"
"4563" "アンジェス"
"4308" "Jストリーム"
"8256" "プロルート丸"
"1552" "国際のETF_VI"
"1757" "クレアホール"
"3788" "GMOクラウ"
"3911" "Aiming"
:
これは上の図の吹き出しと対応していませんが、x軸上にある振動せず減衰するのみの極です。
このように見ると、複数のモードに共通して含まれる銘柄が多いので、関連するものがモードごとに分かれるという感じではなく、変化が大きいものがどのモードにも顔を出す感じです。
モードごとの要素の分離が悪いのが特徴のようで、これは私の本業の電線束の多導体伝送線路解析(コモンモード、差動モードなどの組み合わせにより、モードごとに支配的な導体や位相が明確に分かれる)からするとちょっと予想が外れて嬉しく無い結果ですが、そういうものなのでしょう。あるいは、減衰の少ないモードだけ見ているのでそうなっているので、減衰の大きなモードを見れば別のグループが支配的になっているかもしれません。位相についてはまだ見ていないので、また見てみましょう。
なので、「モードに分ければ関連ある企業が自然にグループ分けされるのでは」と期待していましたが、見た感じ同じモードの支配的な要素同士に脈絡は無い様なので、たまたま同じ様な変動成分を持っているものが同じモードに括られただけの様な感じです。
ところで、上記のモード(4)以外の上位に顔を出している"2191" "テラ"という感じの良い名前の会社をWikipediaで見てみると、
「テラ株式会社は、かつて東京都新宿区に本社を置き、樹状細胞ワクチン療法の研究開発とそれに基づく医療支援事業を行っていた企業。2004年設立、東大医科学研究所の技術・ノウハウの権利を独占した期待の療法支援として注目され上場もしたが、業績悪化とともに法令違反や新型コロナ治療薬虚偽開示が発覚し、2022年に倒産した。」
となっており、ちょうど「コロナワクチンができそうだ」という虚偽情報で株価が上がっている最中の変動が上記のモードに反映されていた様ですね。
モデルができたらそれを使った予測が実測と合うか検証する、というのが常道で、私の研究テーマ1や2も同じですが、
これで一応、2020年1月から6月の3272銘柄のモード分解という形で時変モデルができたことになるため、このモデルで予測できないかというのが気になります。
それを見てみましょう。といってもProf. Bruntonのテキストで A=X' X+ として b) Future state prediction xk+1 = A xk
とあるのを使うだけです。
モデル作製に使わなかった期間を推定する、ということで、7月1日の時点での情報を使って3272銘柄の20日間の推移を予測するとして計算します。
多分、上記の低減衰モードの上位要素は単調増加ではないかと思われるので、上記で1回だけ顔を出している
"2035" "日経VI先物指数" についての結果を抽出してみると:

となり、3日目以降全く逆の推移をしており、全然だめですね。
実データが3日目以降急に下がっているのについて行けてない感じなので、改めて7月3日の値をベースに3272銘柄の20日間の予測を計算し、"2035"の結果を抽出してみると:

となり、ましにはなりました。
この "2035" "日経VI先物指数"について調べてみると「一般に、日経平均株価が急落する時に急上昇する特徴があり、日経225先物とは通常弱く逆相関する関係になります。」ということです。
初期値依存性が高い感じですが、カオスの影響を除外すると、
・予測の初期値として1日のデータのみ利用し、時間的推移は使っていない
・先にモード解析で見た様に、同じ要素(銘柄)が複数のモードで支配的になっており、情報が偏在しているため、なおさら1日のデータから正しくモードに分解されにくい
という点が影響していると思います。
続きはまた時間ができた時にやってみようと思います。
また、Brunton教授のレクチャー動画では、「DMDの拡張がいろいろ提案されており、カオスな系を扱えるような手法もある」とのことでしたので、それも参考にしてゆきたいと思います。
以上