// Home / 資料 / FAQ

FAQ

NtRand FAQへようこそ!
わからーんっと思って我々にメールする前にちょっとこちらのFAQを覗いてみてください。皆様からの反応を見て近々forum も立ち上げようかと検討中。

 

NtRand (以下 “ソフトウェア”) は無料で提供しているソフトウェアであり、使用料やライセンス料などはいただいておりません。したがって、使用許諾条件下の状況でご利用いただく場合には料金の請求やある日突然戸口に警察が立っているなどといったことは起こりませんので、ご安心ください。

 

ニューメリカルテクノロジーズ株式会社は東京、丸の内にあるITのシステム開発会社です。主に金融リスク管理に取り組み、金融機関大手を顧客に持っています。詳しくは弊社のサイトをご覧ください。

 
環境により、ダウンロードしたヘルプファイル( chm ファイル)のトピックが表示できない場合があります。これはマイクロソフト社のセキュリティ更新による現象で、この問題を解決するには次のいずれかの操作を行います。
  • 方法 1
    • 1. .chm ファイルをダブルクリック
    • 2. [開いているファイル – セキュリティの警告] ダイアログ ボックスで、[この種類のファイルであれば常に警告する] チェック ボックスをオフ
    • 3. [開く] をクリック
  • 方法 2
    • 1. .chm ファイルを右クリックし、[プロパティ] を選択
    • 2. ブロックの解除]ボタンをクリックし、[OK]ボタンをクリック
    • 3. chm ファイルをダブルクリック
NtRand はバージョン2からバージョン3にバージョンアップする際に以下の関数を削除しました(リリースノート参照
  • NtPCA
  • NtOptionBS
  • NtOptionBF
  • NtOptionGK
  • NtMonteCarloLFM
NtRand 3.0 ではその機能を乱数生成関数、および確率分布関数とそれらに関連する関数に絞りこむという方針をとり、結果、上記の金融工学への応用関数は削除しました。これらの関数を使用するには旧バージョンを引き続きご使用ください。 また、旧バージョンの乱数生成関数のうち、分布関数のモーメントを引数にとる関数(NtRandBeta,NtRandLogNorm,NtRandTruncNorm)は削除され、すべての乱数生成関数はパラメータを直接引数にとるもののみを残しました。 その代わりに各分布関数にモーメントからパラメータを算出する “***PARAM” 関数を用意しました。
NtRand は常に同じ値を返します。これは設計仕様です。ワークシートを再計算するたびに異なる乱数値を欲しい方もいるかもしれません。これは簡単に実現できます。次の表計算式をご覧下さい。

=NTRAND(10000,0,RAND()*2147483647,RAND()*2147483647)

これで大丈夫です。NTRAND 関が10000回あるいは20000回呼ばれるということはありません。
NtRand 32bit は Excel 97 から Excel 2010 までをサポートしています。また使用 OS は Windows 95 以降(言語は不問)としています。
Excel関数に対して一度に受け渡し可能なデータの最大数は、配列数式の場合は行または列方向に32,767個以内、一般の数式の場合は行方向32,767個以内、列方向256個以内に制限されています。Windows95環境の場合はこれにさらに16bitの制限が加わります。すなわち一度に受け渡し可能なデータの最大量が64kBytesであるため、Excel標準の数値型 (倍精度浮動小数点数)ならば最大8,192個以上の受渡しはできません。このため、次元数の大きな多変量モンテカルロをNtRand 32bit で行う場合は、Windows NT/2000/XP 環境をお勧めします。これらの制限はExcelおよびWindowsの問題であり、NtRand 32bitの問題ではありません。 Excel 2007, 2010 では 32,767超のデータを取り扱うことが出来ます。
VBA (Visual Basic for Application) から NtRand の内部関数を使用するには次の例を参考にしてください。このコードは NTRANDMULTINORM の計算例と同じ結果を与えます。
Public Sub Test1()
  Dim Result As Variant
  Result = Application.Run("NTRANDMULTINORM", 8,
    Range(Cells(14, 3), Cells(16, 5)), Range(Cells(12, 3), Cells(12, 5)),
    0, 12345, 67890, True, True, True)
  '... now 'Result' stores 8 x 3 array of multi-dimensional normal
  '    random number sequence ...
  ' You can extract an individual value from Result by e.g. Result(5, 2)
  '... do what you want ...
End Sub
なお、VBA と Visual Basic とは異なる開発言語です。上記 “Application.Run…” のテクニックはVBAでのみ機能します。VBAはExcelの内部データ表現であるXLOPER型を変換することができます。しかし、Visual Basic にはこの機能がありません。Excelアドインの内部関数を Visual Basic から呼ぶことは簡単ではありません。
 

NtRand に関して最も多く受けるのがこの種の質問です。これはNtRand ではなくExcel の問題です。

CTRL+SHIFT+ENTER のキー入力

詳しくはExcel のヘルプやハウツー本を探してみてください。さらに、“配列数式”“Excel の仕様上の制限について (NtRand 32bit)”を読むことをお勧めします。

 
モンテカルロ法の利用者にとって最大の悩みは計算量です。原始的なモンテカルロ法 (Crude Monte Carlo)の理論性能 (=計算誤差)は、シミュレーション回数をn とすれば、次の数式により示されます。
O\left(\frac{1}{\sqrt{n}}\right)
そこで、原始的なモンテカルロ法の性能を改善するための様々な方法が考えられてきました。その代表的例として次の2つのアプローチがあります。
  • 準乱数モンテカルロ疑似乱数の代わりに規則性を持った数値列を使い、より望ましい確率分布に近づけようとするもの
  • モーメントマッチング – 統計的手段により生成する疑似乱数を操作して、より望ましい確率分布に近づけようとするもの
これらの方法は、用途に応じて使い分けるべき性格のもので、どちらかが常に優れているというわけではありません。その使い分けを簡単に解説すれば次の通りです。
  • 準乱数モンテカルロ
    単変量または低次元における、特に期待値や分散を求める用途において効果を発揮します。例えば単変量のオプションプライシングには少ない繰り返し計算で絶大な精度向上の効果があり、金融界でも1980年代末から1990年代初め頃に市場の主要プレーヤーの間で流行しました (現在では計算機の性能が上がったため、何でもモーメントマッチングで回数を増せばとりあえず問題が解決するため流行も下火)。 逆に欠点は、高次元下において著しくパフォーマンスが劣化することと、分布のテールにおける準乱数の挙動の問題から、順位数計算 (VaR算出など)に使い難いことです。 準乱数モンテカルロの理論性能 (=計算誤差)は、シミュレーション回数を n とすれば、次の数式に示される通り次元数 d に支配されており、変量の数が増せば原始的なモンテカルロ法よりもかえって性能が悪化します。
    O\left(\frac{(\log n)^d}{n}\right)
  • モーメントマッチング
    大半の用途に有効です。高次元あるいは分布のテール (例えば順位数算出)においても安定した性能を求めるには他に有力な代替手段がありません。 しかし、大幅に改善するとはいえ、先の原始的なモンテカルロ法と同じ理論性能限界を持つため、低次元下、特に単変量下での性能は準乱数モンテカルロに比べて見劣りします。 金融界では、リスク計量化、いわゆる Value at Risk (VaR) がテーマとなった1990年代半ばから、高次元モンテカルロを使用する際の標準的手法として定着しています。 今日、モーメントマッチングがこれほど普及した理由は、その扱いやすさ、予測可能性 (見通し)の良さ、もさることながらインフラとしてのコンピューターの性能が向上したところが大でしょう。 「今や10,000回以上のシミュレーションも手軽に1秒以下で可能なほど計算機の性能が向上したのだから準乱数モンテカルロの役割は終わった」と思われる方も多いかもしれません。 そうした考え方もある面では説得力がありますが、非常に計算負荷のかかる特殊なオプション計算を行うケースなどで、シミュレーション回数が重荷となったならば、モーメントマッチングではなく準乱数モンテカルロの採用を考えた方が良いでしょう。
NtRand では代表的な対称変量法2次サンプリング法の2つのモーメントマッチング手法を、各々または両方同時に使用可能にしています。特に同時使用時の効果はめざましく、それゆえに1980年代当時の金融界 (例えばMBS/ABSデリバティブプレーヤー)の間では一種の企業秘密でした。もちろん1990年代も終わろうとしている現在では、このテーマに纏わる各種の論文も続々と発表され、公開されたテクノロジーになっています。なお、最も単純な単変量のケースは、1999年1月22日付の日経金融新聞「金融フロンティア」欄に興銀フィナンシャルテクノロジーの方が平易な解説をされていますので、参考までにご覧ください。本ソフトウェアはその多変量版と考えて概ね間違いがありません。 精密な議論はご専門の方の論文などに譲るとして、参考までに以下では対称変量法2次サンプリング法の各々または同時使用時における効果を、1次モーメント (平均)、2次モーメント (標準偏差または分散)、3次モーメント (歪度)、4次モーメント (尖度)、および求めた乱数の相関係数を比較して示します。シミュレーション回数 n が100回の3変量モンテカルロのケースです。
  • 入力データ
    次の統計値を持ったドリフトのある多変量正規乱数を発生させたいとします。 以下の比較では、これらの数値に近い結果になればなるほど、優れた効果を持つと考えられます。
     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    A B C D
    Data Data Data Description
    1st.series 2nd.series 3rd.series Description
    0.01 0.02 0.03 means
    0.29833 0.24083 0.21213 stdevs
    0 0 0 skewness
    0 0 0 kurtosis
    Data Data Data Description
    1 0.54843 0.50011 crrel.matrix
    0.54843 1 0.68817 crrel.matrix
    0.50011 0.68817 1 crrel.matrix
  • 計算1:原始的なモンテカルロ法 – モーメントマッチングを全く使用しないケース
    わずか100回程度の計算試行では、求めた多変量乱数から得た統計量は、入力データの統計量と著しく乖離してしまいます。
     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    A B C D
    Data Data Data Description
    1st.series 2nd.series 3rd.series Description
    0.05210 0.02710 0.03757 means
    0.29159 0.22906 0.19863 stdevs
    -0.06096 0.39699 0.41137 skewness
    -0.30666 0.17643 0.55905 kurtosis
    Data Data Data Description
    1 0.47414 0.45856 crrel.matrix
    0.47414 1 0.71127 crrel.matrix
    0.45856 0.71127 1 crrel.matrix
  • 計算2:対称変量法のみ使用 (奇数次モーメントのモーメントマッチング)
    奇数次モーメントである、平均と歪度が入力データと完全に一致するように調整されます。この表には記していませんが、より高次の奇数次モーメントもゼロに調整されます。
     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    A B C D
    Data Data Data Description
    1st.series 2nd.series 3rd.series Description
    0.01000 0.02000 0.03000 means
    0.28964 0.23389 0.21311 stdevs
    0 0 0 skewness
    -0.13148 -0.21078 -0.04597 kurtosis
    Data Data Data Description
    1 0.58045 0.52405 crrel.matrix
    0.58045 1 0.74021 crrel.matrix
    0.52405 0.74021 1 crrel.matrix
  • 計算3:2次サンプリング法のみ使用 (1~2次モーメントのモーメントマッチング)
    平均、標準偏差、相関係数が入力データと一致するように調整されます。なお、非常に高次元のケースでは、計算機の表現精度上の誤差限界 (逆行列計算と三角分解の過程で発生)が制約要因となるため、微小のずれが生ずる場合があります。
     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    A B C D
    Data Data Data Description
    1st.series 2nd.series 3rd.series Description
    0.01000 0.02000 0.03000 means
    0.29833 0.24083 0.21213 stdevs
    0.00470 0.40025 0.57564 skewness
    0.43710 1.71197 0.72973 kurtosis
    Data Data Data Description
    1 0.54843 0.50011 crrel.matrix
    0.54843 1 0.68817 crrel.matrix
    0.50011 0.68817 1 crrel.matrix
  • 計算4:対称変量法2次サンプリング法の同時使用 (奇数次+2次モーメントのモーメントマッチング)
    尖度を除くすべての数値が入力データと一致します。なお、非常に高次元のケースでは、計算機の表現精度上の誤差限界 (逆行列計算と三角分解の過程で発生)が制約要因となるため、微小のずれが生ずる場合があります。
     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    A B C D
    Data Data Data Description
    1st.series 2nd.series 3rd.series Description
    0.01000 0.02000 0.03000 means
    0.29833 0.24083 0.21213 stdevs
    0 0 0 skewness
    -0.73001 1.19494 0.15166 kurtosis
    Data Data Data Description
    1 0.54843 0.50011 crrel.matrix
    0.54843 1 0.68817 crrel.matrix
    0.50011 0.68817 1 crrel.matrix

    ちなみにシミュレーション回数 n を10000回にした場合です。他の統計量は当然ながら変化しませんが、次のように尖度は改善します。
     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    A B C D
    Data Data Data Description
    1st.series 2nd.series 3rd.series Description
    0.01000 0.02000 0.03000 means
    0.29833 0.24083 0.21213 stdevs
    0.00470 0.40025 0.57564 skewness
    -0.03774 0.11285 0.00159 kurtosis
    Data Data Data Description
    1 0.54843 0.50011 crrel.matrix
    0.54843 1 0.68817 crrel.matrix
    0.50011 0.68817 1 crrel.matrix
こうしてみますと、わずか100回のモンテカルロシミュレーションであっても、対称変量法2次サンプリング法を同時使用すれば劇的な改善効果があり、あたかも完璧な答えが出てしまいそうです。 これはある程度まで真理ですが間違った結論です。 実際、このような論理展開には頻繁に陥りがちなため、統計学上の名称さえついており、「あわてものの誤り(Type I Error)」と呼びます。 深遠な誤差論からの説明は本ソフトウェア解説の趣旨ではありませんので、その意味を簡単に申し上げれば、このようなモーメントマッチングによる急速な収束性改善が見られたからといって、真の解に必ず漸近することとは別問題ということです。 オプション計算であれVaR計算であれ用途を問わず、ある程度の計算試行は必要なのです。
対数正規分布は2つのパラメータMSを持ち、

F(x;M, S) = \Phi\left(\frac{{\ln x}-M}{S}\right)

と表記されます。ここで\Phi(\cdot)は標準正規分布の累積分布関数です。
パラメータMSは分布の平均標準偏差ではありません

右辺からわかるように、対数正規分布に従う確率変数 x の対数\ln xが正規分布に従います。ここからMxの対数をとったものの平均Sxの対数をとったものの標準偏差と説明できます。

\text{E}\left[\ln x\right] = M
\text{Stdev}\left[\ln x\right] = S

では、xそのものの平均標準偏差はどうなるでしょうか?
\ln xの平均がMだから、x平均\exp\left(M\right) ?(同様にx標準偏差\exp\left(S\right)?残念ながらそんな簡単な話ではありません。

平均標準偏差を定義式にしたがって丁寧に計算すると、、、

\text{E}[x] = \exp\left(M+\frac{S^2}{2}\right)
\text{Stdev}[x] =\exp\left(M+\frac{S^2}{2}\right)\sqrt{\exp\left(S^2\right)-1}

となります。ここからわかるように、Mだけでx平均を表したり、S標準偏差を表すことはできません。平均標準偏差MSの組み合わせになります。

NtRand はもちろんこの計算をあなたの代わりにやってくれます。

\text{E}[x]=\text{NTLOGNORMMEAN}(M, S)
\text{Stdev}[x]=\text{NTLOGNORMSTDEV}(M, S)

この計算の逆、つまり\text{E}[x]\text{Stdev}[x]からMSを求めるには?これもNtRandにお任せください。

\{M, S\}=\{\text{NTLOGNORMPARAM}(\text{E}[x], \text{Stdev}[x])\}

ちなみに計算結果は、
M =\frac{1}{2}\ln\left(\frac{\text{E}^4[x]}{\text{E}^2[x]+\text{Stdev}^2[x]}\right)
S =\sqrt{\ln\left(\frac{\text{E}^2[x]+\text{Stdev}^2[x]}{\text{E}^2[x]}\right)}
となります。
詳しくはサンプルシートをご覧ください。
 

もし○○分布の累積分布関数F(x) とその逆関数F^{-1}(u) が手元にあるならば、一様乱数u を用いて“切断”○○分布に従う乱数を生成できます。

○○分布の乱数の範囲の切断法によって以下の3通りのパターンが考えられます。

  • 両裾を切断(範囲はA\leq x\leq Bとなる)
    • s=F(A)
    • \Delta=F(B)-F(A)
  • 下位の裾を切断(範囲はx\geq Aとなる)
    • s=F(A)
    • \Delta=1-F(A)
  • 上位の裾を切断(範囲はx\leq Bとなる)
    • \Delta=F(B)
    • s=0

こうして定義された\Delta, s を用いてx=F^{-1}(\Delta u+s) とすれば切断○○分布に従う乱数が得られます。 ダウンロード:切断Weibull分布の例

 
コンピュータ数値計算に無縁の方は驚かれるかもしれませんが、コンピュータの計算結果は使用するCPU、OS、コンパイラに依存しており、たとえ同一のプログラムであってもマシンによって結果が変わり得ます。例えば大規模な行列の三角分解といったケースでは、WindowsパソコンとUNIXワークスーテーションの間の結果はまず一致しません。その主な理由は、CPUチップ内部の浮動小数点演算ユニット (FPU)の動作モードとCPUチップ内部のROMにハードコーディングされたマイクロプログラム (micro program)にあります。これは本などでよく解説されている2進数の桁落ち桁丸め計算によるエラー、あるいは2進化10進数 (BCD、binary coded decimal)とは別の問題です。例としてC/C++言語で最も精度の高い double 型を用いたプログラムをWindowsパソコンの上で動かしたとします。double 型の仮数部の精度は多くのコンパイラ (Sun Pro CC、gcc、egcs、 HP CC、Visual C++、Intel C/C++)では64bitのはずです。ところが、 Intel x86 系の FPU の仮数部の精度は 24/53/64bit に「プログラムを使って」設定可能であり、その設定はOSやコンパイラレベルで普通は規定されています。さらに x86 系では Pentium4 / Xeon になって以降、128bit、つまり double 型2個を一度に処理するSIMD最適化(SSE II)ができます。これももちろん精度に影響します。また、CPUが異なればマイクロプログラムのアルゴリズムも異なり、解析解のない関数 (例えば三角関数や指数関数)の結果は異なって当然です。その結果、「Linux、Windows、さまざまな商用UNIXでバラバラの答えが出る」といったことが普通に起こるわけです。デリバティブのポジション評価にパソコンやワークステーションをお使いの金融ユーザーの皆さん、ご注意あれ。コンピュータは字義どおりの魔物 (daemon)の住む機械です。おそるべきことに、数値計算に携わる専門家の常識であっても、コンピュータメーカーの営業上の理由からかディスクローズされていない、あるいは積極的に知らされていない問題が数多くあり、数値計算はシステムエンジニアにとってさえ縁遠い世界なのです。この問題についてより詳しく研究されたい方には、このペーパー (David Goldberg, “What Every Computer Scientist Should Know about Floating-Point Arithmetic”)が有用な情報になるでしょう。
乱数の種数 (初期値)を64ビット分用意すべく、オリジナルの乱数アルゴリズムを拡張しました。なぜこのような拡張が必要なのかというと、実務においては再現性を伴うようなシミュレーション、すなわちバックテスティングやWhat-If分析の時に広大な初期値空間が必要になるからです。一般にはデータベースのキーフィールドを乱数の種数に関連付けてシミュレーションします。
乱数シードを変更すると異なる乱数列が生成されます。どのような乱数シードを与えるべきか?この問いは極めて微妙で深遠なものです。
実際には適当に選択した整数(例えばシミュレーション番号)を与えるしかありません。しかし、乱数シードを気にする必要がない、あるいは Excel の RAND() 関数のように勝手に乱数シードが選ばれるようにしたいのであれば、「Excel RAND() の振る舞いに似せて、ワークシートを再計算するたびに乱数を自動的に更新する方法」に記述してある方法があります。

本来ならば、異なる乱数シードから生成された乱数系列間の独立性を注意深くテストした後にそれらをシミュレーションに用いるべきでしょうが、実際にはそのようなテストを行わずに乱数系列は互いに独立であるとしてシミュレーションなどを行っている場合がほとんどです(しかも、NtRand で生成される乱数系列は事実上独立としても問題ない)。
もしこの辺りの事情をより深く知りたいのであれば以下のサイトを参照してください。
Dynamic Creator Home Page
 

Comments are closed.