2008-06-19

行列

先週の続き

先週の記述を少し付け加えたので、まず先週のページを読んで、決定係数まで求めてください。

修正

先週の方法には二つの欠点があります。
  • 「昨日の終値から今日の終値までの変化率」と「今日の終値から明日の終値までの変化率」に関係があったとしても、今日の終値が分かるときには既に今日の取引は終わっているので実際には売買できない。
  • そもそも決定係数が小さすぎる
そこで、実際に売買に利用できる別の時系列をいくつか考えて、決定係数が大きなものを探してみましょう。例えば
yi=i日目の始値から終値までの変化率
zi=i日目の終値からi+1日目の始値までの変化率
などが考えられます。

行列

もっと前のデータも予測に利用する、つまり
Xi=a0+a1Xi-1+a2Xi-2
を考えて、係数a0, a1, a2を求めたいと思います。この場合、多変量回帰と同じように、行列演算が必要になります。
そこでExcelを使って行列の積、特に逆行列の計算をしましょう。

行列の扱い方と転置

VBAで行列を扱うには、まず「Excelのシートのこの部分は行列Aです」と設定します。
Dim A As Range
と書くことで「Aはエクセルのシートの範囲を用いた行列」と宣言し
Set A = Range(Cells(1, 1), Cells(2, 2))
「Cells(1, 1)セルからCells(2, 2)セルまでの長方形が行列Aです」と設定します。
一番簡単な行列演算として、転置行列を求めてみましょう。

Sub tenchi()
Dim A As Range, B As Range
Set A = Range(Cells(1, 1), Cells(2, 2))
Set B = Range(Cells(4, 1), Cells(5, 2))
Cells(1, 1) = 11
Cells(1, 2) = 12
Cells(2, 1) = 21
Cells(2, 2) = 22
B = Application.Transpose(A)
End Sub

これでCells(1, 1)からCells(2, 2)までに入力した行列の転置がCells(4, 1)からCells(5, 2)までに出力されます。

行列演算

行列の積はMMult, 逆行列はMInverse, 行列式はMDetermです。 上のプログラムに続けて、Aの逆行列を計算してCに代入し、積ACを計算してDに代入し、最後にDの行列式を求めるプログラムは

Sub matrix()
Dim A As Range, B As Range, C As Range, D As Range
Cells(1, 1) = 11
Cells(1, 2) = 12
Cells(2, 1) = 21
Cells(2, 2) = 22
Set A = Range(Cells(1, 1), Cells(2, 2))
Set B = Range(Cells(4, 1), Cells(5, 2))
Set C = Range(Cells(7, 1), Cells(8, 2))
Set D = Range(Cells(10, 1), Cells(11, 2))
B = Application.Transpose(A)
C = Application.MInverse(A)
D = Application.MMult(A, C)
Cells(13, 1) = Application.MDeterm(D)
End Sub

となります。誤差が出るので0の筈なのに0にならない成分があるかもしれません。

練習

逆行列と行列の積を用いて、次の連立一次方程式の解を求めてください。
2x+4y+4z=18
2x- y-6z=-2
2x+3y-2z=-6

正解はx=11, y=-6, z=5です。

0 件のコメント: