boost :: shared_ptr / QuantLib / стохастический процесс / генерация пути - PullRequest
0 голосов
/ 27 декабря 2011

Счастливых праздников, все!

Я пытаюсь сгенерировать пути процесса с квадратным корнем, используя библиотеки 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;
    }
    

    `


Я не получаю ошибок при компиляции / выполнении кода, но получается постоянное значение, то есть что-то явно не так.Я думаю, что проблема в том, как я определил стохастический процесс, я не могу понять, как интерпретировать последнюю часть конструктора с boost :: shared_ptr.

Я рад слышать любыепредложения и советы и спасибо, что нашли время, чтобы прочитать мой вопрос!

С наилучшими пожеланиями:)

Ответы [ 2 ]

1 голос
/ 27 декабря 2011

Как уже указывалось, вам не нужно передавать объект дискретизации, если вы не хотите его настраивать, поэтому

boost::shared_ptr<SquareRootProcess> squareRootProcess(new 
                              SquareRootProcess(b, a, sigma, miu0));

подойдет вам.Проблема, которую я вижу, состоит в повторяющихся вызовах эволюции;Вы написали

miu=squareRootProcess->evolve(t,miu0,dt,dw);

, но каждый шаг всегда будет начинаться с miu0.Идея здесь в том, что вы начинаете с t = 0 и x = miu0, а evolve () дает вам новый miu при t = 0.1.Затем вы начинаете с t = 0.1 и x = miu ( not miu0) и генерируете еще один шаг.Поэтому вам нужно написать что-то вроде:

miu = miu0;
for (Size j=1;j<=numVals;++j)
{
    ...
    miu=squareRootProcess->evolve(t,miu,dt,dw);  // not miu0
    ...
}

, чтобы получить желаемое поведение.

Что касается документации, вы можете взглянуть на главу 6 РеализацияQuantLib , который описывает структуру Монте-Карло.Это также поможет вам начать работу с генераторами путей;вы можете использовать их для генерации путей без необходимости управлять процессом самостоятельно.

Кстати, есть ли какая-то особая причина, по которой вы используете документы на sourcearchive.com вместо «официальных»на quantlib.org?Есть ли какой-то способ, которым вы думаете, что мы должны улучшить их?

1 голос
/ 27 декабря 2011

Я не совсем уверен, решит ли это проблему, но, по крайней мере, я хочу попытаться помочь:

Прежде всего, давайте посмотрим конструктор 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 (последние два параметра) получат значения по умолчанию, как написано в конструкторе.В этом случае это будет 0,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));

Это на самом деле должносделай сделкуПросто дайте мне знать, если это сработало или у вас есть дополнительные вопросы.С наилучшими пожеланиями

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...