# 計算零波動率價差(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;
}
```
### 執行畫面

######
---
``
###### tags: `財務工程`、`期貨與選擇權`、`債券`、`數值方法`、`二分法`、`C++`