boost :: shared_ptr / QuantLib /随机过程/路径生成

时间:2011-12-27 12:52:22

标签: shared-ptr quantlib stochastic-process

节日快乐,大家好!

我正在尝试使用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))

  1. 使用QuantLib模拟随机过程时使用的关键函数是 演变(T,X,DT,DW)。

  2. 以下是我的代码:

    #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;
    }
    

    `


  3. 编译/运行代码时没有错误,但出现的是一个常量值,即显然是错误的。我认为问题在于我定义随机过程的方式,我无法弄清楚如何使用boost :: shared_ptr解释构造函数的最后一部分。

    我很高兴听到任何建议和提示,并感谢您花时间阅读我的问题!

    最好的问候:)

2 个答案:

答案 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上的“官方”文档?你认为我们应该改进它们吗?