gpt4 book ai didi

c++ - QuantLib OpenOffice/Excel YIELD/PRICE 函数

转载 作者:IT老高 更新时间:2023-10-28 22:22:33 28 4
gpt4 key购买 nike

谁能提供一个示例,说明如何使用 QuantLib 复制 Excel/OpenOffice YIELDPRICE 函数?

我有几个示例,但我还不太了解所有设置。当我尝试更改某些值时,我要么得到零,要么得到一些无意义的值。理想情况下,我想创建等效于 YIELD/PRICE 函数的 c++。

在我的第一步中,我不需要复制 Excel 日期建模中的缺陷。我可以等到稍后再制作一个完全相同的拷贝。不过如果你知道那也很棒。


PRICE 示例,在 OpenOffice 中:

PRICE("2008-02-15","2010-11-15",5%,7%,100,2,1) = 95.068419616675

我的 QuantLib 代码能够获得 95.066759,这有点不对劲。至少我有基本的价格功能,我现在想得到一个完全匹配的结果。


我不能轻易包含所有的包装代码,但基本代码如下。

#include <ql/time/calendar.hpp>
#include <ql/time/daycounters/actualactual.hpp>
#include <ql/time/daycounters/actual365fixed.hpp>
#include <ql/time/schedule.hpp>
#include <ql/time/calendars/unitedstates.hpp>
#include <ql/time/calendars/nullcalendar.hpp>

#include <ql/settings.hpp>
#include <ql/handle.hpp>
#include <ql/termstructures/yield/flatforward.hpp>
#include <ql/instruments/bonds/fixedratebond.hpp>

#include <ql/pricingengines/bond/discountingbondengine.hpp>
#include <ql/utilities/dataformatters.hpp>

#include <iostream>
#include <iomanip>

#include "boost/date_time/gregorian/gregorian.hpp"
using namespace QuantLib;

Date convert_date( boost::gregorian::date const & date )
{
unsigned mon = date.month();
return Date( date.day(), Month(mon), date.year() );
}

shared_ptr<Bond> create_bond( boost::gregorian::date const & settlement_, boost::gregorian::date const & maturity_,
double coupon_, double yield_, double redemption_, unsigned frequency_ )
{
// date set up
//Calendar calendar = UnitedStates(UnitedStates::GovernmentBond);
Calendar calendar = NullCalendar(); //small improvement

Date settlementDate( convert_date( settlement_ ) );
// the settlement date must be a business day
settlementDate = calendar.adjust(settlementDate);

Integer fixingDays = 0; //1;
Natural settlementDays = 0; //1

Date evalDate = calendar.advance(settlementDate, -fixingDays, Days);
// Evaluation date (TODO: What should this actually be?)
Settings::instance().evaluationDate() = evalDate;

// bond set up
Real faceAmount = 100;
Real redemption = redemption_;
Date issueDate( 1, January, 2001); //NOTE: shouldn't be relevant for price/yield calculations
Date maturity( convert_date( maturity_ ) );
Real couponRate = coupon_;
Real yield = yield_;

//ActualActual dayCounter( ActualActual::Bond );
ActualActual dayCounter;
//Actual365Fixed dayCounter;

RelinkableHandle<YieldTermStructure> discountingTermStructure;
boost::shared_ptr<YieldTermStructure> flatTermStructure(
new FlatForward(
settlementDate,
yield,
dayCounter,
Compounded,
Frequency( frequency_ ) ));
discountingTermStructure.linkTo(flatTermStructure);

boost::shared_ptr<PricingEngine> bondEngine(
new DiscountingBondEngine(discountingTermStructure));

Schedule fixedBondSchedule(
issueDate,
maturity,
Period( Frequency( frequency_ ) ),
calendar,
Unadjusted,
Unadjusted,
DateGeneration::Backward,
false /*EOM*/); //strangely makes no difference in our calculations

boost::shared_ptr<Bond> fixedRateBond( new FixedRateBond(
settlementDays,
faceAmount,
fixedBondSchedule,
std::vector<Rate>(1, couponRate),
dayCounter,
Unadjusted,
redemption) );

fixedRateBond->setPricingEngine(bondEngine);
return fixedRateBond;
}

//OpenOffice: PRICE("2008-02-15","2010-11-15",5%,7%,100,2,1)
double bond_price( boost::gregorian::date const & settlement_, boost::gregorian::date const & maturity_,
double coupon_, double yield_, double redemption_, unsigned frequency_ )
{
shared_ptr<Bond> bond( create_bond( settlement_, maturity_, coupon_, yield_, redemption_, frequency_ ) );
return bond->cleanPrice();
}

//OpenOffice: PRICE("2008-02-15","2010-11-15",5%,7%,100,2,1)
double bond_yield( boost::gregorian::date const & settlement_, boost::gregorian::date const & maturity_,
double coupon_, double price_, double redemption_, unsigned frequency_ )
{
shared_ptr<Bond> bond( create_bond( settlement_, maturity_, coupon_, 0, redemption_, frequency_ ) );
ActualActual dayCounter;
return bond->yield( price_, dayCounter, Compounded, Frequency(frequency_) );
}

最佳答案

如果你对OpenOffice中PRICE函数的实现感兴趣,可以看AnalysisAddIn::getPrice的实现中的代码.这是指getPrice_ 分析 helper.cxx 中的函数。也许你会发现那里发生了什么。

请注意,OpenGrok 似乎在这里配置错误,因此单击功能可能不起作用。但我想您可以在目录 /OOO340_m0/scaddins/source/analysis 中的文件中找到所需的一切。 .

关于c++ - QuantLib OpenOffice/Excel YIELD/PRICE 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5221428/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com