2011-12-27 76 views
0

大家节日快乐!boost :: shared_ptr/QuantLib /随机过程/路径生成

我正在尝试使用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模拟随机过程时,可以使用evolve(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解释构造函数的最后部分。

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

问候:)

回答

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

这实际上应该做的交易。请让我知道它是否有效,或者您是否还有其他问题。 问候

+0

非常感谢您的快速响应!我尝试了以下内容:'const boost :: shared_ptr d(new EulerDiscretization); boost :: shared_ptr squareRootProcess(new SquareRootProcess(b,a,sigma,miu0,d));'但不幸的是我仍然得到了不变的结果,但仍然不起作用! – sunshine 2011-12-27 14:24:19

+0

让我问一些问题,使事情更清楚:1.你如何读取d的价值? (你怎么知道它没有改变)。你实际上不能只读出d的值(这是地址)。例如。通过boost共享指针,你可以通过'd.get()来访问这个值'我实际上并没有确切地得到你期望改变的值以及你如何检查它。 2.有这个功能的任何文档吗?或者你有实施? – Toby 2011-12-27 14:37:56

+0

当我运行整个代码时,它应该输出10个不同的miu值(即10个不同时刻的值 - 从0.1到1)。但是,我在每个时间步中都会得到相同的值,这意味着过程是不变的。因此我相信我没有正确定义它。就我所知,d的值可以是 - EulerDiscretization或EndEulerDiscretization。我不希望它改变,它只是模拟我在开始时所阐述的过程的一个条件,在整个路径生成过程中应该保持不变。或者我错了? – sunshine 2011-12-27 14:49:42

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上的文档有什么特别的原因,而不是quantlib.org上的“官方”文档?你认为我们应该改进它们吗?

+0

非常感谢你!我知道它必须是一些小事:)坦率地说,我没有特别的理由要在sourcearchive.com上使用这些文档,他们是只是我遇到的第一套文档,我一直在使用它。不过谢谢你的提示,我也会检查quantlib.org。祝您有美好的除夕! – sunshine 2011-12-28 09:20:10