2008-05-29

分散の推定

レポートの解答

前回、
> さらに変化率の標準偏差を求めてCells(2,9)に表示してください。標準偏差は分散の平方根で、分散は例えばcells(1000,6)までなら
> (cells(2,6)-平均)^2 + (cells(3,6)-平均)^2 +…+(cells(1000,6)-平均)^2
> で計算できますので、これをデータの最後まで、For文を使って計算してください。
> 平方根は、Excelのセルに書くときはSQRTですが、VBAではSqrです。
と書きましたが、これはプログラム上の難点を書いただけで、分散の計算を完結させるには(データの個数)または(データの個数-1)で割る必要があります。

Sub report()

i = 2
Do While Cells(i, 1) <> ""
  i = i + 1
Loop
last = i - 1
Cells(1, 7) = last

For i = 2 To last - 1
  Cells(i, 6) = (Cells(i, 5) - Cells(i + 1, 5)) / Cells(i + 1, 5)
Next i

wa = 0
For i = 2 To last - 1
  wa = wa + Cells(i, 6)
Next i
heikin = wa / (last - 2)
Cells(1, 8) = "変化率の平均"
Cells(1, 9) = heikin

wa = 0
For i = 2 To last - 1
  wa = wa + (Cells(i, 6) - heikin) ^ 2
Next i
hensa = Sqr(wa / (last - 2))
Cells(2, 8) = "変化率の標準偏差"
Cells(2, 9) = hensa

End Sub

プリントアウトの方法

レポートはどちらかというとメールの方がコメントを付けて返信し易いのですが、プリントアウトしたものでも構いませんし、プリントアウトしてゆっくり考えたいという人も居るでしょうから方法を説明します。

Visual Basicのファイルから印刷を選びます。

もし「OneNote 2007に送る」と書かれていたら、OKを押さずに設定を押します。

プリンタ名の部分で\\http://を選びます。

使用するプリンタが\\http://になったらOKを押します。

これでプリントアウトできます。

分散の計算

分散を求めるには
  1. 平均を求めて
  2. 各々のデータから平均を引いて2乗してから足して
  3. 和を(データの個数)または(データの個数-1)で割ります。
標準偏差は分散の平方根です。

さて問題は(データの個数)で割るか(データの個数-1)で割るか、ですが、

  • 手に入ったデータだけを考えて、そのデータの分散や標準偏差を計算するには(データの個数)で割ります。
  • 手に入ったデータを利用して、これから手に入るデータの確率分布の分散や標準偏差を推測するには(データの個数-1)で割ります。

練習

株式指数データの解析を進める前に、分散の推定に関してプログラムを書いてみましょう。
VBAで
Rnd()
と書くと[0,1]区間上の一様乱数が得られます。これを用いて
Sqr(-2 * Log(Rnd())) * Cos(2 * Application.Pi() * Rnd())
と書くと標準正規分布に従う乱数が得られます。(Box-Muller method)

推定方法の良し悪しを比較するために、シミュレーションしてみましょう。

  1. 標準正規分布に従うデータを、乱数を用いて10個得ます。1行のAからJまで、つまりCels(1,1)からCells(1,10)までに書き込んでください。
    データを得たらひとまず「このデータは標準正規分布に従う乱数から得られた」ことを忘れます。
    そしてデータだけを見て、この分布の平均、分散を推定してみましょう。元は標準正規分布ですから、平均の推定値はは0、分散の推定値は1に近いほうが良いです。
  2. まず平均を推定します。10個のデータを足して10で割った値が分布の平均の推定値です。これをL列、つまりCells(1,12)に書き込んでください。
  3. 次に10個のデータそれぞれから今求めた平均を引いて二乗して足します。足したものをデータの個数である10で割った値をM列、つまりCells(1,13)に書き込んでください。ぴったり平均0、分散1にはならないと思います。
  4. そこでこのデータ観測と推定を1000回繰り返して、1000個の平均の推定値、分散の推定値を求めて、それら推定値の平均を求めてみましょう。
    先ほどは1行目に書きましたが、これを同じことを1000行目まで繰り返します。するとL列、つまりCells(1,12)からCells(1000,12)までに1000個の平均の推定値が、M列、つまりCells(1,13)からCells(1000,13)までに1000個の分散の推定値が得られます。
    Cells(1,15)にCells(1,12)からCells(1000,12)までの平均を、 Cells(2,15)にCells(1,13)からCells(1000,13)までの平均を書き込んでください。
    Cells(1,15)は0に近いと思いますが、Cells(2,15)は1よりも小さく、0.9前後になるでしょう。
  5. では今度は1行目から1000行目までの各行に関して、10個のデータから平均を引いて二乗したものを足して(データの個数-1)である9で割ってN列に書き込んでください。
    そしてCells(1,14)からCells(100,14)までの平均をCells(3,15)に書き込んでください。
    今度は1に近いと思います。
このように、データに基づいて分布の分散を推定するときには(データの個数-1)で割ります。
講義のときは100回にしていましたが、100ではまだばらつきが大きいので1000回に変更しました。また見やすいように10個のデータと平均の推定値の間を一列空けました。

対数変換

一昨日から今日までの株価の変化率と、昨日から今日、一昨日から昨日の変化率の間には
 今日の株価  今日の株価 昨日の株価
------=-----×------
一昨日の株価 昨日の株価 一昨日の株価
という関係があります。よってこの間の平均変化率を求めるには、この右辺の平方根を計算して相乗平均を求める必要があります。
一般に掛け算とかn乗根は計算しづらいですし、統計で広く用いる平均と違うので面倒です。

そこで掛け算を足し算に変換するために、対数を考えることにします。すると
 今日の株価  今日の株価 昨日の株価
------=-----×------
一昨日の株価 昨日の株価 一昨日の株価

Log(今日の株価)-Log(一昨日の株価)=(Log(今日の株価)-Log(昨日の株価))+(Log(昨日の株価)-Log(一昨日の株価))
という、足し算、引き算の式になります。
これを先ほど計算したF列の隣、G列に書きます。
対数の底は10でもeでも上記の計算は成り立ちますが、底がe、つまり自然対数の方が
log(x)≒x-1
という近似式が成り立つので、
log(今日の株価÷昨日の株価)≒今日の株価÷昨日の株価-1≒(今日の株価-昨日の株価)÷昨日の株価
なので先ほど求めた変化率と似た値になります。

計算 G2セルに
=LN(E2)-LN(E3)
と書いても計算できますが、先ほど同様VBAを使って計算して下さい。但し自然対数はExcelのセルに書くときはLnですが、VBAで書くときにはLogです。

練習

TOPIXの自然対数の前日との差を求め、その平均をCells(3,9)、標準偏差を(4,9)に表示するプログラムを書いてください。

ヒストグラム

全部出来た人は、F列の変化率や、G列の対数の差のヒストグラムを書いて見ましょう。Excelでのヒストグラムの書き方の概略は統計学Iに書いています。
ヒストグラムの階級は、-7.5%から7.5%まで0.5%間隔、つまり-0.075から0.075まで0.005間隔にしてみてください。
今回のデータではどちらも正規分布っぽく見えますが、一般には対数の差の方が正規分布に従います。このように、対数にすると正規分布に従う分布を「対数正規分布」と呼びます。

0 件のコメント: