Financial Risk Calculation

Problem Statement

We now build up on our knowledge from the blog entry Delay Propagation in a Sequential Task Chain and use the knowledge as well as the C code that was developed in that blog post in order to tackle a problem from project risk management. We want to examine which outcomes are possible based on a set of risks and their possible monetary impact on our project. The assumption in our example is though that all risks are independent from each other.
The questions we are going to ask are of the type:

  • What is the probability that our overall damage is less than x €?
  • What is the probability that our overall damage is higher than x €?

Source Data

We use the following risks below. Different from traditional risk tables, we do not have only 2 outcomes per risk (“Risk does not materialize.” and “Risk materializes.”), but we have an n-ary discrete outcome for each risk (“Risk does not materialize.”, “Risk materializes with damage A and probability a%”, “Risk materializes with damage B and probability b%”, …). This allows a finer grained monetary allocation of each risk.

Risk Consequence Probability Damage Expected Damage
No internal resources available. Risk does not materialize. 60% 0 € 16.000 €
Hire external 1 staff. 20% 10.000 €
Hire external 5 staff. 10% 50.000 €
Hire external 9 staff. 10% 90.000 €
Design does not fulfil specification. Risk does not materialize. 40% 0 € 800.000 €
Partial redesign of unit. 40% 1.000.000 €
Complete redesign of unit. 20% 2.000.000 €
Cost target cannot be achieved. Risk does not materialize. 60% 0 € 210.000 €
Redesign component #1. 10% 200.000 €
Redesign component #1, #2. 10% 300.000 €
Redesign component #1, #2, #3. 20% 400.000 €
Redesign component #1, #2, #3, #4. 10% 800.000 €

We can calulate that the expected value of the damage is 1,026,000 € by adding up the expected damages of the individual, independent risks.

Solution

Our approach will use the discrete convolution and take leverage of the C file faltung.c. However, in contrast to the example in the blog entry Delay Propagation in a Sequential Task Chain, we face the problem that our possible outcomes (the individual damage values) are a few discrete values spread over a large interval. Hence, the program faltung.c. must be modified unless we want to eat up the whole system memory with unnecessarily large arrays of float numbers. Therefore, the upgraded version (faltung2.c) uses a struct to capture our input and output vectors, and the modified sub-routine convolution() iterates through all possible combinations of input vectors and stores the resulting struct elements in the output vector. We also need a helper funtion that checks if a struct with a certain damage value already exists (function exists()). We do not sort our output vector until before printing it out where we use qsort() in connection with compare_damage() to get an output with increasing damage values. In addition to the probability distribution, we now generate values for a probability curve (accumulated probabilities) which will help us to answer the questions of the problem statement.
Our input values now are reflected in 3 input vectors in the file input_monetary.dat and looks like this:

# Distribution of the Monetary Damages of Risks A, B, and C
# START
0    0.6
10000    0.20
50000    0.10
90000    0.10
# STOP

# START
0  0.4
1000000  0.40
2000000  0.20
# STOP

# START
0   0.5
200000   0.1
300000   0.1
400000   0.2
800000   0.1
# STOP

When we evaluate this input with our C program, we get the following output:

# Convolution Batch Processing Utility (only for demonstration purposes)
# The resulting propability density vector is of size: 60
# START
0   0.1200
10000   0.0400
50000   0.0200
90000   0.0200
200000   0.0240
210000   0.0080
250000   0.0040
290000   0.0040
300000   0.0240
310000   0.0080
350000   0.0040
390000   0.0040
400000   0.0480
410000   0.0160
450000   0.0080
490000   0.0080
800000   0.0240
810000   0.0080
850000   0.0040
890000   0.0040
1000000   0.1200
1010000   0.0400
1050000   0.0200
1090000   0.0200
1200000   0.0240
1210000   0.0080
1250000   0.0040
1290000   0.0040
1300000   0.0240
1310000   0.0080
1350000   0.0040
1390000   0.0040
1400000   0.0480
1410000   0.0160
1450000   0.0080
1490000   0.0080
1800000   0.0240
1810000   0.0080
1850000   0.0040
1890000   0.0040
2000000   0.0600
2010000   0.0200
2050000   0.0100
2090000   0.0100
2200000   0.0120
2210000   0.0040
2250000   0.0020
2290000   0.0020
2300000   0.0120
2310000   0.0040
2350000   0.0020
2390000   0.0020
2400000   0.0240
2410000   0.0080
2450000   0.0040
2490000   0.0040
2800000   0.0120
2810000   0.0040
2850000   0.0020
2890000   0.0020
# STOP
# The propability values are:
         0   0.1200
     10000   0.1600
     50000   0.1800
     90000   0.2000
    200000   0.2240
    210000   0.2320
    250000   0.2360
    290000   0.2400
    300000   0.2640
    310000   0.2720
    350000   0.2760
    390000   0.2800
    400000   0.3280
    410000   0.3440
    450000   0.3520
    490000   0.3600
    800000   0.3840
    810000   0.3920
    850000   0.3960
    890000   0.4000
   1000000   0.5200
   1010000   0.5600
   1050000   0.5800
   1090000   0.6000
   1200000   0.6240
   1210000   0.6320
   1250000   0.6360
   1290000   0.6400
   1300000   0.6640
   1310000   0.6720
   1350000   0.6760
   1390000   0.6800
   1400000   0.7280
   1410000   0.7440
   1450000   0.7520
   1490000   0.7600
   1800000   0.7840
   1810000   0.7920
   1850000   0.7960
   1890000   0.8000
   2000000   0.8600
   2010000   0.8800
   2050000   0.8900
   2090000   0.9000
   2200000   0.9120
   2210000   0.9160
   2250000   0.9180
   2290000   0.9200
   2300000   0.9320
   2310000   0.9360
   2350000   0.9380
   2390000   0.9400
   2400000   0.9640
   2410000   0.9720
   2450000   0.9760
   2490000   0.9800
   2800000   0.9920
   2810000   0.9960
   2850000   0.9980
   2890000   1.0000
and we can see from the header that there are 60 possible outcomes. When we look at the graph, we can see that the blue lines representing the probability density curve are not as “useful” as the (accumulated) probability curve (showin in red). With the red curve, we can now answer our questions from the first problem statement (“What is the probability that our overall damage is less than x €?”) by looking for x on the axis Damage Value, going vertically up until we hit the red curve and then branching to the right until we hit the axis Accumulated Probability.

The second problem statement (“What is the probability that our overall damage is higher than x €?”) is determined with the same approach. However, rather than directly using the value on the axis Accumulated Probability, we have to subtract that one from 1.00. The result is then the probability that the resulting damage is higher than x.

Downloads and Hints

Posted on: 2015-02-12Gabriel Rüeck