NumPyで標準偏差,偏差値

[pukiwiki]
マーケット番組でよく登場するチャート、[[ボリンジャーバンド(Bollinger bands)>ググる:ボリンジャーバンド]]。
これに使われている標準偏差を演算ライブラリ[[NumPy>ググる:numpy]]で計算するのはどうやるのか調べてみますた。

[/pukiwiki]

[pukiwiki]
株価の値動きが、正規分布 1σ(シグマ)の中にほぼ納まるのを利用して、反発したり下落したりするポイントを予測するのに使われるチャートです。

ボリンジャーバンドの考えを、”株価以外の計測データ”に使えないかなー、ということで、まずは一歩目、python+NumPyで標準偏差や偏差値の計算する方法を調べてみました。

今回はボリンジャーバンド等を描くところまでは行わず、ごく普通に標準偏差や偏差値を計算するところまでのみ。

こちらのページのデータを使って試してみました
[[平均と標準偏差(経済指標のかんどころ):http://www.cap.or.jp/~toukei/kandokoro/html/14/14_2.htm]]
計算結果を照らし合わせてみます。

使用関数はコチラで調べました
[[Numpy Example List:http://www.scipy.org/Numpy_Example_List]]
[/pukiwiki]

# -*- coding: utf8 -*-
import numpy
#数学の得点
sugaku=numpy.array([61,74,55,85,68,72,64,80,82,59])
#国語の得点
kokugo=numpy.array([79,81,77,78,83,80,82,78,80,82])

#偏差値を計算する関数は無いようなので作る
def std_score(a):
    return numpy.round_(50+10*(a-numpy.average(a))/numpy.std(a))

#一通り計算、表示
def test(label,a):
    print label
    print u" 得点",a
    print u" 合計",numpy.sum(a)
    print u" 平均(average)",numpy.average(a)
    print u" 分散( variance)",numpy.var(a)
    print u" 標準偏差(standard deviation )",numpy.std(a)
    print u" 偏差値(standard score)\n    ",std_score(a)

test(u"数学",sugaku)
test(u"国語",kokugo)

結果。 一応あってるみたいです

数学
 得点 [61 74 55 85 68 72 64 80 82 59]
 合計 700
 平均(average) 70.0
 分散( variance) 95.6
 標準偏差(standard deviation ) 9.77752524926
 偏差値(standard score)
     [ 41.  54.  35.  65.  48.  52.  44.  60.  62.  39.]
国語
 得点 [79 81 77 78 83 80 82 78 80 82]
 合計 800
 平均(average) 80.0
 分散( variance) 3.6
 標準偏差(standard deviation ) 1.8973665961
 偏差値(standard score)
     [ 45.  55.  34.  39.  66.  50.  61.  39.  50.  61.]

[pukiwiki]
*移動平均
移動平均線や、ボリンジャーバンドを書こうと思うと、日にちごとに再計算が必要になります。

7日間の移動平均をとるとして

“データ=[1,2,3,4,5,6,7,8,9, …] #8個
合計値1=1+2+3+4+5+6+7 = 28
平均値1 (av)=合計値1 / 7 = 4
 
合計値2=合計値1 – 1 + 8 = 28-1+8=35
# 2~8の合計を全て再計算する必要は無い
 
平均値2=合計値2 / 7 = 35 / 7 =5

と、最古のデータを引いて、最新のデータを足す、という作業を繰り返せば、移動平均の計算量が若干減るのですが(200日移動平均線を描くと、少しは計算量に差が出来るかも)
標準偏差の計算には平均値が使われてるんで、それが毎回変化するとなると、、、、ややこしいことをするよりは、numpyの std関数一発で全部再計算したほうが速そうな気がします。
試してないですけれども。
[/pukiwiki]

コメントを残す

メールアドレスが公開されることはありません。