概览
1 o8 [* \4 V: {
$ ` Q* U: J! D! L% g% g$ y6 P% ]# @0 j
- 时间序列和平稳性研究+ c! M7 ]- r2 Y! C; I: G, ]
- 配对交易研究
1 Z9 [# w& q. h3 ?( L" K - 数据货币期货配对交易研究7 P2 i& M7 r( D
(持续更新中)$ A: x# v% Q' W, N
时间序列数据- U8 S* O# m$ q' j% v @
! p7 m7 a4 Z) d a& h6 T
时间序列数据是单一变量按时间的先后次序产生的数据,是投资研究中最常见的一类数据。
0 F3 \3 {+ a# o0 p/ A2 X: V如下为数字货币合约ETHUSDT的分钟行情数据,这是一个典型的时间序列数据2 C8 y2 ^9 b' m3 z4 t* y
import dai
2 U: K& {# n& [) i( l4 t% p Z6 F
; k/ W* h) G5 e# y$ _2 Y7 S1 sdf = dai.query("""0 _$ J6 `. A* o: J
SELECT close FROM cc_binance_future_um_bar1m4 z: g- P5 q+ b$ v# e8 |
WHERE date BETWEEN '2023-01-01' AND '2023-01-31' AND instrument = 'ETHUSDT'
- q0 E& V/ W) Z$ r# }2 I; E4 T""").df()" u( o: ]6 @# }) i V* U
8 G$ Y8 d$ K$ f) G5 j( l
平稳时间序列' `* i! d s* y1 _
; L% b6 G, r2 G" I) k% N1 e3 U平稳性是用来描述时间序列数据统计性态的特有术语。在以时间为序列的数据中,平稳性的特征是其数据特性不会因为观测时间的改变而改变。
+ }. i' _7 S8 d0 k9 I假设我们有一组时间序列数据,标记为{Xt},其中t代表了第t个时期,例如(t=1,2,...)。我们认为每一个数据Xt都是通过一个可能涉及到随机因素的过程生成的,这样的过程被称为随机过程。如果通过这样的随机过程生成的时间序列数据满足以下条件:
7 ?1 K0 K4 m6 f- ?. k, D$ m' c# H* u, ~
- 其均值E(Xt)等于m,且这个值是一个固定的常数,不会因为时间t的改变而改变;
2 v" u! d/ l$ D3 P r V1 W0 Q - 其方差Var(Xt)等于s^2,同样这也是一个固定的常数;. {: e, K$ ^! I2 _) ^: Y6 o- x
- 它的协方差Cov(Xt, Xt+k)等于gk,与时间t无关,但与时期间隔k有关。
2 k: N1 s7 g' Q, J7 z. s 如果某一时间序列满足以上三个条件,那么我们就可以称该时间序列为弱平稳。由此生成这样的时间序列的随机过程则被称为平稳随机过程。
: M0 d! _! |9 W2 d b以白噪声过程为例,它是一个典型的平稳过程。因为在白噪声中,数据的均值是固定的常数零,方差同样是一个常数s^2,而所有时间间隔的协方差都是零。
% R: x1 ?9 r* L5 i2 v+ h4 X5 y另一方面,随机游走过程则是一个非平稳过程。例如在随机游走中,时间序列可以表达为Xt=Xt-1+ut,其中ut~IIN(0, s^2),尽管其均值是固定的常数,但是其方差Var(Xt)=ts^2不是一个常数。
g7 F. ~& D; G; X' @( f! y& \然而,通过对随机游走过程进行一阶差分(即求得DXt = Xt - Xt-1,其中ut~IIN(0, s^2)),我们可以将其变为平稳过程。- @; q$ q1 p8 j* m1 r
在实际应用中,经济系统中的时间序列通常都是非平稳的。但是,我们可以通过上述的差分变换方法来将非平稳序列转化为平稳序列,以方便我们进一步的统计分析。
7 c3 F* e5 J& p0 G平稳性检验
/ u1 N7 J+ U$ C& C5 [9 p+ S1 B3 E( _4 F& f
ADF检验是用于时间序列数据平稳性常用的严格的统计检验方法,也叫做单位根检验。ADF检验全称是 Augmented Dickey-Fuller test,是 Dickey-Fuller检验的增广形式。DF检验只能应用于一阶情况,当序列存在高阶的滞后相关时,可以使用ADF检验。
! S: c3 j4 e* l" Q- WADF检验就是判断序列是否存在单位根:如果序列平稳,就不存在单位根;否则,就会存在单位根。ADF检验的 H0 假设就是存在单位根(非平稳),如果得到的显著性检验统计量小于三个置信度(10%,5%,1%),则对应有(90%,95,99%)的把握来拒绝原假设。
" T J4 X. | [& {- F& b! p如下使用python和statsmodels的adfuller来检验ETHUSDT分钟行情是否平稳:
4 g( Z6 L8 w3 G/ U/ b& }; {4 wimport pandas as pd( W1 `' N- \1 |: @, i+ K6 E
from statsmodels.tsa.stattools import adfuller8 I/ K9 t( A, J+ O" |
`- L5 I' c; I) E9 e& c9 o, H
# 读取数据* k, J5 C5 E8 u7 e0 N8 o) P8 m
import dai6 ?# n3 _) U; F* r4 u1 J
D) R5 K, C" S `% ~" @df = dai.query("""
& T2 c s2 M |SELECT close FROM cc_binance_future_um_bar1m8 x- o0 ]( U3 [2 c% `" ~
WHERE date BETWEEN '2023-01-01' AND '2023-01-05' AND instrument = 'ETHUSDT'
# D$ c* z+ U! r* L. s% W) j, y7 M3 a""").df()" b5 G& ]7 w4 i) k
/ [% Z! _. o# W+ z# 使用ADF检验
1 o7 P& F2 q. v6 z! z4 D; S1 {result = adfuller(df['close'].tolist())
9 L ^% |% h- m
& a, t/ @* V- \6 B( ?4 Vprint(result)9 |" z+ N8 m5 t' K' e& k" H
5 y) V! w% A, U* v2 T& Z0 [# 输出ADF检验的结果
) N! m$ N4 v0 H3 m5 o) zprint('ADF Statistic: %f' % result[0])
) M5 G8 ?! i3 U ^5 U* Dprint('p-value: %f' % result[1])
2 N- r+ c, |6 ?3 e6 _+ fprint('Critical Values:')# j* |8 R$ k0 V: F: y
for key, value in result[4].items():
, l9 r) V' {5 V6 R" Q& g print('\t%s: %.3f' % (key, value))结果解读:4 A `! \3 h6 x3 t
# b- d$ m' j7 @/ D: S8 j4 G- ADF结果 -0.14336515686583282,大于 1%、5%、10%三个level的统计值,说明在三个level上都是不平稳的8 i& j' v! Z- D% `# @
- p-value为0.9449442082906334,明显不接近0,说明不平稳
' E, m& Z- L" h: z, s5 j
8 N+ S* b9 H$ c) G1 Z0 d- g
+ m: r) u' P5 t, t7 b
: v5 {( V4 ]1 ~Quantchat - 实现平稳性检验) s: r/ D$ c# f3 C5 h
+ V4 `* D p4 I/ }: {0 o
Quantchat使用链接:9 Q7 `! r5 E( q% P. c* _( K9 F
差分时间序列. D/ L4 f7 r6 E; F1 k2 n
9 s. C( o, x$ `# V- x3 H. R一般情况下我们可以通过差分变换方法来将非平稳序列转化为平稳序列,如下我们在QuantChat辅助下生成代码,实现差分变换和平稳性检验8 B" [4 p; A& w2 \+ u* s
import pandas as pd
& R& i: G7 Y2 B* D# `9 N* Ufrom statsmodels.tsa.stattools import adfuller- D" u; M) o- u3 q P1 U0 F- E- r, T
: w% C% D' s# o) T# B9 g
# 读取数据
/ c- }' y( q$ h+ oimport dai
) Y0 W8 x# t$ A- T3 M V( _8 k+ O; W. ^$ X- t! a( r3 ^% O
df = dai.query("""
* W/ {/ y3 N( C# XSELECT close FROM cc_binance_future_um_bar1m
# B% q. V. r: Q+ a1 e0 T( r0 \WHERE date BETWEEN '2023-01-01' AND '2023-01-05' AND instrument = 'ETHUSDT'( ^: f: X1 X7 x) |( T
""").df()9 I9 F' ]6 w* U$ Z* T9 w9 _9 u
* Y7 a8 b" q8 I4 z# I# E' d
# 使用ADF检验,diff 一阶差分" g' o, c( o+ t; ? L
result = adfuller(df['close'].diff().dropna().tolist())
0 e3 o) H2 @; ?
( n4 X q" D: W4 k5 xprint(result): W% v0 U4 j, R# o% [% L4 L q& V
2 U* |. a6 s+ T- c6 B* L" u
# 输出ADF检验的结果
4 _0 }1 ]! [! K4 i; d( zprint('ADF Statistic: %f' % result[0])2 I; e( ]0 m3 o2 c3 p
print('p-value: %f' % result[1])
1 R9 W4 {' O: [& |print('Critical Values:'), s" k' C2 ^2 x8 ^: Q/ Z3 B
for key, value in result[4].items():
, h, G' v! {+ U print('\t%s: %.3f' % (key, value))' { Z+ F+ s% ~$ i0 C- w% q5 x/ L1 ]# [
$ u+ c! a) t4 r8 F8 s3 Y
& {' N3 T( ?0 V5 Q
Quantchat - 实现差分变换和平稳性检验' M$ o# Q# o# r6 ^: w4 G8 V
5 ^4 U/ O5 {, D! r) H' d# A( n
这个ADF检验的结果表示:
2 [# {8 Q" N8 x# t! O% @
! N7 @. P+ [( x2 d- ADF Statistic(ADF检验统计量): -46.79928011517576,该值小于所有的Critical Values(临界值),因此我们可以拒绝原假设,即我们认为该时间序列在差分后是平稳的。
% n! M# K/ ?5 C9 p; }" \ - p-value(p值): 0.0,通常来说,如果p值小于0.05,我们就拒绝原假设,即我们认为该时间序列在差分后是平稳的。这里的p值为0,所以拒绝原假设。
1 R, G+ Q* d1 y1 V% D n6 e - 临界值(Critical Values): 对于不同的置信水平,有不同的临界值。在这个结果中,1%、5%、10%的临界值分别为-3.431486393634081, -2.862042177637761, -2.5670373072655446。! z+ {8 S5 j& G: P; G
所以,根据这个ADF检验的结果,我们可以认为这个时间序列在进行一阶差分后是平稳的。
, Z/ E3 o2 O9 z$ y5 {9 I @ W原文链接: |