Introduction

After reviewing the stochastic scenario generator, I wanted to look at the deterministics. Per VM-20; the deterministic reserve should be run on scenario 12 from the SERT scenarios. These are generated in the same workbook from the NAIC as the 10,000 scenarios, just with a different setting. More info from the VM: Scenario 12 – Deterministic scenario for valuation There are uniform downward shocks each month for 20 years, sufficient to get down to the one standard deviation point (84%) on the distribution of 20-year shocks. After 20 years, shocks are zero.

Read in baseline data; full curve

# Read in baseline data; full curve
BaseTreasCurve <- read.csv("C:/Users/15733/Documents/Practicum II/Generator output - base Deterministic/UST - format.csv", header=TRUE)

Up300TreasCurve <- read.csv("C:/Users/15733/Documents/Practicum II/Generator output +300 Derministic/UST - format.csv", header=TRUE)

Dn300TreasCurve <- read.csv("C:/Users/15733/Documents/Practicum II/Generator output -dn300 Deterministic/UST - format.csv", header=TRUE)

Prelim data exploration

Base scenarios

summary(BaseTreasCurve[,3:12])
##      X0.25              X0.5               X1                X2         
##  Min.   :0.00060   Min.   :0.00190   Min.   :0.00390   Min.   :0.00730  
##  1st Qu.:0.00929   1st Qu.:0.00989   1st Qu.:0.01097   1st Qu.:0.01276  
##  Median :0.01048   Median :0.01107   Median :0.01216   Median :0.01395  
##  Mean   :0.01086   Mean   :0.01148   Mean   :0.01258   Mean   :0.01441  
##  3rd Qu.:0.01356   3rd Qu.:0.01410   3rd Qu.:0.01507   3rd Qu.:0.01668  
##  Max.   :0.01740   Max.   :0.01794   Max.   :0.01892   Max.   :0.02054  
##        X3                X5                X7               X10         
##  Min.   :0.00970   Min.   :0.01260   Min.   :0.01440   Min.   :0.01520  
##  1st Qu.:0.01416   1st Qu.:0.01613   1st Qu.:0.01741   1st Qu.:0.01859  
##  Median :0.01535   Median :0.01732   Median :0.01860   Median :0.01979  
##  Mean   :0.01583   Mean   :0.01783   Mean   :0.01913   Mean   :0.02031  
##  3rd Qu.:0.01793   3rd Qu.:0.01970   3rd Qu.:0.02085   3rd Qu.:0.02191  
##  Max.   :0.02181   Max.   :0.02361   Max.   :0.02476   Max.   :0.02584  
##       X20               X30         
##  Min.   :0.01931   Min.   :0.01900  
##  1st Qu.:0.02018   1st Qu.:0.02073  
##  Median :0.02138   Median :0.02192  
##  Mean   :0.02196   Mean   :0.02249  
##  3rd Qu.:0.02334   3rd Qu.:0.02383  
##  Max.   :0.02728   Max.   :0.02778
looper <-c(3:12)
for (val in looper)(
print(sd(BaseTreasCurve[,val])))
## [1] 0.003648638
## [1] 0.003553678
## [1] 0.003399769
## [1] 0.003148534
## [1] 0.00296775
## [1] 0.002737975
## [1] 0.002596389
## [1] 0.002496025
## [1] 0.002279975
## [1] 0.002252383

Up 300 bps

summary(Up300TreasCurve[,3:12])
##      X0.25              X0.5               X1                X2         
##  Min.   :0.02351   Min.   :0.02427   Min.   :0.02564   Min.   :0.02791  
##  1st Qu.:0.02422   1st Qu.:0.02502   1st Qu.:0.02647   1st Qu.:0.02886  
##  Median :0.02603   Median :0.02689   Median :0.02840   Median :0.03090  
##  Mean   :0.02736   Mean   :0.02813   Mean   :0.02951   Mean   :0.03181  
##  3rd Qu.:0.02986   3rd Qu.:0.03066   3rd Qu.:0.03210   3rd Qu.:0.03441  
##  Max.   :0.03589   Max.   :0.03644   Max.   :0.03742   Max.   :0.03905  
##        X3                X5                X7               X10         
##  Min.   :0.02969   Min.   :0.03220   Min.   :0.03382   Min.   :0.03532  
##  1st Qu.:0.03072   1st Qu.:0.03332   1st Qu.:0.03499   1st Qu.:0.03653  
##  Median :0.03281   Median :0.03545   Median :0.03711   Median :0.03863  
##  Mean   :0.03359   Mean   :0.03611   Mean   :0.03774   Mean   :0.03923  
##  3rd Qu.:0.03617   3rd Qu.:0.03866   3rd Qu.:0.04023   3rd Qu.:0.04170  
##  Max.   :0.04032   Max.   :0.04260   Max.   :0.04440   Max.   :0.04525  
##       X20               X30         
##  Min.   :0.03734   Min.   :0.03803  
##  1st Qu.:0.03856   1st Qu.:0.03924  
##  Median :0.04064   Median :0.04132  
##  Mean   :0.04129   Mean   :0.04197  
##  3rd Qu.:0.04363   3rd Qu.:0.04426  
##  Max.   :0.04940   Max.   :0.04900
looper <-c(3:12)
for (val in looper)(
print(sd(Up300TreasCurve[,val])))
## [1] 0.003681132
## [1] 0.003603407
## [1] 0.003468861
## [1] 0.003287979
## [1] 0.003178809
## [1] 0.003068052
## [1] 0.003032775
## [1] 0.00299616
## [1] 0.003112672
## [1] 0.003086868

Down 300 bps

summary(Dn300TreasCurve[,3:12])
##      X0.25              X0.5                X1                 X2          
##  Min.   :0.00010   Min.   :0.000100   Min.   :0.000100   Min.   :0.000100  
##  1st Qu.:0.00010   1st Qu.:0.000100   1st Qu.:0.000950   1st Qu.:0.002990  
##  Median :0.00010   Median :0.000520   Median :0.001690   Median :0.003600  
##  Mean   :0.00112   Mean   :0.001397   Mean   :0.002322   Mean   :0.004115  
##  3rd Qu.:0.00054   3rd Qu.:0.001170   3rd Qu.:0.002300   3rd Qu.:0.004160  
##  Max.   :0.01230   Max.   :0.012260   Max.   :0.012180   Max.   :0.012040  
##        X3                 X5                 X7                X10          
##  Min.   :0.000100   Min.   :0.000100   Min.   :0.000100   Min.   :0.000100  
##  1st Qu.:0.004590   1st Qu.:0.006850   1st Qu.:0.008310   1st Qu.:0.009670  
##  Median :0.005100   Median :0.007210   Median :0.008580   Median :0.009840  
##  Mean   :0.005513   Mean   :0.007493   Mean   :0.008771   Mean   :0.009959  
##  3rd Qu.:0.005610   3rd Qu.:0.007660   3rd Qu.:0.008970   3rd Qu.:0.010170  
##  Max.   :0.011930   Max.   :0.011790   Max.   :0.011690   Max.   :0.011600  
##       X20               X30         
##  Min.   :0.00010   Min.   :0.00010  
##  1st Qu.:0.01148   1st Qu.:0.01206  
##  Median :0.01148   Median :0.01211  
##  Mean   :0.01155   Mean   :0.01210  
##  3rd Qu.:0.01162   3rd Qu.:0.01221  
##  Max.   :0.01200   Max.   :0.01257
looper <-c(3:12)
for (val in looper)(
print(sd(Dn300TreasCurve[,val])))
## [1] 0.002384278
## [1] 0.002396203
## [1] 0.002233322
## [1] 0.001813209
## [1] 0.001493467
## [1] 0.001068267
## [1] 0.000829648
## [1] 0.0006676462
## [1] 0.0006226544
## [1] 0.0006624745

Visualization

The goal of these plots is to visualize some of the variance (or lack therof) found above. I set the y axis manually to show scale

p <-ggplot(BaseTreasCurve, aes(x=Month, y=X0.25, color = "#16217d"))+
      geom_line(aes(x=Month, y=X0.5, color = "#6f2c65"))+
      geom_line(aes(x=Month, y=X1, color = "#9a2637"))+
      geom_line(aes(x=Month, y=X2, color = "#942568"))+
      geom_line(aes(x=Month, y=X3, coor = "#49bd2e"))+
      geom_line(aes(x=Month, y=X5, color = "#28c1a3"))+
      geom_line(aes(x=Month, y=X7, color = "#16217d"))+
      geom_line(aes(x=Month, y=X10, color = "#6f2c65"))+
      geom_line(aes(x=Month, y=X20, color = "#9a2637"))+
      geom_line(aes(x=Month, y=X30, color = "#942568"))+
      xlab("Month") + #ylab("Interest Rate") +
      scale_y_continuous(name="Interest Rate", labels = scales::percent, limits = c(0, 0.06)) +
      ggtitle("Int Rates By Tenor & Month, Curr Environment") +
      theme(legend.position = "none") 

ggplotly(p)
q <-ggplot(Up300TreasCurve, aes(x=Month, y=X0.25, color = "#16217d"))+
      geom_line(aes(x=Month, y=X0.5, color = "#6f2c65"))+
      geom_line(aes(x=Month, y=X1, color = "#9a2637"))+
      geom_line(aes(x=Month, y=X2, color = "#942568"))+
      geom_line(aes(x=Month, y=X3, coor = "#49bd2e"))+
      geom_line(aes(x=Month, y=X5, color = "#28c1a3"))+
      geom_line(aes(x=Month, y=X7, color = "#16217d"))+
      geom_line(aes(x=Month, y=X10, color = "#6f2c65"))+
      geom_line(aes(x=Month, y=X20, color = "#9a2637"))+
      geom_line(aes(x=Month, y=X30, color = "#942568"))+
      xlab("Month") + #ylab("Interest Rate") +
      scale_y_continuous(name="Interest Rate", labels = scales::percent, limits = c(0, 0.06)) +
      ggtitle("Int Rates By Tenor & Month, +300bps Env.") +
      theme(legend.position = "none") 

ggplotly(q)
r <-ggplot(Dn300TreasCurve, aes(x=Month, y=X0.25, color = "#16217d"))+
      geom_line(aes(x=Month, y=X0.5, color = "#6f2c65"))+
      geom_line(aes(x=Month, y=X1, color = "#9a2637"))+
      geom_line(aes(x=Month, y=X2, color = "#942568"))+
      geom_line(aes(x=Month, y=X3, coor = "#49bd2e"))+
      geom_line(aes(x=Month, y=X5, color = "#28c1a3"))+
      geom_line(aes(x=Month, y=X7, color = "#16217d"))+
      geom_line(aes(x=Month, y=X10, color = "#6f2c65"))+
      geom_line(aes(x=Month, y=X20, color = "#9a2637"))+
      geom_line(aes(x=Month, y=X30, color = "#942568"))+
      xlab("Month") + #ylab("Interest Rate") +
      scale_y_continuous(name="Interest Rate", labels = scales::percent, limits = c(0, 0.06)) +
      ggtitle("Int Rates By Tenor & Month, -300bps Env.") +
      theme(legend.position = "none") 

ggplotly(r)