有人可以提供一个如何使用QuantLib复制Excel/OpenOffice YIELD和PRICE函数的示例吗?
我有一些例子,但我还不太清楚所有的设置.当我尝试更改某些值时,我会得到零或一些荒谬的值.理想情况下,我想创建与YIELD/PRICE函数等效的c ++.
在我的第一步中,我不需要在Excel日期建模中复制缺陷.我可以等到以后才能生成完全相同的副本.虽然如果你知道这也很棒.
PRICE 例如,在OpenOffice中:
PRICE("2008-02-15","2010-11-15",5%,7%,100,2,1) = 95.068419616675
Run Code Online (Sandbox Code Playgroud)
我的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 & …Run Code Online (Sandbox Code Playgroud) 我试图使用Quantlib(v1.2)SWIG包装器在python中为一个非常基本的浮动利率债券定价.我修改了文档中包含的示例.
我的债券有4年的到期期限.libor设定为10%,债券的差价为0.我的问题是,如果我以10%的比率打折,为什么债券的PV不是100?我的值为99.54.
谢谢!
from QuantLib import *
frequency_enum, settle_date = 4, Date(5, 1, 2010)
maturity_date = Date(5, 1, 2014)
face_amount = 100.0
settlement_days = 0
fixing_days = 0
calendar = NullCalendar()
settle_date = calendar.adjust(settle_date)
todays_date = calendar.advance(settle_date, -fixing_days, Days)
Settings.instance().evaluationDate = todays_date
rate = 10.0 / 100.0
flat_forward = FlatForward(settle_date,
rate,
Thirty360(),
Compounded,
frequency_enum)
discounting_term_structure = RelinkableYieldTermStructureHandle(flat_forward)
index_term_structure = RelinkableYieldTermStructureHandle(flat_forward)
index = USDLibor(Period(3, Months), index_term_structure)
schedule = Schedule(settle_date,
maturity_date, Period(frequency_enum),
NullCalendar(),
Unadjusted, Unadjusted,
DateGeneration.Forward, False)
floating_bond = FloatingRateBond(settlement_days,
face_amount,
schedule, …Run Code Online (Sandbox Code Playgroud) 我有使用RQuantlib库的R代码.为了从python运行它我使用RPy2.我知道python有自己的quantlib绑定(quantlib-python).我想完全从R切换到python.
请告诉我如何使用quantlib-python运行以下命令
import rpy2.robjects as robjects
robjects.r('library(RQuantLib)')
x = robjects.r('x<-EuropeanOptionImpliedVolatility(type="call", value=11.10, underlying=100,strike=100, dividendYield=0.01, riskFreeRate=0.03,maturity=0.5, volatility=0.4)')
print x
Run Code Online (Sandbox Code Playgroud)
样品运行:
$ python vol.py
Loading required package: Rcpp
Implied Volatility for EuropeanOptionImpliedVolatility is 0.381
Run Code Online (Sandbox Code Playgroud) 我正在尝试在具有最新版本的 R (3.2.2) 的 MAC (OSX 10.10) 上安装 RQuantLib。我了解 RQuantLib 需要 QuantLib 并已编译并安装它,显然成功了。至少当我打字时
\n\nquantlib-config --version\nRun Code Online (Sandbox Code Playgroud)\n\n在命令提示符下,我回来了
\n\n1.6.2\nRun Code Online (Sandbox Code Playgroud)\n\n但是,当我尝试通过 GUI(包安装程序)安装 RQuantLib 时,我得到以下信息:
\n\n* installing *source* package \xe2\x80\x98RQuantLib\xe2\x80\x99 ...\n** package \xe2\x80\x98RQuantLib\xe2\x80\x99 successfully unpacked and MD5 sums checked\nchecking for g++... g++\nchecking whether the C++ compiler works... yes\nchecking for C++ compiler default output file name... a.out\nchecking for suffix of executables... checking whether we are cross compiling... no\nchecking for suffix of object files... o\nchecking whether we are using the GNU …Run Code Online (Sandbox Code Playgroud) 我检查这张幻灯片,但仍然没有得到:
1) what problem does Handle sovled?
2) what is the benefit to add the Handle class?
Run Code Online (Sandbox Code Playgroud)
从它的源代码,我无法得到任何线索:
template <class Type>
class Handle {
protected:
class Link : public Observable, public Observer {
public:
explicit Link(const shared_ptr<Type>& h =
shared_ptr<Type>());
void linkTo(const shared_ptr<Type>&);
bool empty() const;
void update() { notifyObservers(); }
private:
shared_ptr<Type> h_;
};
boost::shared_ptr<Link<Type> > link_;
public:
explicit Handle(const shared_ptr<Type>& h =
shared_ptr<Type>());
const shared_ptr<Type>& operator->() const;
const shared_ptr<Type>& operator*() const;
bool empty() const;
operator boost::shared_ptr<Observable>() …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用指数样条拟合函数通过 QuantLib 构建美国财政部曲线样条。但是,我得到了非常奇怪的结果,无法弄清楚原因。即,生成的贴现曲线的负利率,其中输入都是正收益率,前端收益率存在巨大差异(下图)。
我正在为整个债券领域提供函数 > 1Y,这会导致一些重复的到期日(对于在不同时间发行并沿曲线向下滚动的债券),所以我不确定这是否会导致一些拟合问题。我正在使用的整个数据框(在代码中命名为 df)显示在底部。
这是我的代码来拟合曲线和下面的相应数据。(所述“YrsToMat”列由产生YrsToMat<- sapply(maturities, yearFraction, startDates = Sys.Date(), dayCounters = 9) #9 = ActualActual.Bond,其中maturities是所有的键期限的列表)。
谢谢你的帮助!
library(RQuantLib)
YrsToMat <- df$YrsToMat
marketQuotes <- df$Prices
cpn_rates <- df$Coupons
dateparams <- list(settlementDays=1, period="Semiannual",
dayCounter="ActualActual.Bond",
businessDayConvention ="ModifiedFollowing")
curveparams <- list(method="ExponentialSplinesFitting",
origDate = Sys.Date())
curve <- FittedBondCurve(curveparams, YrsToMat, cpn_rates, marketQuotes, dateparams)
Run Code Online (Sandbox Code Playgroud)
structure(list(ISIN = structure(1:261, .Label = c("US912810EM63",
"US912810EN47", "US912810EP94", "US912810EQ77", "US912810ES34",
"US912810ET17", "US912810EV62", "US912810EW46", "US912810EX29",
"US912810EY02", "US912810EZ76", "US912810FA17", "US912810FB99",
"US912810FE39", "US912810FF04", "US912810FG86", "US912810FJ26",
"US912810FM54", "US912810FP85", "US912810FT08", "US912810PT97", …Run Code Online (Sandbox Code Playgroud) 任何人都有使用SWIG的经验吗?我目前正在研究QuantLib,并发现可以使用SWIG生成C#代码.我们正在探索使用QuantLib和专有的闭源库(可能以.Net dlls的形式提供)来创建财务功能组合库的选项.我们的想法是将这两者结合起来创建一个统一的超级库.我已经看到了QuantLib的.Net端口,但它似乎没有被主动维护(并且不完全确定实际移植了多少),所以我避免使用它.
第一步是评估生成可以在任何地方使用的库的难度,即MS Office应用程序(通过VBA),控制台应用程序以及服务器端(例如Web应用程序).我认为这涉及COM Interop,但我不知道从哪里开始,或者我是否在正确的轨道上.
我没有使用C++的经验; 和COM是我(我现在的一个流行语),我已经釉面了.我知道与此主题相关的相关MSDN文章.
我正在寻找以下几行的帮助:
任何帮助表示赞赏
编辑:我已经接受了我的答案作为正确的答案,除非提供更好的答案.
使用QuantLib C++库,我试图评估在其生命周期内具有不同优惠券的债券(例如前三年为6%,其余三年为4%).
我注意到FixedRateBond该类的构造函数接受了优惠券向量const std::vector< Rate > &coupons:
FixedRateBond (Natural settlementDays,
Real faceAmount,
const Schedule &schedule,
const std::vector< Rate > &coupons,
const DayCounter &accrualDayCounter,
BusinessDayConvention paymentConvention=Following,
Real redemption=100.0,
const Date &issueDate=Date(),
const Calendar &paymentCalendar=Calendar())
Run Code Online (Sandbox Code Playgroud)
这似乎对我的目的有用,但我如何指定每张优惠券开始适用的日期?
我找不到任何明确描述 QuantLib 线程安全属性的文档(或没有它们!)。QuantLib配置文档列出了许多与线程安全相关的编译时选项,从中我推断,默认情况下,QuantLib 并不完全是线程安全的。
特别是,有:
QL_ENABLE_SESSIONS - “如果定义,单例将为不同的会话返回不同的实例。您必须在命名空间 QuantLib 中提供一个 sessionId() 函数并将其与库链接,为每个会话返回不同的会话 ID。默认情况下未定义。”
QL_ENABLE_THREAD_SAFE_OBSERVER_PATTERN - “如果定义,将使用观察者模式的线程安全(但性能较低)版本。如果您想通过 JVM 或 .NET 生态系统或任何环境中的 SWIG 层使用 QuantLib,您应该定义它异步垃圾收集器。默认情况下未定义。”
QL_ENABLE_SINGLETON_THREAD_SAFE_INIT - “定义它以使单例初始化线程安全。默认情况下未定义。与多个会话不兼容。”
如果我想使用 QuantLib,我应该使用哪些选项,以及我应该采取哪些其他步骤:
来自多个线程,但永远不会同时(例如,仅在持有全局锁时)?
同时来自多个线程,但不在它们之间共享任何对象?
同时来自多个线程,在它们之间共享对象?
我的应用程序的自然结构是一个有向无环图,在一端输入一个恒定的市场数据流,用于计算和更新各种对象,并在另一端生成一个估计价格流。我非常希望能够让多个内核并行工作,因为有些计算需要很长时间。
该应用程序将主要用 Java 编写,与 QuantLib 接口的 C++ 部分最少。我不打算使用 SWIG 包装器。我很高兴在没有 Java 垃圾收集器帮助的情况下对 QuantLib 对象进行内存管理。
编辑!如果您决定设置这些选项中的任何一个,那么在 unix 上,将相应的标志设置为 ./configure:
--enable-sessions
--enable-thread-safe-observer-pattern
--enable-thread-safe-singleton-init
Run Code Online (Sandbox Code Playgroud) quantlib ×10
c++ ×4
python ×3
r ×3
c# ×1
com-interop ×1
concurrency ×1
finance ×1
osx-yosemite ×1
rpy2 ×1
swig ×1