节日快乐,大家好!
我正在尝试使用QuantLib / Boost C ++库生成平方根进程的路径,并且使用快速简单的解决方案遇到了我认为烦人的小问题!我对编程很陌生,所以请不要对我太苛刻:) 这就是我所知道的: 1.构造函数如下所示:
SquareRootProcess( Real b, Real a, Volatility sigma, Real x0 = 0.0,
const boost::shared_ptr<discretization>& d =
boost::shared_ptr<discretization>(new EulerDiscretization))
使用QuantLib模拟随机过程时使用的关键函数是 演变(T,X,DT,DW)。
以下是我的代码:
#include "stdafx.h"
#include <ql/quantlib.hpp>
#include <ql/stochasticprocess.hpp>
#include <ql/processes/squarerootprocess.hpp>
#include <ql/Processes/eulerdiscretization.hpp>
using namespace QuantLib;
void SquareRootProcessSimulation()
{
Real miu0=0.0;
Real miu;
Real b=0.3;
Real a=5.5;
Volatility sigma=2.02;
BigInteger seed=12324;
MersenneTwisterUniformRng unifMt(seed);
BoxMullerGaussianRng<MersenneTwisterUniformRng> bmGauss(unifMt);
const boost::shared_ptr<StochasticProcess1D::discretization> &d =
boost::shared_ptr<StochasticProcess1D::discretization>(
EndEulerDiscretization);
boost::shared_ptr<SquareRootProcess> squareRootProcess(new
SquareRootProcess(b, a, sigma, miu0, d&));
Time dt=0.1,t=0.0;
Real dw;
Size numVals=10;
for (Size j=1;j<=numVals;++j)
{
dw=bmGauss.next().value;
miu=squareRootProcess->evolve(t,miu0,dt,dw);
std::cout << "Time: " << t+dt << ", miu_t: " << miu << std::endl;
t+=dt;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
SquareRootProcessSimulation();
std::cin.get();
return 0;
}
`
编译/运行代码时没有错误,但出现的是一个常量值,即显然是错误的。我认为问题在于我定义随机过程的方式,我无法弄清楚如何使用boost :: shared_ptr解释构造函数的最后一部分。
我很高兴听到任何建议和提示,并感谢您花时间阅读我的问题!
最好的问候:)
答案 0 :(得分:1)
我不太确定这是否能解决问题,但至少我想尝试帮助:
首先让我们看看构造函数 of SquareRootProcess:
SquareRootProcess( Real b,
Real a,
Volatility sigma,
Real x0 = 0.0,
const boost::shared_ptr<discretization>& d = boost::shared_ptr<discretization>(new EulerDiscretization))
如您所见,最后两个参数具有默认值。这意味着您可以像这样调用函数
SquareRoot(b,a,sigma);
这意味着使用b,a和sigma的值调用函数。 x0和d(最后两个参数)将获得它们在构造函数中编写的默认值。在这种情况下,对于x0将是0.0,并且是离散类型的新共享指针对象。 但是,由于您需要最后一个参数的值,因此默认值不适合您。
据我所知,SquareRootProcess函数会计算一些东西,然后将数据存储在指针地址。在这里,我们来到构造函数的第二部分,&amp;。
&amp;在参数列表中意味着您将函数传递给共享指针。这意味着如果您调用该函数,您的指针(很可能)将被更改并指向所需的值。如果函数具有引用调用,则实际上不需要在函数调用中添加任何符号。只是为了使事情清楚,与一些整数相同的过程:
void add(int a,int b,int& sum)
{
sum = a + b;
}
int main()
{
int sum;
add(5,12,sum);
// Now sum has the value 17
return 0;
}
如此长的故事简短:如果函数需要对对象的引用,则只需在函数调用中传递对象本身。
现在回到你的案例:
您只需创建一个离散型的共享指针,然后在函数调用中将其传递。
const boost::shared_ptr<StochasticProcess1D::discretization> d(new StochasticProcess1D::discretizitation(/*Whatever constructor is needed for this type*/));
boost::shared_ptr<SquareRootProcess> squareRootProcess(new SquareRootProcess(b, a, sigma, miu0, d));
这实际上应该做这笔交易。请告诉我它是否有效或是否有任何其他问题。 最诚挚的问候
答案 1 :(得分:1)
正如已经指出的,如果您不想自定义它,则无需传递离散化对象,因此
boost::shared_ptr<SquareRootProcess> squareRootProcess(new
SquareRootProcess(b, a, sigma, miu0));
会为你做的。我看到的问题是反复呼吁进化;你写了
miu=squareRootProcess->evolve(t,miu0,dt,dw);
但这将导致每一步始终从miu0开始。这里的想法是你从t = 0和x = miu0开始,evolve()在t = 0.1时给你新的miu。然后从t = 0.1开始,x = miu(不 miu0)并生成另一个步骤。所以你必须写下这样的东西:
miu = miu0;
for (Size j=1;j<=numVals;++j)
{
...
miu=squareRootProcess->evolve(t,miu,dt,dw); // not miu0
...
}
获得理想的行为。
至于文档,您可能需要查看Implementing QuantLib的第6章,其中描述了蒙特卡罗框架。它还将帮助您开始使用路径生成器;您可以使用它们来生成路径而无需自己驱动流程。
哦,顺便问一下:有没有什么特别的原因你在sourcearchive.com上使用docs,而不是quantlib.org上的“官方”文档?你认为我们应该改进它们吗?