Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ 투자 위험 평가: 평균과 표준편차로 더 나은 투자안 찾기


이 문제에서는 각각 하나의 투자 계획을 나타내는 두 개의 배열이 주어집니다. 우리가 해야 할 일은 투자 위험을 평가하여 두 투자 중 어느 쪽이 더 유망한지 판단하는 것입니다.

두 투자 I1[][]과 I2[][]는 각각 '투자 결과(수익 금액)'와 '그 결과가 나타날 확률'의 집합으로 구성되어 있습니다.

이 값들을 바탕으로 각 투자의 위험도를 계산한 뒤, 두 투자 중 더 나은 투자를 출력하면 됩니다.

이를 위해 통계학의 개념을 활용하여 판단에 필요한 지표들을 구합니다.

계산해야 할 핵심 지표

  • 투자의 평균(Mean): 투자 결과와 해당 확률의 곱을 모두 더한 값으로, 기대 수익 금액을 의미합니다.
  • 수익 금액의 편차(Deviation): 각 결과가 평균으로부터 떨어진 정도로, 수익의 변동성을 나타냅니다.

그다음 아래 값을 계산합니다.

표준편차 ÷ 투자 평균

이 비율은 금융에서 '변동계수(Coefficient of Variation)'라고 불리며, 기대 수익 1원당 감수해야 하는 위험의 크기를 뜻합니다. 따라서 이 값이 더 작은 투자가 기대 수익 대비 변동성이 적어 상대적으로 안정적이며, 최종 결과로 선택됩니다.

풀이 과정을 보여주는 예제 프로그램

예제

#include <iostream>
#include <vector>
#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.0f;
    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() {
    Vector A = { {450, 0.3f}, {250, 0.4f}, {100, 0.2f}, {300, 0.1f} };
    Vector B = { {300, 0.2f}, {150, 0.5f}, {500, 0.3f} };

    float meanA = CalcMeanVal(A);
    float meanB = CalcMeanVal(B);
    float sdA   = calcStdDevi(A);
    float sdB   = calcStdDevi(B);

    // 변동계수(SD / 평균)가 작은 투자가 더 유망
    if ((sdA / meanA) < (sdB / meanB))
        cout << "Investment A is better investment.\n";
    else
        cout << "Investment B is better investment.\n";

    return 0;
}

출력 −

Investment A is better investment.

코드 동작 설명

  • totalProdProbOutcome(): 모든 (결과 × 확률)의 합을 구합니다.
  • totalProb(): 모든 확률의 합을 구합니다.
  • CalcMeanVal(): 위 두 값을 나누어 투자의 평균, 즉 기대 수익을 계산합니다.
  • calcStdDevi(): 각 결과와 평균의 차이를 제곱한 뒤 확률로 가중합하여 분산을 구하고, 여기에 제곱근을 취해 표준편차를 구합니다.
  • main(): 두 투자의 변동계수(표준편차 ÷ 평균)를 비교하여 더 작은 쪽을 더 나은 투자로 출력합니다.

예제 계산 결과

예제 데이터를 직접 계산해 보면 다음과 같습니다.

  • 투자 A: 평균 = 285, 표준편차 ≈ 124.6, 변동계수 ≈ 0.44
  • 투자 B: 평균 = 285, 표준편차 ≈ 151.7, 변동계수 ≈ 0.53

두 투자의 기대 수익은 285로 동일하지만, 투자 A가 더 작은 변동계수를 가지므로 기대 수익 대비 위험이 낮습니다. 따라서 프로그램은 투자 A를 더 나은 투자로 출력합니다. 이처럼 단순히 기대 수익만이 아니라 그 수익을 얻기 위해 감수해야 하는 위험까지 함께 고려하는 것이 합리적인 투자 판단의 핵심입니다.