[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]