遺伝的アルゴリズムで最適な株式ポートフォリオを作る方法

出版日: 2024年5月10日

遺伝的アルゴリズムで最適な株式ポートフォリオを作る方法

Note: この記事はMediumに掲載されました。元の記事はこちらで見つけることができます。

もし私のように、お金の投資方法に頭を悩ませている方であれば、この記事はあなたのためかもしれません!

この記事は投資アドバイスではないので、ご自身の判断でお使いください。あなたの金融的な決定に対する責任は負いません。

背景

リスク調整後のリターンが平均を上回る投資をする方法はあるでしょうか? 例えば、単独では平均的な性能を発揮するかもしれない10の株(例:1. テスラ + 2. IBM + 3. シェブロン +… + 10. ゲームストップ)を特定して、同時に投資することで強力な結果を得ることができますか?

S&P 500の10銘柄の組み合わせをすべて試してみると、245,810,588,801,891,070,000通りあり、これを見つけるのに狂気じみた時間がかかります。 そのようなシナリオでは、遺伝的アルゴリズムが役立ちます。なぜなら、それは「最適な」10銘柄のポートフォリオを見つけるのにかなり短い時間しかかからないからです。

Money

問題の設定

S&P 500に上場している株から、最も良いリスク調整後のリターンをもたらす10銘柄の組み合わせを見つけたいと思います。 リターンは、そのポートフォリオの%成長であり、リスクは投資期間中に観察された標準偏差です。 リスク調整後のリターンは、リターンをリスクで割ったものです。

方法

遺伝的アルゴリズムを使用して、10銘柄の組み合わせを繰り返し、最も良いリスク調整後のリターンを見つけようとします。 以下のビデオは遺伝的アルゴリズムの概要を示しています。

高レベルでは、遺伝的アルゴリズムは進化を模倣し、ポートフォリオの世代を繰り返し、強い「適応度」(ポートフォリオのリスク調整後のリターン)のみを残します。 「クロスオーバー」(既存の2つの株ポートフォリオを組み合わせて新しいポートフォリオを生成する)や「ミューテーション」(ポートフォリオ内の株をランダムに交換する)などのメカニズムは、モデルが局所的な最小値に停滞するのを防ぎ、計算プロセスに多様性を導入します。

遺伝的アルゴリズムを簡単に実装するのに役立つPythonのPyGADライブラリを使用します。

データ

S&P500の株式リストを取得し(データソースは最後に記載されています)、Yahoo Financeにアクセスしてリスト内の各株の過去のパフォーマンスを取得します。 すべての株価は、投資期間の開始時の価格に基づいて$10に正規化された「調整後終値」が使用されます。 これは、各株に均等に投資したいためです。各株チッカーには、使用する遺伝的アルゴリズムライブラリに必要な株式インデックスが割り当てられます。 以下は、遺伝的アルゴリズムにフィードされるデータの見方です:

Data

投資期間の開始日と終了日を2021年4月〜2022年3月に任意に設定します。 「調整後終値」は株価に使用され、すべての株価は投資期間の開始時の価格に基づいて$10に正規化されます。これは、各株に均等に投資したいためです。 各株チッカーには、使用する遺伝的アルゴリズムライブラリに必要な株式インデックスが割り当てられます。 以下は、遺伝的アルゴリズムにフィードされるデータの見方です:

Final data

トレーニング

GAには多くのパラメーターがあります(世代数、集団あたりのソリューション数、突然変異遺伝子の%など)。 最適なパラメーターを見つけるためにクイックハイパーパラメーター最適化を行います。 次に、最適な株ポートフォリオを見つけるためにアルゴリズムをトレーニングします。 以下のチャートで見られるように、アルゴリズムはフィットネス(リスク調整後のリターン)を約20世代で倍増させ、フィットネスが改善されない限り続きます。

Training

結果 - ベンチマーク1:S&P 500

まず第一に、市場指数S&P500のパフォーマンスを改善したかったので、投資期間のパフォーマンスを見てみましょう:

Results - Benchmark 1: S&P 500

S&P 500のパフォーマンスはこの期間中まったく目立たず、年間約7%のリターンと、約1%のデイリーリスク(標準偏差)を示し、これによりリスク調整後のリターンは約8%となります。 このベンチマークは打ち負かすのがあまりにも簡単なので、別のベンチマークを見つけましょう:

結果 - ベンチマーク2:トップ10のパフォーマー

投資期間中に、最も高いリターンを達成した10銘柄を選択しました(これはリスクを考慮に入れていない注意してください)。 上位10銘柄は「DVN」、「APA」、「MRO」、「COP」、「CF」、「FTNT」、「OXY」、「FANG」、「NVDA」、および「MOS」でした。 これらの企業のほとんどはエネルギー関連のビジネスにあり、NVIDIAのような例外もあります。

Results - Benchmark 2: Top 10 performers

上記のように、これら10社のポートフォリオは約90%の成長と約2%のリスクをもたらしました。 全体として、リスク調整後のリターンは42.8%でした。

私たちの結果

当社のモデルは、「CERN」、「DVN」、「DRE」、「ABBV」、「SEE」、「ORLY」、「WST」、「COP」、「ED」、「PSA」株の組み合わせを最高のリスク調整後のリターンをもたらすトップポートフォリオとして特定しました。 これらの企業の一部はベンチマーク#2(トップパフォーマー)にも存在しますが、Abbvieなどの新しいエントリーも見られます。

Our Results

モデルの通常のリターンはトップパフォーマーのそれ以下であり、約52%ですが、リスクは0.8%に大幅に低下しています。 上記のグラフで見られるように、ポートフォリオはスイングを経験せず、一貫して増加します。 全体的に、ポートフォリオはリスク調整後のリターンが62%であり、トップパフォーマーのポートフォリオよりも20pp高いです。

Conclusion

結論

リスク調整後のリターンが最大のポートフォリオを見つけるために遺伝的アルゴリズムをトレーニングしました。 遺伝的アルゴリズムは数十億の可能なポートフォリオの中から「十分に良い」ソリューションを見つけるのに役立ちました。 さらなるトレーニングでより高いリターンが得られます。

このGitHubリポジトリでデータとコードを見つけることができます。

ハッピーハッキング!

このブログは英語からChatGPTによって翻訳されました。不明な点がある場合は、お問い合わせページからご連絡ください。

コメントを残す

コメント

その他のブログ

SvelteとJavaScriptを使用してシンプルで動的なツールチップを作成する

2024/06/19

SvelteとJavaScriptを使用してシンプルで動的なツールチップを作成する

JavaScriptSvelteTooltip動的シンプルツールチップフロントエンド
JavaScriptを用いて東京都のインタラクティブな地図を作成する

2024/06/17

JavaScriptを用いて東京都のインタラクティブな地図を作成する

SvelteSVGJavaScriptTailwindインタラクティブな地図東京市区町村23区地図
Matplotlibで日本語文字化けを解決できる簡単な方法

2024/06/14

Matplotlibで日本語文字化けを解決できる簡単な方法

MatplotlibグラフチャートPython日本語文字化け問題バグ
書評 | トーキング・トゥ・ストレンジャーズ 「よく知らない人」について私たちが知っておくべきこと by マルコム・グラッドウェル

2024/06/13

書評 | トーキング・トゥ・ストレンジャーズ 「よく知らない人」について私たちが知っておくべきこと by マルコム・グラッドウェル

書評トーキング・トゥ・ストレンジャーズ「よく知らない人」について私たちが知っておくべきことマルコム・グラッドウェル
日本語で最もよく使われる3000字の漢字

2024/06/07

日本語で最もよく使われる3000字の漢字

3000よく使う準漢字使用回数漢字日本語漢字リスト漢字普及率日本語能力試験独学勉強単語
VSCodeでRegexを使用してReplaceする方法

2024/06/07

VSCodeでRegexを使用してReplaceする方法

VSCodeRegex検索置き換える条件付き置換FindReplaceConditional Replace
SvelteではReadable Storeを使用するな

2024/06/06

SvelteではReadable Storeを使用するな

SvelteReadableWritableステート管理ストアStore速度メモリファイルサイズ
GzipとPakoでデータを圧縮してWebサイトのローディング速度を上げる方法

2024/06/05

GzipとPakoでデータを圧縮してWebサイトのローディング速度を上げる方法

Gzip圧縮PakoWebサイトローディング速度SvelteKit
JavaScriptを使用してWebページ上でマウスが指している単語を特定する

2024/05/31

JavaScriptを使用してWebページ上でマウスが指している単語を特定する

JavascriptマウスPointerHoverWeb開発
SvelteとSVGを用いてインタラクティブな地図を作成する

2024/05/29

SvelteとSVGを用いてインタラクティブな地図を作成する

SvelteSVGインタラクティブな地図フロントエンド
書評 | Originals 誰もが「人と違うこと」ができる時代 by アダム・グラント & シェリル・サンドバーグ

2024/05/28

書評 | Originals 誰もが「人と違うこと」ができる時代 by アダム・グラント & シェリル・サンドバーグ

書評Originals誰もが「人と違うこと」ができる時代アダム・グラント & シェリル・サンドバーグ
Javascriptを使用して数独を解く方法

2024/05/27

Javascriptを使用して数独を解く方法

数独を解くアルゴリズムJavaScriptコーディング
ウェブサイトへのトラフィックを1か月で10倍に増やした方法

2024/05/26

ウェブサイトへのトラフィックを1か月で10倍に増やした方法

ウェブサイトへのトラフィック増加クリックインプレッションGoogle Search Console
人生はサイクリングに似ている

2024/05/24

人生はサイクリングに似ている

サイクリング人生哲学成功
JavaScriptでバックトラッキング・アルゴリズムを用いて完全な数独グリッドを生成する

2024/05/19

JavaScriptでバックトラッキング・アルゴリズムを用いて完全な数独グリッドを生成する

数独バックトラッキング・アルゴリズム完全なグリッドJavaScript
Tailwindが素晴らしい理由とWeb開発をいかに楽にするか

2024/05/16

Tailwindが素晴らしい理由とWeb開発をいかに楽にするか

Tailwind素晴らしいフロントエンドWeb開発
PythonとGitフックを使用してサイトマップを自動的に生成する

2024/05/15

PythonとGitフックを使用してサイトマップを自動的に生成する

GitフックPythonサイトマップSvelteKit
書評 | Range (レンジ) 知識の「幅」が最強の武器になる by デイビッド・エプスタイン

2024/05/14

書評 | Range (レンジ) 知識の「幅」が最強の武器になる by デイビッド・エプスタイン

書評Range (レンジ)David Epstein (デイビッド・エプスタイン)知識の「幅」が最強の武器になる
SvelteとSvelteKitはなんですか?

2024/05/13

SvelteとSvelteKitはなんですか?

SvelteSvelteKitFront-endVite
SvelteKitで国際化(多言語化)

2024/05/12

SvelteKitで国際化(多言語化)

国際化多言語SvelteKitI18N
SvelteでCachingを用いてDeploy時間を短縮する方法

2024/05/11

SvelteでCachingを用いてDeploy時間を短縮する方法

SvelteEnhanced ImageCachingDeploy Time
SvelteとIntersection Oberverによるレイジーローディング

2024/05/10

SvelteとIntersection Oberverによるレイジーローディング

レイジーローディングウェブサイト速度の最適化SvelteIntersection Observer
Pythonを用いてShapeFileをSVGに変換できる方法

2024/05/09

Pythonを用いてShapeFileをSVGに変換できる方法

ShapeFileSVGPythonGeoJSON
Svelteの反応性:変数、バインディング、およびキー関数

2024/05/08

Svelteの反応性:変数、バインディング、およびキー関数

Svelte反応性バインディングキー関数
書評 | 孫子の兵法

2024/05/07

書評 | 孫子の兵法

書評The Art Of War (兵法)Sun Tzu (孫子)Thomas Cleary
スペシャリストは終了。ゼネラリスト万歳!

2024/05/06

スペシャリストは終了。ゼネラリスト万歳!

専門家ジェネラリストパラダイムシフトソフトウエア・エンジニアリング
トルコ人の有権者の投票行動をPythonでの分析

2024/05/03

トルコ人の有権者の投票行動をPythonでの分析

トルコ投票者年齢分析国家投票有権者行動分析
Seleniumを用いてトルコ投票データベースを作る方法

2024/05/01

Seleniumを用いてトルコ投票データベースを作る方法

PythonSeleniumWeb Scrapingトルコ国家投票
SvelteとTailwindを使用してInfinite Scrollできる方法

2024/04/30

SvelteとTailwindを使用してInfinite Scrollできる方法

SvelteTailwindInfinite ScrollFront-end
1年間以内で日本語を駆使できるようになるための方法

2024/04/29

1年間以内で日本語を駆使できるようになるための方法

日本語短時間言語学習日本語能力試験ビジネス日本語
SvelteとTailwindを用いたWebサイトテンプレート

2024/04/25

SvelteとTailwindを用いたWebサイトテンプレート

Web開発フロントエンドSvelteTailwind
怠惰なエンジニアとひどいデザイン

2024/01/29

怠惰なエンジニアとひどいデザイン

怠け者エンジニア質の悪い製品StarbucksSBI証券
偉大さについて

2024/01/28

偉大さについて

雄大さ人生の意味満足できる人生目的
MacBook で PDF を PNG に変換する

2024/01/28

MacBook で PDF を PNG に変換する

PDFPNGMacBookAutomator
2023年振り返り:24冊の読んだ本のまとめ

2023/12/31

2023年振り返り:24冊の読んだ本のまとめ

読書 2023振り返り
Python PILを使用して写真コラージュを作成する方法

2023/12/30

Python PILを使用して写真コラージュを作成する方法

PythonPIL画像処理コラージュ
ウェブサイトの訪問者のデバイスとブラウザを検出する方法

2024/01/09

ウェブサイトの訪問者のデバイスとブラウザを検出する方法

Javascript端末検知ブラウザ検知Website分析
ChatGPT回答の解析

2024/01/19

ChatGPT回答の解析

ChatGPT大規模言語モデル機械学習生成AI