有人可以提供一个如何使用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\n
Run Code Online (Sandbox Code Playgroud)\n\n在命令提示符下,我回来了
\n\n1.6.2\n
Run 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