Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 运行时错误-远期利率计算_Python_Pandas_Quantitative Finance_Quantlib - Fatal编程技术网

Python 运行时错误-远期利率计算

Python 运行时错误-远期利率计算,python,pandas,quantitative-finance,quantlib,Python,Pandas,Quantitative Finance,Quantlib,我正在尝试建立一个远期年度EONIA远期曲线,输入期限从1周到50年 到目前为止,我已经成功地编写了以下代码: data maturity spot rate 0 1 -0.529 1 2 -0.529 2 3 -0.529 3 1 -0.504 4 2 -0.505 5 3 -0.506 6 4 -0.508 7

我正在尝试建立一个远期年度EONIA远期曲线,输入期限从1周到50年

到目前为止,我已经成功地编写了以下代码:

data
   maturity  spot rate
0         1     -0.529
1         2     -0.529
2         3     -0.529
3         1     -0.504
4         2     -0.505
5         3     -0.506
6         4     -0.508
7         5     -0.509
8         6     -0.510
9         7     -0.512
10        8     -0.514
11        9     -0.515
12       10     -0.517
13       11     -0.518
14        1     -0.520
15       15     -0.524
16       18     -0.526
17       21     -0.527
18        2     -0.528
19        3     -0.519
20        4     -0.501
21        5     -0.476
22        6     -0.441
23        7     -0.402
24        8     -0.358
25        9     -0.313
26       10     -0.265
27       11     -0.219
28       12     -0.174
29       15     -0.062
30       20      0.034
31       25      0.054
32       30      0.039
33       40     -0.001
34       50     -0.037

terms= data["maturity"].tolist()
rates= data['spot rate'].tolist()


calendar = ql.TARGET() 
business_convention = ql.ModifiedFollowing
day_count = ql.Actual360()
settlement_days_EONIA = 2
EONIA = ql.OvernightIndex("EONIA", settlement_days_EONIA, ql.EURCurrency(), calendar, day_count)

# Deposit Helper
depo_facility = -0.50
depo_helper = [ql.DepositRateHelper(ql.QuoteHandle(ql.SimpleQuote(depo_facility/100)), ql.Period(1,ql.Days), 1, calendar, ql.Unadjusted, False, day_count)]

# OIS Helper
OIS_helpers = []
for i in range(len(terms)):
    if i < 3:
        tenor = ql.Period(ql.Weeks)
        eon_rate = rates[i]
        OIS_helpers.append(ql.OISRateHelper(settlement_days_EONIA, tenor, ql.QuoteHandle(ql.SimpleQuote(eon_rate/100)), EONIA))    
    elif i < 12: 
        tenor = ql.Period(ql.Months)
        eon_rate = rates[i]
        OIS_helpers.append(ql.OISRateHelper(settlement_days_EONIA, tenor, ql.QuoteHandle(ql.SimpleQuote(eon_rate/100)), EONIA)) 
    else:
        tenor = ql.Period(ql.Years)
        eon_rate = rates[i]
        OIS_helpers.append(ql.OISRateHelper(settlement_days_EONIA, tenor, ql.QuoteHandle(ql.SimpleQuote(eon_rate/100)), EONIA))
    
rate_helpers = depo_helper +  OIS_helpers

eonia_curve_c = ql.PiecewiseLogCubicDiscount(0, ql.TARGET(), rate_helpers, day_count)
#This doesn't give me a daily grid of rates, but only the rates at the tenors of my input

eonia_curve_c.enableExtrapolation()


days = ql.MakeSchedule(eonia_curve_c.referenceDate(), eonia_curve_c.maxDate(), ql.Period('1Y'))

rates_fwd = [
    eonia_curve_c.forwardRate(d, calendar.advance(d,365,ql.Days), day_count, ql.Simple).rate()*100
    for d in days
]

OIS助手的代码中可能有错误,其中存在重叠,但我不确定我做错了什么。有人知道问题出在哪里吗?

首先,我为所有不雅观的Python道歉,因为我来自C++:

原始问题的主要问题是,ql.Period()在与整数个周期一起使用时采用两个参数:例如ql.Period(3,ql.Years)。相反,如果您使用期限的字符串表示形式(例如“3y”)构造输入数组,则只需将此字符串传递给ql.Period()。因此ql.Period(3,ql.Years)和ql.Period('3y')给出了相同的结果

import QuantLib as ql

import numpy as np
import pandas as pd

curve = [ ['1w',     -0.529],
        ['2w',     -0.529],
        ['3w',     -0.529],
        ['1m',     -0.504],
        ['2m',     -0.505],
        ['3m',     -0.506],
        ['4m',     -0.508],
        ['5m',     -0.509],
        ['6m',     -0.510],
        ['7m',     -0.512],
        ['8m',     -0.514],
        ['9m',     -0.515],
        ['10m',     -0.517],
        ['11m',    -0.518],
        ['1y',     -0.520],
        ['15m',     -0.524],
        ['18m',     -0.526],
        ['21m',    -0.527],
        ['2y',     -0.528],
        ['3y',     -0.519],
        ['4y',     -0.501],
        ['5y',     -0.476],
        ['6y',     -0.441],
        ['7y',     -0.402],
        ['8y',     -0.358],
        ['9y',     -0.313],
        ['10y',     -0.265],
        ['11y',     -0.219],
        ['12y',     -0.174],
        ['15y',     -0.062],
        ['20y',      0.034],
        ['25y',      0.054],
        ['30y',      0.039],
        ['40y',     -0.001],
        ['50y',     -0.037] ]

data = pd.DataFrame(curve, columns = ['maturity','spot rate'])

print('Input curve\n',data)

terms= data["maturity"].tolist()
rates= data['spot rate'].tolist()

calendar = ql.TARGET() 
day_count = ql.Actual360()
settlement_days_EONIA = 2
EONIA = ql.OvernightIndex("EONIA", settlement_days_EONIA, ql.EURCurrency(), calendar, day_count)

# Deposit Helper
depo_facility = -0.50
depo_helper = [ql.DepositRateHelper(ql.QuoteHandle(ql.SimpleQuote(depo_facility/100)), ql.Period(1,ql.Days), 1, calendar, ql.Unadjusted, False, day_count)]

# OIS Helper
OIS_helpers = []
for i in range(len(terms)):
        tenor = ql.Period(terms[i])
        eon_rate = rates[i]
        OIS_helpers.append(ql.OISRateHelper(settlement_days_EONIA, tenor, ql.QuoteHandle(ql.SimpleQuote(eon_rate/100)), EONIA))    
    
rate_helpers = depo_helper +  OIS_helpers

eonia_curve_c = ql.PiecewiseLogCubicDiscount(0, ql.TARGET(), rate_helpers, day_count)
#This doesn't give me a daily grid of rates, but only the rates at the tenors of my input

eonia_curve_c.enableExtrapolation()


days = ql.MakeSchedule(eonia_curve_c.referenceDate(), eonia_curve_c.maxDate(), ql.Period('1Y'))

rates_fwd = [
    eonia_curve_c.forwardRate(d, calendar.advance(d,365,ql.Days), day_count, ql.Simple).rate()*100
    for d in days
]

print('Output\n',pd.DataFrame(rates_fwd,columns=['Fwd rate']))

我绝不是Python专家,但这行代码是:tenor=ql.Period(ql.Weeks)。QL参考建议您应该有几周的时间。。。应该是ql.Period(术语[i],ql.Weeks)等吗?在tenor=ql.Period(ql.Weeks)这行中,我猜ql.Period试图将ql.Weeks解释为频率。在C++枚举中,QL周=1,月份为2,年为3。因此ql.Period(n)被解释为一个频率,1=每年,2=半年,3=每四个月。线索是,当您使用ql.Years时,实际上您使用的是ql.Period(3),它每四个月一次。。。给你(假设你的即期结算是21年2月18日)许多到期日为21年6月18日的工具。因为这是你设定的最短日期,所以这是QL首先抱怨的。欢迎使用Python类型安全!谢谢,我终于设法让它工作了。我必须将OIS助手与术语索引进行分类。
import QuantLib as ql

import numpy as np
import pandas as pd

curve = [ ['1w',     -0.529],
        ['2w',     -0.529],
        ['3w',     -0.529],
        ['1m',     -0.504],
        ['2m',     -0.505],
        ['3m',     -0.506],
        ['4m',     -0.508],
        ['5m',     -0.509],
        ['6m',     -0.510],
        ['7m',     -0.512],
        ['8m',     -0.514],
        ['9m',     -0.515],
        ['10m',     -0.517],
        ['11m',    -0.518],
        ['1y',     -0.520],
        ['15m',     -0.524],
        ['18m',     -0.526],
        ['21m',    -0.527],
        ['2y',     -0.528],
        ['3y',     -0.519],
        ['4y',     -0.501],
        ['5y',     -0.476],
        ['6y',     -0.441],
        ['7y',     -0.402],
        ['8y',     -0.358],
        ['9y',     -0.313],
        ['10y',     -0.265],
        ['11y',     -0.219],
        ['12y',     -0.174],
        ['15y',     -0.062],
        ['20y',      0.034],
        ['25y',      0.054],
        ['30y',      0.039],
        ['40y',     -0.001],
        ['50y',     -0.037] ]

data = pd.DataFrame(curve, columns = ['maturity','spot rate'])

print('Input curve\n',data)

terms= data["maturity"].tolist()
rates= data['spot rate'].tolist()

calendar = ql.TARGET() 
day_count = ql.Actual360()
settlement_days_EONIA = 2
EONIA = ql.OvernightIndex("EONIA", settlement_days_EONIA, ql.EURCurrency(), calendar, day_count)

# Deposit Helper
depo_facility = -0.50
depo_helper = [ql.DepositRateHelper(ql.QuoteHandle(ql.SimpleQuote(depo_facility/100)), ql.Period(1,ql.Days), 1, calendar, ql.Unadjusted, False, day_count)]

# OIS Helper
OIS_helpers = []
for i in range(len(terms)):
        tenor = ql.Period(terms[i])
        eon_rate = rates[i]
        OIS_helpers.append(ql.OISRateHelper(settlement_days_EONIA, tenor, ql.QuoteHandle(ql.SimpleQuote(eon_rate/100)), EONIA))    
    
rate_helpers = depo_helper +  OIS_helpers

eonia_curve_c = ql.PiecewiseLogCubicDiscount(0, ql.TARGET(), rate_helpers, day_count)
#This doesn't give me a daily grid of rates, but only the rates at the tenors of my input

eonia_curve_c.enableExtrapolation()


days = ql.MakeSchedule(eonia_curve_c.referenceDate(), eonia_curve_c.maxDate(), ql.Period('1Y'))

rates_fwd = [
    eonia_curve_c.forwardRate(d, calendar.advance(d,365,ql.Days), day_count, ql.Simple).rate()*100
    for d in days
]

print('Output\n',pd.DataFrame(rates_fwd,columns=['Fwd rate']))