C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で実装する投資リスクの評価:標準偏差と平均値による有望な投資先の判定

本記事では、2つの配列で表された投資プランを比較し、どちらの投資がより有望かを統計的手法を用いて評価する問題を扱います。C++による実装例とともに、投資リスク評価の基本的な考え方を解説します。

問題の概要

2つの投資案 I1[][]I2[][] が与えられます。それぞれの投資には、複数の「結果(アウトカム)」と、その結果が発生する「確率」がペアとして含まれています。

これらの値をもとに各投資のリスクを算出し、より有望な投資案を出力するのが目的です。この判断には統計数学の知識を活用します。

評価に用いる指標

リスク評価のために、以下の2つの統計量を計算します。

  • 期待値(平均額): 投資結果とその確率の積をすべて合計した値。投資から期待できる平均的なリターンを表します。
  • 収益額の偏差: 各投資結果が期待値からどれだけ乖離しているかを示す指標です。

最終的には次の値を求めます。

標準偏差 ÷ 投資の平均値(期待値)

これは「変動係数」と呼ばれる指標で、リターンのばらつきを平均値で正規化することにより、規模の異なる投資同士でも公平にリスクを比較できます。この値が小さいほど、リターンに対するリスクが小さい安定した投資と判断でき、その投資案が優れていることになります。

C++による実装例

以下は、このソリューションの動作を示すサンプルプログラムです。

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;

typedef pair<float,float> Data;
typedef vector<Data> Vector;

// 結果 × 確率 の総和(期待値の分子)を計算
float totalProdProbOutcome(const Vector & v)
{
    float sum = 0;
    for ( auto i : v) {
        sum += i.first * i.second;
    }
    return sum;
}

// 確率の総和を計算
float totalProb(const Vector & v) {
    float sum = 0.0;
    for ( auto i : v) {
        sum += i.second;
    }
    return sum;
}

// 平均値(期待値)を計算
float CalcMeanVal(const Vector & v) {
    return totalProdProbOutcome(v) / totalProb(v);
}

// 標準偏差を計算
float calcStdDevi(const Vector & v)
{
    float mean = CalcMeanVal(v);
    float sum = 0;
    
    for (auto i: v)
        sum += (i.first-mean) * (i.first-mean) * i.second;
    
    return sqrt(sum / totalProb(v));
}

int main() {
    // 投資A:{結果, 確率} のペア集合
    Vector A = { {450,0.3}, {250,0.4}, {100,0.2}, {300,0.1}};
    // 投資B:{結果, 確率} のペア集合
    Vector B = { {300,0.2}, {150,0.5}, {500,0.3}};

    float meanA = CalcMeanVal(A);
    float meanB = CalcMeanVal(B);
    float SdA = calcStdDevi(A);
    float SdB = calcStdDevi(B);
    
    // 変動係数(S.D./mean)を比較し、小さい方を有望な投資と判定
    if( (SdA / meanA) > (SdB / meanB))
        cout<<"Investment A is Better investment.\n";
    else
        cout<<"Investment B is better investment.\n";
    return 0;
}

実行結果

Investment B is better investment.

解説

プログラムでは、まず各投資について「結果 × 確率」の合計と確率の総和から期待値を求めます。続いて、各結果と期待値の差を二乗し確率で重み付けした分散を計算し、その平方根として標準偏差を得ます。

最後に標準偏差を期待値で割った変動係数を両投資で比較し、値が小さい方を「より有望な投資」として出力します。サンプルデータの場合、投資Bの方が変動係数が小さく、リターンに対するリスクが低い安定した投資であると判定されました。

この手法は、単純に期待リターンだけでなく、リスクとリターンのバランスを考慮した合理的な投資判断に役立ちます。実際のポートフォリオ選定や金融工学の分野でも広く使われている考え方です。

  1. C++で式ツリー(Expression Tree)を評価する方法|再帰を使った実装例

    本記事では、+、-、*、/ といった二項演算子から構成される式ツリー(Expression Tree)を評価し、その計算結果を返す問題について解説します。 式ツリーとは 式ツリーは二分木の一種であり、各ノードには演算子またはオペランド(被演算数)が格納されます。ノードの役割は次のように分けられます。 葉ノード:演算の対象となる値(オペランド)を保持します。 非葉ノード(内部ノード):実行すべき演算を表す二項演算子を保持します。 式ツリーを中順走査(in-order traversal)すると、元の中置記法の数式が復元できるのが特徴です。 例題で理解しよう 入力:次のような式ツリーが与えられ

  2. C++で二重積分を計算するプログラム|シンプソン1/3則による数値積分の実装

    変数xの下限・上限、変数yの下限・上限、そしてx・yそれぞれの刻み幅(ステップ幅)が与えられたとき、二重積分を数値的に計算し、その結果を表示するのが本記事のテーマです。 入出力の例 入力: xの刻み幅 = 1.2 yの刻み幅 = 0.54 xの下限 = 1.3 xの上限 = 2.1 yの下限 = 1.0 yの上限 = 2.1 出力: double integration is : 2.1 計算のアプローチ 本プログラムでは、以下の手順で二重積分を求めます。 xとyの上限・下限の値に加えて、x・yそれぞれの刻み幅を入力として受け取ります。 二重積分の計算にはシンプソン1/3則(Simpson