19日に更新してた

アフィリエイトはないよ

pandas で rolling 使って robust zscore とか

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 でやったほうがもっとそれっぽいです。しかし、自分で書いといてこういうのも何なんですが、いずれにしてもテクニカル売買のグラフ的には意味がありそうだけれど数学的な意味は?