0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【AWS無料枠でできる】Lambda+S3で投資シミュレーションしてみた(FinOps観点で学ぶコスト最適化)

Last updated at Posted at 2025-10-13

※本記事は個人の学習環境で実施した内容であり、所属組織・業務とは関係ありません。

💡 本記事は、AWS無料枠を活用してFinOps(クラウドコストの見える化と最適化)を個人レベルで実践した内容です。LambdaとS3を使い、最小コストで再現性のある投資シミュレーション環境を構築しています。金融エンジニアとしての視点から、学習・検証・コスト最適化を一体で進めた実験記録です。

🏁 はじめに

「金融業界で量子コンピュータを使っています」――そう言えたら、ちょっとかっこいい。

そんな軽い動機から、AWSの量子コンピューティングサービス Amazon Braket に挑戦してみました。

しかし、有効化まで想定以上に時間がかかったため、まずはより手軽なLambdaを使い、
モンテカルロ法による投資リターンシミュレーションを構築してみました。

今回は Python標準ライブラリのみ を使用し、結果を S3に保存
CloudWatch+Lambda(Always Free)+S3(Free Tier)で、完全無料で動作します。


実験の目的

投資の世界では「将来のリターンは確率的にしか予測できない」と言われます。
そのため、多数の乱数シナリオを使って結果の分布を可視化するモンテカルロシミュレーションがよく使われます。
今回はこれをLambdaで自動実行し、結果をS3に保存する仕組みを構築しました。


使用構成

項目 内容
使用サービス AWS Lambda / S3 / CloudWatch
使用言語 Python 3.13
IAM権限 Lambda実行ロール:s3:PutObject(results/配下のみ)に限定。コンソール確認用ロールは別途 ListBucket/GetObject を最小範囲で付与
保存形式 JSON(S3に保存)

コード全体

import json, datetime, random, statistics, boto3, os

s3 = boto3.client("s3")
BUCKET = os.environ.get("RESULT_BUCKET", "your-s3-bucket-name")

def lambda_handler(event, context):
    # パラメータ取得(指定なしならデフォルト値)
    n_paths = int(event.get("n_paths", 10000))
    mean = float(event.get("mean", 0.03))   # 期待リターン(3%)
    vol = float(event.get("vol", 0.12))     # ボラティリティ(12%)

    # モンテカルロシミュレーション(正規分布に従う乱数)
    returns = [random.gauss(mean, vol) for _ in range(n_paths)]

    # 統計量を計算
    avg_return = statistics.mean(returns)
    p5, p95 = statistics.quantiles(returns, n=20)[0], statistics.quantiles(returns, n=20)[-1]

    # 結果をまとめる
    result = {
        "simulation": "montecarlo",
        "params": {"n_paths": n_paths, "mean": mean, "vol": vol},
        "summary": {
            "mean_return": round(avg_return, 6),
            "p5": round(p5, 6),
            "p95": round(p95, 6),
            "min": round(min(returns), 6),
            "max": round(max(returns), 6)
        },
        "timestamp": datetime.datetime.utcnow().isoformat() + "Z"
    }

    # JSONとしてS3にアップロード(キーはタイムスタンプ付き)
    key = f"results/sim_{result['timestamp']}.json"
    s3.put_object(Bucket=BUCKET, Key=key, Body=json.dumps(result))

    return {"status": "ok", "s3_key": key, "summary": result["summary"]}

実行結果

"summary": {
  "mean_return": 0.030189,
  "min": -0.49551,
  "max": 0.54062,
  "p5": -0.163785,
  "p95": 0.22491
}
指標 内容 意味
平均リターン +3.0% 想定どおりの安定的な運用成果
最悪ケース -49.6% 極端な市場ショック時の下振れ
最良ケース +54.1% 大きく上昇した相場環境
下位5%分位 -16.4% 20回に1回はこの程度のマイナスも
上位95%分位 +22.5% 20回に1回はこれ以上のプラスも

数値の妥当性

設定したパラメータ(期待リターン3.1%、ボラティリティ12%)は、
バランス型ファンドや安定運用の投資信託に近い値です。

そのため「平均3%前後、上下±20%程度の値動き」という結果は、
現実の市場を踏まえても十分に妥当な範囲と考えられます。

解説ポイント

処理 説明
乱数生成 random.gauss(mean, vol) で正規分布に従う乱数を生成。平均と標準偏差を指定。
分位点の算出 statistics.quantiles(..., n=20) で5%刻みの分位点を簡単に取得可能。
S3保存 boto3.client('s3').put_object() で結果をJSONとして保存。Lambda実行ログにも活用可能。
柔軟なパラメータ event.get() によりAPI GatewayやStep Functionsから動的パラメータ渡しも可能。

応用アイデア

  • CloudWatch Events(EventBridge)で定期実行
  • S3に溜まった結果をAthenaで集計
  • QuickSightでリターン分布を可視化(今後検討予定)
  • FinOps的観点から「コスト配分タグ」を付与して管理対象化

💡補足
金融機関などでは、セキュリティポリシー上Athenaの利用に制約がある場合もあります。
その際は、S3の結果をAmazon Aurora(PostgreSQL/MySQL互換)にロードしてSQL分析する構成も有効です。
Aurora Serverless v2を使えば、必要時のみ自動スケールし、コストも最小化できます。


💡まとめ

今回は Lambda を使い、
モンテカルロシミュレーションによる投資リターン試算 を完全無料で実装してみました。

シンプルな構成ながら、金融シミュレーションの入口として再現性の高い構成になったと思います。

余談ですが、「投資シミュレーションできたよ」と家族に話したところ、
「……株、始めたの?」と真顔で返されました。
技術の話をするときは、前置きも大事ですね。


次回予告

次回は 「ユーザ定義タグ活用のすすめ(FinOps視点)」 をテーマに投稿予定です。
再現性のあるタグ設計と分析の考え方を紹介します。タグ設計次第で運用の透明性はぐっと高まります。


🗒 更新履歴

  • 2025-10-15: タイトルと冒頭をFinOps観点に更新
  • 2025-10-14: 次回テーマを「コスト配分タグの活用」から「ユーザ定義タグ活用のすすめ(FinOps視点)」へ変更
  • 2025-10-14: 冒頭にFinOps(クラウドコスト最適化)観点の説明を追記

✍️ 著者プロフィール

the-salmon-lab(金融業界インフラエンジニア)
AWS認定SAA取得。
FinOps/コスト最適化/金融クラウド運用をテーマに発信中。

👉 GitHubはこちら
👉 Qiitaフォローはこちら

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?