0

祝大家节日快乐!

我正在尝试使用 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 模拟随机过程时要使用的关键函数是 Evolution(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;
    }
    

    `


编译/运行代码时我没有收到任何错误,但结果是一个常量值,即明显有问题。我认为问题在于我定义随机过程的方式,我不太清楚如何用 boost::shared_ptr 解释构造函数的最后一部分。

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

此致 :)

4

2 回答 2

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
    ...
}

获得所需的行为。

至于文档,您可能需要查看实施 QuantLib的第 6 章,其中描述了 Monte Carlo 框架。它还将让您开始使用路径生成器;您可以使用它们来生成路径,而无需自己驱动该过程。

哦,顺便说一句:您使用 sourcearchive.com 上的文档而不是 quantlib.org 上的“官方”文档有什么特别的原因吗?你认为有什么方法可以改进它们吗?

于 2011-12-27T16:13:09.253 回答
1

我不太确定这是否能解决问题,但至少我想尝试提供帮助:

首先让我们看一下 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 将计算一些东西,然后将数据存储在指针地址。这里我们来到构造函数的第二部分,&。

参数列表中的 & 表示您向函数传递对共享指针的引用。这意味着如果您调用该函数,您的指针将(很可能)被更改并指向所需的值。如果函数有一个引用调用,您实际上不需要在函数调用中添加任何符号。只是为了让事情清楚,一些整数的相同过程:

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));

这实际上应该做交易。只要让我知道它是否有效或您有任何其他问题。此致

于 2011-12-27T13:05:56.467 回答