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 で確率過程をシミュレートするときに使用する重要な関数は、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 を使用してコンストラクターの最後の部分をどのように解釈するかがよくわかりません。

提案やヒントを聞いてうれしいです。私の質問を読んでくれてありがとう!

よろしくお願いします :)

4

2 に答える 2

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

ご覧のとおり、最後の 2 つのパラメーターにはデフォルト値があります。これは、次のように関数を呼び出すことができることを意味します

SquareRoot(b,a,sigma);

これは、関数が b、a、および sigma の値で呼び出されることを意味します。x0 と d (最後の 2 つのパラメーター) は、コンストラクターに記述されているとおりにデフォルト値を取得します。この場合、x0 の場合は 0.0 になり、型が離散化された新しい共有ポインター オブジェクトになります。ただし、最後のパラメーターの値が必要なため、デフォルト値は適切な選択ではありません。

私が知る限り、関数 SquareRootProcess はいくつかのものを計算し、データをポインターアドレスに保存します。ここで、コンストラクターの 2 番目の部分である & に行き着きます。

パラメーター リストの & は、関数に共有ポインターへの参照を渡すことを意味します。これは、関数を呼び出すと、ポインターが (ほとんどの場合) 変更され、目的の値を指すことを意味します。関数に参照による呼び出しがある場合、実際には関数呼び出しに記号を追加する必要はありません。明確にするために、いくつかの整数を使用した同じプロセス:

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 に答える
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
    ...
}

目的の動作を取得します。

ドキュメンテーションに関しては、Monte Carlo フレームワークについて説明しているImplementing QuantLibの第 6 章を参照してください。また、パス ジェネレーターを使い始めることもできます。これらを使用して、自分でプロセスを実行することなくパスを生成できます。

ところで、quantlib.org の「公式」ドキュメントではなく、sourcearchive.com のドキュメントを使用している特定の理由はありますか? それらを改善すべきだと思う方法はありますか?

于 2011-12-27T16:13:09.253 に答える