# 計算零波動率價差(Static Spread) :::info 給定每一期的yield rate、期數、債息,跟yield spread差等訊息來計算static spread ::: ## 程式碼 (by C++) ### 輸入需要的資訊 yield rate、期數、債息,跟 yield spread ```C++ # include <iostream> # include <string> # include <cmath> using namespace std; // static spread int main(){ float coupon_rate, yield_spread, bond_value, bond_price; int n, face_value = 100; printf("Enter number of years: \n"); scanf("%d", &n); float yield_rate[n], zero_rate[n]; printf("Enter yield rate: \n"); for(int i = 0; i < n; i++){ printf("第 %d 期: ", i+1); scanf("%f", &yield_rate[i]); //輸入每期的yield_rate } printf("Enter coupon rate: \n"); scanf("%f", &coupon_rate); printf("Enter yield spread: \n"); scanf("%f", &yield_spread); int coupon = face_value * coupon_rate; ``` ### 計算zero rate ```C++ for(int i = 1; i <= n-1; i++){ // i+1期的zero rate bond_value = 0; for(int j = 0; j <= i; j++){ float discount = 1; for(int k = 0; k <= j; k++){ discount /= (1 + yield_rate[i]); // discount factor } bond_value += discount*coupon; if(j == i){ bond_value += face_value*discount; } } // printf("bond price01: %f\n", bond_value); for(int j = 0; j < i; j++){ float PV = coupon; for(int k = 0; k <= j; k++){ PV /= (1 + zero_rate[j]); } bond_value -= PV; } // printf("bond price: %f\n", bond_value); zero_rate[i] = pow((coupon + face_value)/bond_value, 1.0/(i+1))-1; // printf("i = %d\n", i); } for(int i = 0; i < n; i++){ printf("第%d期 zero rate = %f\n", i+1, zero_rate[i]); } ``` ### 計算債券價格 含 yield spread ```C++ bond_value = 0; for(int i = 1; i <= n; i++){ float discount = 1; for(int j = 1; j <= i; j++){ discount /= (1 + yield_rate[n-1] + yield_spread); // discount factor + yield_sprade } printf("discount (price) = %f\n", discount); bond_value += discount * coupon; if(i == n){ bond_value += face_value * discount; } } bond_price = bond_value; ``` ### 找出 static spread 使用二分法 ```C++ float High = 1, Low = 0, discount = 1; // 代0為正,代1為負 while(High - Low > 0.0001){ float Middle = (Low + High)/2; float value = 0; for(int i=1;i<=n;i++){ discount = 1; for(int j=1 ; j<=i; j++){ discount /= (1 + zero_rate[i-1] + Middle); //要折現幾次就乘幾次 } printf("discount = %f\n", discount); value += discount * coupon; //並將折現乘上cash payment if(i == n){ value += (face_value * discount); } } printf("value01 = %f\n", value); value -= bond_price; printf("value = %f\n", value); printf("bond price: %f\n", bond_price); if(value > 0){ Low = Middle; printf("Low = %f\n", Low); } else{ High = Middle; printf("High = %f\n", High); } printf("%f \n", Middle); //可以看到收斂的過程 } printf("Static spread = %f. \n", High); return 0; } ``` ### 執行畫面 ![](https://i.imgur.com/AbFZoZJ.png) ###### --- `` ###### tags: `財務工程`、`期貨與選擇權`、`債券`、`數值方法`、`二分法`、`C++`