2011-12-27 10 views
0

ハッピーホリデー、みんな!boost :: shared_ptr/QuantLib/stochastic process/path generation

私は、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)です。私は、コードを実行/コンパイル時にエラーを取得していないが、何が出てくることは一定値である

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

    最後の2つのパラメータにはデフォルト値があります。これは、関数がB、Aとシグマの値で呼び出されたことを意味する。この

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

    これは実際に対処する必要があります。それが働いたのか、それとも何か質問がある場合は、私に知らせてください。 よろしく

    +0

    ありがとうございました。私は以下を試しました: 'const boost :: shared_ptr d(新しいEulerDiscretization); boost :: shared_ptr squareRootProcess(新しいSquareRootProcess(b、a、sigma、miu0、d)); '残念ながら、私はまだ一定の結果を得ています。 – sunshine

    +0

    物事をより明確にするために、いくつかの質問をしてみましょう。1.どのようにdの価値を読んでいますか? (あなたはそれが変わっていないことをどのように知っていますか)。実際にはdの値を読み取ることはできません(アドレス)。例えば。あなたは 'd.get()'で値にアクセスすることができます。私は実際にあなたが変更を期待する正確な値とそれをチェックする方法を得られません。 2.この機能に関する文書はありますか?それとも実装がありますか? – Toby

    +0

    コード全体を実行すると、miuの10種類の異なる値(つまり、0.1から1までの10の異なる時刻の値)が必要です。しかし、私はそれぞれの時間ステップごとに同じ値を得ています。これはプロセスが一定であることを意味します。したがって、私はそれを正しく定義していないと信じています。 dの値は、私が知る限り、 - EulerDiscretizationまたはEndEulerDiscretizationのいずれかになります。私はそれが変わるとは期待しませんが、それは最初に設定したプロセスのシミュレーションのための条件にすぎず、パス生成全体を通して同じままでなければなりません。それとも間違っているのですか? – sunshine

    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章を参照してください。この章では、Monte Carloフレームワークについて説明しています。また、パスジェネレータを使用して開始することもできます。それらを使用して、プロセスを自分で駆動することなくパスを生成することができます。

    ああ、ところで:あなたはquantalib.orgの "公式な"ものではなく、sourcearchive.comのドキュメントを使用している特別な理由はありますか?あなたが改善すべきだと思う方法はありますか?

    +0

    ありがとうございました!私はそれがマイナーなものでなければならないことを知っていた:)かなり率直に言って、私はsourcearchive.comで、私が遭遇したドキュメントの最初のセットだけで、私はそれを使い続けました。しかし、ヒントありがとう、私はquantlib.orgもチェックアウトします。素晴らしい大晦日をお過ごしください! – sunshine

    関連する問題