pandas で rolling を使って一定範囲の robust zscore を zscore と、株とか FX とかで出てくるボリンジャーバンドのグラフのロウソク足が線を超えているのを robust zscore を使ってそれっぽくしたの*1と一緒に計算してみると、
import numpy as np import pandas as pd def pd_robust_zscore(col_name,n): # col_name:pandas.DataFrame の列名 n:幅 median = df[col_name].rolling(n).median() q3 = df[col_name].rolling(n).quantile(0.75) q1 = df[col_name].rolling(n).quantile(0.25) return (df[col_name] - median) / ((q3 - q1) / 1.3489) def pd_zscore(col_name,n): # col_name:pandas.DataFrame の列名 n:幅 return (df[col_name] - df[col_name].rolling(n).mean()) / df[col_name].rolling(n).std() def pd_robust_zscore_2(col_name,col_name_hl,n): # col_name:終値などの基準になる pandas.DataFrame の列名 # col_name_hl:高値、低値などの算出したい pandas.DataFrame の列名 # n:幅 median = df[col_name].rolling(n).median() q3 = df[col_name].rolling(n).quantile(0.75) q1 = df[col_name].rolling(n).quantile(0.25) return (df[col_name_hl] - median) / ((q3 - q1) / 1.3489) df = pd.DataFrame() df['a'] = np.random.randint(400,450,100) df['b'] = df['a'] + 5 df['zscore'] = pd_zscore('a',5) df['rob'] = pd_robust_zscore('a',5) df['rob_hl'] = pd_robust_zscore_2('a','b',5)
以下のような感じです。
a b zscore rob rob_hl 0 438 443 NaN NaN NaN 1 403 408 NaN NaN NaN 2 429 434 NaN NaN NaN 3 404 409 NaN NaN NaN 4 424 429 0.283253 0.000000 0.269780 ... ... ... ... ... ... 95 422 427 0.544404 1.252550 1.734300 96 413 418 -0.354044 0.000000 0.518808 97 421 426 0.964764 0.899267 1.461308 98 414 419 -0.324865 0.000000 0.843062 99 440 445 1.660556 3.203637 4.046700 100 rows × 5 columns
*1:zscore でやったほうがもっとそれっぽいです。しかし、自分で書いといてこういうのも何なんですが、いずれにしてもテクニカル売買のグラフ的には意味がありそうだけれど数学的な意味は?