Site Overlay

将来の資産を“分布”で考える:モンテカルロ法による積立・取崩しシミュレーション

こんにちは。久しぶりの投稿です。 突然ですが、みなさん資産運用してますか。 私は少し前から投資に興味が出てきており、いろいろネットや書籍を漁ってる状況です。 その中で資産の試算では、「年率5%で運用できた場合」といった平均リターンにもとづく計算がよく使われます。 もちろん、これは将来を考えるうえで便利な方法です。ただ、実際の市場は毎年きれいに5%ずつ増えるわけではありません。ある年は大きく上がり、別の年には大きく下がる。そうした変動を繰り返しながら、長期的なリターンが形作られていきます。 特に退職後の取り崩し期では、この「値動きの順番」が重要になります。退職直後に大きな下落が起きると、その後に市場が回復しても、取り崩しによって失われた資産を十分に取り戻せない場合があります。 そこで今回は、もう少し数理科学の知識を活用して、金融工学(の基本的内容)とモンテカルロシミュレーションを使って、老後資金をひとつの予測値ではなく「将来資産の分布」として考えてみます。 「平均リターンで計算」の落とし穴 老後資金や資産形成のシミュレーションでは、よく「年率5%で運用できた場合」といった前提が使われます。 たとえば、毎月5万円を30年間積み立て、年率5%で運用できた場合、将来資産はいくらになる、という計算です。これは分かりやすく、ざっくりとした目安を把握するには便利です。 ただし、この計算にはひとつ大きな前提があります。 それは、毎年安定して同じリターンが得られるかのように扱っている点です。 実際の市場では、毎年同じように資産が増えるわけではありません。ある年は20%上がり、翌年は30%下がる、といった乱高下が起こります。長期的には成長していても、その途中経路はかなり不安定です。 この「途中経路の違い」は、特に退職後の取り崩し期で大きな意味を持ちます。 退職直後に市場が大きく下落し、そのタイミングで生活費として資産を取り崩すと、資産残高が大きく減ってしまいます。その後に市場が回復しても、すでに取り崩した分は運用に残っていないため、資産の回復力が弱くなることがあります。 このように、同じ平均リターンでも、リターンが発生する順番によって資産寿命が変わるリスクは、リターン・シーケンス・リスクと呼ばれます。 平均リターンだけで老後資金を考えると、このリスクを見落としやすくなります。 モンテカルロシミュレーションとは そこで活用されるのが、モンテカルロシミュレーションです。 一言でいうと、モンテカルロシミュレーションは、 > ランダムな値動きを何千通りも発生させて、将来資産がどのような範囲に分布するかを見る手法 です。 1本の未来を予測するのではなく、たくさんの未来を仮想的に作ります。 その結果、 といった複数の可能性を確認できます。 今回作成したシミュレーターでは、リターンやリスクなどの前提条件をもとに、将来の資産推移を多数生成します。そのうえで、中央値、下位シナリオ、資産枯渇リスクなどを確認できるようにしています。 技術的には、株価のように上がったり下がったりしながら長期的に変動する資産価格を表現するために、幾何ブラウン運動(GBM)という数理モデルの考え方を使っています。 数理的な詳細は別記事で扱う予定ですが、まずは「将来をひとつの予測値ではなく、分布として見るための方法」と考えていただければ十分です。 作ったシミュレーターを紹介しますContinue reading将来の資産を“分布”で考える:モンテカルロ法による積立・取崩しシミュレーション

量子論の誤解を解くための記事② 引き寄せの法則

友人の友人が最近スピリチュアルに沼っており、そのときに説明した内容 + αをこちらにまとめます。 現代は「量子」という言葉がひとり歩きしています。SNSやビジネス書籍でも、量子力学を悪用した「スピリチュアル量子」が散見されます。 この記事では、特に頼りにされる概念 「引き寄せの法則」 について、現代物理学の視点から明らかにしていきます。 1. 引き寄せの法則 ― 「思考は現実を引き寄せる」? 結論からいうと、思考が現実を引き寄せることは現代物理学から証明されているわけではありません。 引き寄せの法則の主張 「人間の思考や意識が重要な「波動」を生み出し、それが現実を引き寄せる。」 というもので、もう少し詳細に記述すれば以下の通りです。 表現の自由なので、いろいろな主張があってもよいかとは思いますが、その理論の拠り所を量子力学や場の量子論とするならば、いずれも正しくありません。 1-1 量子力学における波動 量子力学において、基礎方程式の1つであるシュレディンガー方程式は \[i\hbar \frac{\partial}{\partial t} \psi(\mathbf{r}, t) = \left[ \frac{- \hbar^2}{2m}\nabla^2 + V(\mathbf{r})Continue reading量子論の誤解を解くための記事② 引き寄せの法則

各種AIを使って動画ファイルから議事メモを作成する3

こんにちは、本日は音声ファイルから文字起こししたテキストファイルを要約してみます。 実行順序の最後の部分になります。 実行順序 1.動画ファイルから音声データを抽出する。 2.音声データを適当な大きさのファイルに分割する。 3.分割したファイル各々に対して、AIを使って文字起こしを実施する。 4.文字起こししたファイルたちをAIを用いて要約し、議事メモのサマリを作成する。 application_service.pyの中では以下の部分です。 1. 準備 今回はOpenAIのAPIを用います。 ChatGPTはWeb画面でOpenAI製のLLM(Large Language Model、大規模言語モデル)とやりとりしますが、APIも用意されています。ChatGPTはアカウント登録すれば無料で使用できますが、APIはトークンに応じた料金がかかります。 まずは、APIキーの発行が必要です。ざっくりいうと、 となります。詳細は以下のサイトを参照ください。 https://ai-workstyle.com/gpt-apikey/ https://zenn.dev/umi_mori/books/chatbot-chatgpt/viewer/how_to_use_openai_api#api%E3%81%AE%E7%99%BA%E8%A1%8C%E6%96%B9%E6%B3%95 2. 実装 今回は以下のライブラリを用います。 LangchainはLLMを使用したアプリケーション開発のためのオープンソース・オーケストレーション・フレームワークです。PythonとJavascriptがサポートされています。LLMを使ったアプリケーションを開発する上でのデファクトスタンダードとなっています。 今回もLangchainを利用します。 1.テキスト要約の処理方式 APIには文字数制限がある関係上、長文を一気に要約させることはできません。 その対策として以下の対策があります。(詳細はこちら) 1) Map-Reduce Map-Reduceの手順は1)長い文章をいくつかの文章に分割 2)それぞれの文章を要約3)要約した文章を結合4)結合した文章をさらに要約 するようなものです。いわゆるHadoopのMap-Reduceの考え方を踏襲したようなものとなります。Continue reading各種AIを使って動画ファイルから議事メモを作成する3

各種AIを使って動画ファイルから議事メモを作成する2

前回に続いて、今回用いて文字起こしを実施していきます。今回は以下順序の3にあたります。 実行順序 1.動画ファイルから音声データを抽出する。 2.音声データを適当な大きさのファイルに分割する。 3.分割したファイル各々に対して、AIを使って文字起こしを実施する。 4.文字起こししたファイルたちをAIを用いて要約し、議事メモのサマリを作成する。 application_service.pyでいうと以下のところです。 1. 準備 今回はWatson DiscoveryのSpeechToTextというサービスを用います。こちらはIBM Cloud上で展開されているサービスで、ローカルからAPIを呼び出すことで、処理を実行します。 そのためAPIキーが必要になります。この手順については以下のページを参照ください。IBMidの登録が必要になります。 https://cloud.ibm.com/docs/speech-to-text?topic=speech-to-text-gettingStarted&locale=ja 上記のページはspeech to textの入門ページで、pythonの実行環境がなくてもコマンドのみでspeech to textの機能を試せるので、興味があればお試しください。 liteプランは毎月500分の音声ファイルまで無料で使えます。私はliteプランで本件を試しています。 ※料金プランの詳細が気になる方はこちらを参照ください。ちなみにこのブログから上記プランに入ったところで私には一切実入しませんので、あしからず。 2. 実装 Watson Discoveryとやりとりするライブラリ、環境変数を読み出すためのライブラリをインストールします。 ということで、めんどいので、コードを以下に記載します。 みたらわかる方であれば、以下は飛ばしてしまって問題ありません。 少し補足します。 概要 本クラスのインスタンスが呼ばれるのは、perform_transcriptionメソッドであり、音声ファイル数分ループさせていて、それぞれのループでリクエストを非同期で投げています。レスポンスを受け取り次第、transcribeした文字列をファイル出力しています。すべてのループが完了した時点で、ファイル名のリストをreturnします。Continue reading各種AIを使って動画ファイルから議事メモを作成する2

各種AIを使って動画ファイルから議事メモを作成する1

こんにちは、久しぶりの投稿です。 唐突ですが、最近議事メモをとるのが、かなりめんどくさく感じておりまして、勉強がてら自動で議事メモを作成するアプリを作成してみました。 アプリの主な実行順序としては以下の通りです。使用言語はpythonとなります。 実行手順 1.動画ファイルから音声データを抽出する。 2.音声データを適当な大きさのファイルに分割する。 3.分割したファイル各々に対して、AIを使って文字起こしを実施する。 4.文字起こししたファイルたちをAIを用いて要約し、議事メモのサマリを作成する。 いくつか前提事項です。 以下順番に見ていきます。 0.全体構成 各論に入る前に全体の構成を以下に示しておきます。 なお、*.eggInfoや__pycache__などは省略しています。また・activate_transcript_env.sh・create_env.sh・deactivate_transcript_env.shは本アプリを実行するための環境作成/アクティベートするもので、私個人の環境でpython実行する際の都合によるものなので、説明は割愛します。 いくつかコメントします。 コードは以下のイメージです。 端的にいえば、MeetingMinutesCreationServiceはDDD(ドメイン駆動設計)におけるアプリケーションサービスにあたるもので、フロー制御を行っているものとなり、詳細については各処理に委譲しています。 それでは各処理についてみていきます。 1. 動画ファイルから音声データを抽出する 本コンポーネントはこちらを参考にしています。 まずpythonで音声データを抽出するには、ffmpegというソフトをまずインストールします。ffmpegのインストールについてはこちらを参照してください。(私はmacを使っているので、brewでインストールしました。) というのもpythonで動画ファイルの編集をするにはmoviepyというpythonライブラリが必要なのですが、どうやらmoviepyの内部でffmpegを使用してるようであるためです。(ソース:こちら) moviepyのインストールはpipでインストールできますが、今回はrequirement.txtで他のライブラリ含めて一括でインストールします: これで準備が整いました。早速pythonコードを以下に記します。 かなりシンプルなので、あまり説明を加える必要もないかもしれませんが、、 2. 音声データを適当な大きさのファイルに分割する。 次に音声ファイルを分割します。本セクションはこちらを参考にしてます。 これは音声ファイルのサイズが大きすぎると生成AIのトークン上限に引っかかってしまうためです。 こちらで追加でインストールするライブラリは「scipy」です。Continue reading各種AIを使って動画ファイルから議事メモを作成する1

簡単なWebサービスをPythonのみで作ってみた4

こんにちは、本日はFastAPIのサブクラス化をしてみます。 FastAPIを使ってある程度のWebサービスを構築する際、main.pyにずらずらメソッドを追加していくのは個人的にあまり好きではないので、クラス化します。いろいろネットで調べてみたのですが、意外とサブクラスにする記事がなかったので、勝手に本稿で記載してみます。 こちらで作成したFastAPIのmain.pyを再掲します。 ここまでメソッドがずらずらあると、なんかクラス化したくなるかと思います。というわけでFastAPIを継承してサブクラスを作成し、main.pyから分離してみます。 もう結果を記載すると以下の通りです。まずmain.pyからです。 だいぶスッキリしました。次にuser_api.pyです。 修正前のmain.pyで「@app.get(“/”)」などとしていたデコレータは、そのままではUserRegistrationAPIクラスにもってこれないので、FastAPIクラスのメソッド「add_api_route」を用いて、UserRegistrationAPIの各メソッドとエンドポイントを紐づけています。その紐付けを「link_routes」メソッドにまとめ、コンストラクタ__init__で実施している形です。 本日は短いですが、以上です。かなりニッチですが、本記事がだれかの役に立てば幸いです。 最後まで読んでいただきありがとうございます。質問等はコメント欄かお問合せにてよろしくおねがいいたします。

深層学習がうまくいく理由の妄想 その1

ここ最近ディープラーニングの発展が著しい。chatGPTに代表される生成系AIは、ぱっと見人間が書いた文章に遜色ないほどの完成度になっています。 画像・動画生成においてもdeepfakeやAIグラビアなるものが登場しており、実在の人物さながらのクォリティを誇っています。 ただなぜディープラーニングがこれほどまでに上手くいくかを理論的に説明することはできていません。現在ディープラーニングのパラメータは千億(\(\sim 10^{11}\))と言われており、ある入力に対して、個々のパーセプトロンを追っていても全体としてどのような出力になるか分かりません。 こうした大量の個々のもつミクロな状態たちに統計的な処理をしてマクロな状態を予想する、という手法は物理学ではすでに発見されています。すなわち統計力学です。統計力学の考え方を触れることで、ディープラーニングがうまくいく理由の参考になるかもしれません。まずは統計力学にふれていきます。 このあたりの詳細は以下の書籍が参考になります。以下の本を読み、インスピレーションを受けて本記事を記載してます。内容自体は以下の書籍とは直接の関係はないことご了承ください。 深層学習と統計神経力学 (SGCライブラリ 185) 1. 統計力学の概要 統計力学について、概要を説明していきます。 1-1 多粒子系の状態 古典物理学(=解析力学)によると、ある粒子1つの状態というのは位置座標\(\ \boldsymbol{q}=(q_x,q_y,q_z)\)と運動量\(\ \boldsymbol{p}=(p_x,p_y,p_z)\)を指定することで一意に決めることができます。原則任意の物理量は\(\ (\boldsymbol{q},\boldsymbol{p})\)を用いて表すことができるからです。例えば、エネルギー\(\ E\)、角運動量\(\ L\)は\[E=\frac{\boldsymbol{p}^2}{2m}+V(\boldsymbol{q}),\ \ \ L =\boldsymbol{q}\times \boldsymbol{p}\] というように\(\ (\boldsymbol{q},\boldsymbol{p})\)を用いて表すことができます。ここで\(\ V(\boldsymbol{q})\)はポテンシャルエネルギーで例えば、弾性エネルギーであれば\(\ V(\boldsymbol{q}) \simContinue reading深層学習がうまくいく理由の妄想 その1

書評 機械学習

ディープラーニングのライブラリKerasやTensorFlow、Pytorchを使って深層学習を実装するための本です。 工事中。。 工事中。。 こちらは書籍ではなく、ウェブサイトです。Jason Brownleeという計算機科学で博士号をもっている方が運営しているサイトで、機械学習に関するブログを発信したり、pdf書籍を販売しています。 https://machinelearningmastery.com/ もちろん全部英語なので、それなりに気合いが必要ですが、日本語の書籍にはないようなかなり細かい内容の解説もあり、重宝します。 私は「詳解 ディープラーニング」で解説のあったLSTMについて、さらに詳細を知りたかったので、こちらのサイトからpdfを購入しました。 かなり説明が丁寧で分かりやすかったので、英語がきつくなければ個人的におすすめです。 読み中。相当興味深いです。 LangChainとLangGraphを使ったエージェント開発の良書です。LangGraphでワークフローを作成したい場合はこちらを読みながらコーディングするとよいかと思います。 この分野進展が早く、過去の書籍はすぐに古くなってしまうので、その点だけは注意です。 大規模言語モデル入門 LLMの仕組みについて解説した書籍です。応用というよりLLMの構築原理や仕組みに重点を置いてます。そのためある程度数式を用います。 ディープラーニングからのtransformerへの接続など興味深いです。LLMの原理を知りたい方はこの書籍をよむと良いかと思います。 現場で活用するためのAIエージェント実践入門 (KS情報科学専門書) AIエージェントの構築するための様々なパターンのエージェントを紹介してます。フレームワークはLangGraphを使ってます。具体的にエージェント開発する際の実践集で、ある程度LangchainやLangGraphは知ってる前提となります。 エージェント開発の場面でとても参考になる書籍です。 対称性と機械学習 こちらは生成AIが隆盛を極める中、数学や物理学で発展してきた対称性の概念を深層学習の分野に適応しようとした書籍です。群論、とりわけリー群を使って機械学習を数学的に整理しています。 例えば、画像解析において、入力の画像が多少傾いていたり、中心からずれていたとしても、同じ画像として認識する必要があり、これがニューラルネットワーク全体として実現する関数は、空間並進対称性や回転対称性をもつことが必須であり、これをリー群を使って定式化しています。 基本的に数学的な定義は本書の中で、定義していってますが、コンパクト性や連結等、定義なしに使われている概念がちょくちょくあるので、そこは自分で調べる必要があるかと思います。 ニューラルネットが表現する関数がもつべき性質をリー群の観点から解析しており、機械学習エンジニアが本格的な群論を学ぶには良いかと思います。 個人的には、ニューラルネットの思考力の創発性やスケーリング則、多様体仮説などに対してリー群など群論的アプローチから論理展開した内容があるとさらによかったかなと思います。

簡単なWebサービスをPythonのみで作ってみた3

こんにちは、本日もpythonでWebサービスを作ってみます。 簡単なWebサービスをPythonのみで作ってみた1では、ストラテジーパターンを適用して、画面を作成しましたが、今回は内部状態を持たせ、状態に応じてそれぞれのメニューを表示する、といったことをジコマンで勝手にやっていきます。 サマリ さてまずは今回やったことのまとめです。 画面イメージ 完成した画面は以下の通りです。 初期状態の画面 「新規」ボタン押下後の画面 「取得」ボタン押下後の画面 「削除」ボタン押下後の画面 もちろんそれぞれのボタン押下後の画面での処理も実施できます。例えば「取得」ボタン押下後の画面で「シーケンス番号」指定して「照会」ボタンを押下すると以下のように表示されます。 今回、このようなボタンによる画面の切替をステートパターンを用いて実装しました。 実装コード さてここからコードの説明に入ります。アプリは簡単なWebサービスをPythonのみで作ってみた2までのものを前提に、追加開発しています。※もし全量が欲しい場合は連絡いただけば、githubに招待いたします。 ・view_strategy.py 前回の繰り返しになりますが、新しい画面を追加するには、 で対応可能であり、既存のコードに一切手を入れずに機能追加ができます。 さて少しソースについてみていきます。 今回「ViewCustom」クラスを新設してます。このクラスは他のクラスと違って、デコレータ「@st.cache_resource」を追加しています。これは通常Streamlitはボタンをform_submit_buttonを押下するとインスタンスの再読み込みが走ります。その影響で内部の状態が常に初期化されてしまうのですが、「@st.cache_resource」をつけることで、リソースをキャッシュできるようになります。 ステートパターンにおける「Context」クラスが「ViewCustom」に相当します。 「__state」が内部状態を表すインスタンス変数です。外から隠蔽するためprivateにしてます。「__state_manage」が状態遷移を管理するクラスのインスタンス変数です。これは後述します。 「show_screen」メソッドで、初期、新規、、、のボタンを配置と押下時の挙動を定義し、それ以降の各状態の画面ロジックは内部状態「__state」のshowメソッドに委譲しています。 states.py 次に状態に関する機能はstates.pyに入れてます。コードは以下の通りです。 詳細はコードの通りなので、ポイントをいくつか述べておきます。 まず「IState」クラスを基底クラスにして、これを継承して、ConcreteStateクラスを実装しています。また状態はいくつもインスタンスを生成する必要もないので、シングルトンにしてます。 ただし、マルチスレッドの場合はシングルトンの保証が完全ではないので、注意してください。スレッドAがインスタンス生成中にスレッドBがインスタンス生成を開始すると、2つインスタンスが作られてしまいます。 とりうる状態はなるべく仕掛けで縛るようにするためEnumクラスで状態をまとめています。さらに可能な状態遷移をdict型(他の言語ならmap型)でまとめてしまってます。これによって、今後状態を新たに新設したとしても、既存への影響をなしにできます。 遷移可能かどうかは「is_transitionable」での判定を提供することで、Context側(VeiwCustomクラス側)で実施するようにさせています。 最後にContinue reading簡単なWebサービスをPythonのみで作ってみた3

簡単なWebサービスをPythonのみで作ってみた2

前回に引き続きStreamlit/FastAPI/MongoDBで作ったウェブアプリについてアップしていきます。 4)実装コード FastAPI側 FastAPのインストールなどについては、例えば こちらの1)背景で紹介したページなどを参照してください。「FastAPI インストール」などでググればたくさん出てきますので、ここでは割愛します。 FastAPIは以下で立ち上がります。 main.pyの内容は以下のとおりです: まず、「python main.py」でFastAPIを実行できるように を追加しています。これが必要な理由はVSCodeなどで、デバッグできるようにするためとなります。 次に、 ですが、変数user_repositoryは永続化に関するインスタンスで、user_serviceがビジネスロジックに関するインスタンスです。 httpメソッドに則ったメソッドを準備します。FastAPIがhttpメソッドに則ったメソッドであることを認識させるために、各メソッドの直上にデコレータでhttpメソッドとURIを記述します: FastAPIでリクエストのデータを取得する方法の1つに、Body()があります。今回Streamlit側で設定したpayloadからデータを取得するため、「payload: str = Body()」と実装しています。 さて、引き続きuser_service.pyの実装を見てみます。コードは以下の通りです: 今回のアプリはほとんどビジネスロジックがないので、シンプルなものになっています。 最後に永続化周りの「user_repository.py」です: DB操作周りの実装なるべく1つに閉じさせたいため、user_repository.pyでMongoDBを操作する実装を記述しています。 pythonでMongoDBを操作するには、「pymongo」というライブラリが必要です。インストールは「pip install pymongo」でできます。詳細については前回の記事の1-3)で紹介したリンクを参照ください。MongoDBでは、 db:データベース名 collection:テーブル名を表すイメージとなります。一旦今回はデータベース名もテーブル名も「users」にしています。 あとはCRUDに応じたメソッドを実装すればよいのですが、これは上記の通りです。詳細はpymongoの公式ドキュメントに譲りますが、ざっくりは以下の通りです。下記以外にもいろいろメソッドが提供されているようです。 Create insert_one():1レコードのみ作成insert_many():複数レコード作成 Read find_one():1レコードのみ取得find():全レコードを取得 UpdateContinue reading簡単なWebサービスをPythonのみで作ってみた2