【问题标题】:Python Vasicek model calibration using scipy optimize使用 scipy 优化的 Python Vasicek 模型校准
【发布时间】:2018-12-19 19:05:56
【问题描述】:

我正在尝试使用 python 设置 Vasicek 校准例程。我认为最好使用 scipy.optimize ,但我正在努力编写代码。我有下面的整体表格。

有人在 python 中实现了 Vasicek 校准吗?初始数据表如下。

tau = 和 zeroBond =

更新:给定,这个公式: B = (1 - np.exp(-kappatau)) / kappa A = np.exp((theta-(sigma2)/(2(kappa2))) * (B-tau) - (sigma2)/(4* kappa)(B2)) Vasicek = Anp.exp(-r0 * B)

有什么 Python 函数,可以迭代求解“kappa”,使变量 Vasicek 达到某个值?

def py_exact_zcb_Vas_Table(theta, kappa, sigma, tau, zeroBond, r0 = 0):
  length = len(tau)
  B = np.zeros(length)
  A = np.zeros(length)

  Vasicek = np.zeros(length)
  kappa_calib = np.zeros(length)
  theta_calib = np.zeros(length)
  Vasci_calib = np.zeros(length)

  for i in range(0, length, 1):
    B[i] = (1 - np.exp(-kappa*tau[i])) / kappa
    A[i] = np.exp((theta-(sigma[i]**2)/(2*(kappa**2))) * (B[i]-tau[i]) - (sigma[i]**2)/(4*kappa)*(B[i]**2))
    Vasicek[i] = A[i]*np.exp(-r0 * B[i])

    #do while (zeroBond[i] - Vasci_calib[i]) <> 0:
        # change kappa[i] such that I match Vasci_calib[i] with zeroBond[i]



  return pd.DataFrame({'B':B, 'A':A, 'Vasicek':Vasicek, 'kappa':kapp_calib})

【问题讨论】:

  • 如果您提供了minimal, complete and verfiable example(例如,您还没有定义xw),并且如果您问了一个更具体的问题(“我在挣扎如何编码”并不是一个真正的问题)。
  • 这样更好吗?更新:所以给出了这个公式:B = (1 - np.exp(-kappatau)) / kappa A = np.exp((theta-(sigma2)/(2) (kappa2))) * (B-tau) - (sigma2)/(4*kappa)(B2)) Vasicek = Anp.exp(-r0 * B) 有什么 python 函数,迭代求解'kappa'这样变量 Vasicek 是否达到某个值?

标签: python-3.x scipy mathematical-optimization modeling calibration


【解决方案1】:

给定参数(tau, sigma, theta, r0),您可以使用scipy.optimize.minimize_scalar 函数来找到求解方程Vasicek(kappa) = target_valuekappa

import numpy as np
from scipy.optimize import minimize_scalar

def compute_Vasicek(kappa, tau, sigma, theta, r0):
    B = (1 - np.exp(-kappa*tau)) / kappa
    A = np.exp((theta-(sigma**2)/(2*(kappa**2))) * (B-tau) - (sigma**2)/(4*kappa)*(B**2))
    vasicek = A*np.exp(-r0 * B)
    return vasicek

def objectif_function(kappa, *args):
    return (compute_Vasicek(kappa, *args[1:]) - args[0])**2

# Minimization:
targeted_Vasicek = 10
tau, sigma, theta, r0 = 4, 205, 5, 0
result = minimize_scalar(objectif_function, args=(targeted_Vasicek, tau, sigma, theta, r0), bounds=(0, 100), method='bounded')
print(result)

也许Brent 方法适用于您的情况,对参数使用非随机值...

那么,你可以这样做:

kappa_calib = result.x
vasci_calib = compute_Vasicek(kappa_calib, tau, sigma, theta, r0)

并将最小化部分包装在另一个函数中,以便可以从循环内部调用它

【讨论】:

  • 谢谢。我尝试使用方法'brent;,但我收到了这个错误消息,A = np.exp((theta-(sigma2)/(2*(K2))) * ( B-time) - (sigma2)/(4*K)*(B2)) ; ... ZeroDivisionError:浮点除以零........有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-05
  • 1970-01-01
  • 2021-02-09
  • 2017-01-22
  • 2020-04-25
  • 2016-03-10
  • 1970-01-01
相关资源
最近更新 更多