隨機過程

赫爾和懷特短期利率模型的實施

  • July 9, 2019

這是我第一次使用 quantlib,我想將 quantlib 的速度與我自己的 Python 程式碼進行比較。

我找到了一個關於 Hull and White 的教程來使用 quantlib 生成短速率路徑:(關於 Hull and White 的教程

作者似乎說改變未來瞬時匯率很簡單,這在範例中是一個常數……但是當我用一個 361 個值的數組替換它時,這些值對應於不同日期的未來匯率的值由時間步定義,我得到以下錯誤: TypeError: in method ’new_SimpleQuote’, argument 1 of type ‘Real’

我試圖在 quantlib 庫中調查和搜尋如何解決這個問題,但我還沒有學會用 C++ 編寫程式碼,所以我可能需要一點幫助

謝謝你,有一個美好的一天

PS:我的輸入數據是某個時間的零息曲線,所以如果可以直接使用它而不是先將其轉換為未來的利率曲線,我很想知道該怎麼做

編輯:這是我的程式碼

import QuantLib as ql
import matplotlib.pyplot as plt
import numpy as np

sigma = 0.1
a = 0.1
timestep = 360
length = 30 # in years
#forward_rate = 0.05 I replaced this line by an random array and it doesn't work
forward_rate=np.random.randn(361)
day_count = ql.Thirty360()
todays_date = ql.Date(15, 1, 2015)
print(ql.QuoteHandle(ql.SimpleQuote(forward_rate)))

ql.Settings.instance().evaluationDate = todays_date
spot_curve = ql.FlatForward(todays_date, 
ql.QuoteHandle(ql.SimpleQuote(forward_rate)), day_count)
spot_curve_handle = ql.YieldTermStructureHandle(spot_curve)

hw_process = ql.HullWhiteProcess(spot_curve_handle, a, sigma)
rng = ql.GaussianRandomSequenceGenerator(
          ql.UniformRandomSequenceGenerator(timestep, ql.UniformRandomGenerator()))
seq = ql.GaussianPathGenerator(hw_process, length, timestep, rng, False)

def generate_paths(num_paths, timestep):
   arr = np.zeros((num_paths, timestep+1))
   for i in range(num_paths):
       sample_path = seq.next()
       path = sample_path.value()
       time = [path.time(j) for j in range(len(path))]
       value = [path[j] for j in range(len(path))]
       arr[i, :] = np.array(value)
   return np.array(time), arr

num_paths = 10
time, paths = generate_paths(num_paths, timestep)
for i in range(num_paths):
   plt.plot(time, paths[i, :], lw=0.8, alpha=0.6)
plt.title("Hull-White Short Rate Simulation")
plt.show()

當您呼叫ql.FlatForward它時,僅意味著您正在建構一條將導致平坦遠期利率的利率曲線。

該曲線的建構子將遠期利率作為輸入。如果您想更改輸入(例如,因為市場移動和遠期價值改變),那麼您可以像這樣用新值更改報價值。首先,在報價上保留一個指針:

forward_rate = 0.05
quote = ql.SimpleQuote(forward_rate)
spot_curve = ql.FlatForward(todays_date, ql.QuoteHandle(quote), day_count)
print(spot_curve.zeroRate(1.0, ql.Continuous))
# 5.000000 % 30/360 (Bond Basis) continuous compounding

然後使用該setValue()方法更新值,如下所示:

quote.setValue(0.04)
print(spot_curve.zeroRate(1.0, ql.Continuous))
# 4.000000 % 30/360 (Bond Basis) continuous compounding

您不能將值數組傳遞給setValue(),報價包含單個值(= 在這種情況下為遠期匯率的值)。特別是,我不明白你為什麼要讓這個前向隨機?

現在,要回答您的其他問題,您可以通過以下方式直接使用日期列表和零利率列表來實例化零曲線:

ql.ZeroCurve(dates, rate_values, day_counter)

例如:

zero_curve = ql.ZeroCurve([todays_date + ql.Period(p) for p in ['6M', '1Y', '5Y', '10Y']],
                         [0.04, 0.05, 0.06, 0.57], ql.Actual365Fixed())

然後你可以ql.YieldTermStructureHandle像你一樣用你的ql.FlatForward曲線把這條曲線傳遞給你。

引用自:https://quant.stackexchange.com/questions/46511