如何用例子浅显地解释什么是统计套利?

7
回复
4979
查看
[复制链接]

209

主题

26

回帖

1424

积分

超级版主

积分
1424
来源: 2020-2-18 15:41:09 显示全部楼层 |阅读模式
1:有什么深层次的概念解释统计套利,或者浅显例子

我理解的统计套利大概是这样:
小明通过历史回测发现金融产品a,和金融产品b的价格有关联,例如a涨起来了,5分钟后b有很大概率也涨起来(什么原因不用管)
所以统计套利就是发现这个关联规律,在a涨起来后马上买入b,等b涨起来后再卖掉。

2:统计讨论和其他金融衍生品交易方式有什么区别?只是单纯的风险低很多吗?

3:统计套利必须高频吗?低频但发现了其他人没发现的价格关联能不能套利?


4:最后来一个例子,下面的交易例子算不算统计套利?还是其他交易方式

小明通过智慧的大脑又发现一个价格规律,
金融产品c,每当小明的狗旺财撒尿的时候,有很大概率走出趋势行情,
于是他盯着旺财每当它撒尿时就在金融产品c现价上下20点各下一个买入卖出订单,
一旦成交一个则取消另一个(赌行情波动大会增大),
在旺财打滚时平仓,结果大获丰收

这算统计套利吗?如果算的话那岂不是所有交易方式都算统计套利了?因为他们都是用一些东西和行情对应,例如平均线啥的
回复

使用道具 举报

8

主题

1

回帖

58

积分

注册会员

积分
58
2020-2-18 15:43:36 显示全部楼层
基于时间序列的协整关系的配对交易

本帖主要介绍了协整的基础知识,如何对两个时间序列进行协整关系检验,并实现了一个简单的配对交易策略。

这里参考了百度百科和链接。

Why

统计套利之配对交易 是一种基于数学分析交易策略,其盈利模式是通过两个标的的差价(spread)来获取,两者的价格走势虽然在中途会有所偏离,但是最终都会趋于一致。
配对交易就是利用这种价格偏离获取收益。具有这种关系的两个标的,在统计上称作 协整性(cointegration),即它们之间的差价会围绕某一个均值来回摆动,这是配对交易策略可以盈利的基础。
通俗点来讲,如果两个股票或者变量之间具有强协整性,那么不论它们中途怎么走的,它们的目的地总是一样的。

What

经典回归模型是建立在平稳数据变量的基础之上的,对于非平稳变量,不能使用经典回归模型,否则会出现虚假回归等诸多问题,但是实际应用中大多数时间序列是非平稳的。
1987年Engle和Granger提出的协整理论及其方法,为非平稳序列的建模提供了另一种途径。
虽然一些经济变量的本身是非平稳序列,但是,它们的线性组合却有可能是平稳序列。这种平稳的线性组合被称为协整方程,且可解释为变量之间的长期稳定的均衡关系。

需要 特别注意 的是 协整性 和 相关性 虽然比较像,但实际是不同的两个东西。
两个变量之间可以相关性强,协整性却很弱,比如说两条直线,y=x和y=2x,它们之间的相关性是1,但是协整性却比较差;

方波信号和白噪声信号,它们之间相关性很弱,但是却有强协整性。(如下图)
my picture

How:统计套利之配对交易

这里还有介绍一个关于时间序列的基本概念:平稳性。

平稳分为两种:


强(严)平稳:给定随机过程X(t),t属于T,其有限维分布组为F(x1,x2,…xn;t1,t2,…,tn),t1,t2,…,tn属于T,对任意n任意的t1,t2,…,tn属于T,任意满足t1+h,t2+h,…,tn+h属于T的h,总有F(x1,x2,…xn;t1,t2,…,tn)=F(x1,x2,…xn;t1+h,t2+h,…,tn+h);

宽(弱)平稳:给定二阶矩过程(二阶矩存在)X(t),t属于T,如果X(t)的均值函数u(t)是常数,相关函数R(t1,t2)=f(t2-t1)即相关函数只与时间间隔有关。(我们通常用的都是弱平稳)


单整阶数:当原序列是非平稳的,需要对序列进行差分(后一项减前一项),直到为平稳序列,差分几次就是几阶。

协整关系存在的条件是:只有当两个变量的时间序列{x}和{y}是同阶单整序列即I(d)时,才可能存在协整关系(这一点对多变量协整并不适用)。因此在进行y和x两个变量协整关系检验之前,先用ADF单位根检验对两时间序列{x}和{y}进行平稳性检验。平稳性的常用检验方法是图示法与单位根检验法。

下面举个例子,为了证明两个symbol是否存在协整性:取一年的时间序列的 binance的BTC/USDT 和 binance的ETH/USDT

隐藏输出
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from vitu import api

data1 = api.coinbar(symbol='BTCUSDT',exchange='binance',freq='daily',start_date='2019-01-01',end_date='2019-12-01')['close']
data1 = data1.reset_index(drop=True)
data1.columns = ['binance.btcusdt']
data1.plot(figsize=(20,8))
plt.show()

隐藏输出
data2 = api.coinbar(symbol='ETHUSDT',exchange='binance',freq='daily',start_date='2019-01-01',end_date='2019-12-01')['close']
data2 = data2.reset_index(drop=True)
data2.columns = ['binance.ethusdt']
data2.plot(figsize=(20,8))
plt.show()

先定单整阶数,即检验平稳性,作差分,直到序列平稳。
这里检验平稳性用的是 ADF单位根检验法 ,原假设为序列具有单位根,即非平稳,对于一个平稳的时序数据,就需要在给定的置信水平上显著,拒绝原假设。

隐藏输出
from statsmodels.tsa.stattools import adfuller,coint

def testStationarity(data):
    adftest = adfuller(data)
    result = pd.Series(adftest[0:4], index=['Test Statistic','p-value','Lags Used','Number of Observations Used'])
    for key,value in list(adftest)[4].items():
        result['Critical Value (%s)'%key] = value
    return result

x=np.array(data1)
y=np.array(data2)
zz=pd.concat([testStationarity(x),testStationarity(y)],axis=1)
zz.columns=['binance.btcusdt','binance.ethusdt']

diffx=data1.diff(1)
diffx.dropna(inplace=True)
diffx=np.array(diffx)
diffy=data2.diff(1)
diffy.dropna(inplace=True)
diffy=np.array(diffy)
tz=pd.concat([testStationarity(diffx),testStationarity(diffy)],axis=1)
zz.columns=['binance.btcusdt','binance.ethusdt']
zz


binance.btcusdt        binance.ethusdt
Test Statistic        -0.704307        -1.474204
p-value        0.845631        0.546231
Lags Used        0.000000        15.000000
Number of Observations Used        333.000000        318.000000
Critical Value (1%)        -3.450141        -3.451082
Critical Value (5%)        -2.870259        -2.870672
Critical Value (10%)        -2.571415        -2.571636
一阶差分以后,两个序列就已经平稳了,他们的单整阶数都是一,所以是单整同阶的,下面就可以做协整了:这里的原假设是两者不存在协整关系。

隐藏输出
a,pvalue,b = coint(x,y)
pvalue
1.5536553497038895e-17
p值低于临界值,所以拒绝原假设,两者存在协整关系。

接下来就可以根据两者的协整关系做配对交易了。先画出两者的差价序列:

隐藏输出
mean=(data1-data2).mean()
std=(data1-data2).std()

s1=pd.Series(mean,index=range(len(data1)))
s2=pd.Series(mean+std,index=range(len(data1)))
s3=pd.Series(mean-std,index=range(len(data1)))

data3=pd.concat([data1-data2,s1,s2,s3],axis=1)
data3.columns=['spreadprice','mean','upper','down']
data3.plot(figsize=(14,7))
print(mean+std,mean-std)
plt.grid()
plt.show()
9920.702739095435 4481.417979467437

这样,一个最简单的配对交易策略如下:(如果可以操作期货的话)


spreadprice大于 9920.7027 时,卖空差价,即卖空 BTC/USDT,买入 ETH/USDT。


spreadprice小于 4481.4179 时,买入差价,即买入 BTC/USDT,卖空 ETH/USDT。


spreadprice靠近零时,平仓



上述过程重在描述理论,以供大家研究,结果不是太重要。(下面策略附源代码)
期货回测即将开启,或许这种统计套利的方式在期货市场也有用武之地。
量化之路漫漫其修远兮,吾将上下而求索。

隐藏输出
# 引入需要的python库
from vitu import ai
import numpy as np


# 配置一个账户初始持仓信息
ai.create_account(name='myaccount', exchange='binance', account_type='digital.spot', position_base=[{'asset': 'USDT', 'qty': 200000}])

# 选定投资域
universe = ai.create_universe(['BTC/USDT.binance','ETH/USDT.binance'])

# 初始化环境
def initialize(context):
    context.universe = ['BTC/USDT.binance','ETH/USDT.binance']
    context.account = context.get_account('myaccount')
    context.amount = 0              
   
# 策略逻辑
def handle_data(context):
    symbol1 = context.universe[0]
    symbol2 = context.universe[1]
    price1 = context.get_price(symbol1)
    price2 = context.get_price(symbol2)
   
    buy_list = []
    sell_list = []
   
    if price1 - price2 > 9912.94:
        buy_list.append(symbol2)
        sell_list.append(symbol1)
    if price1 - price2 < 4468.02:
        buy_list.append(symbol1)
        sell_list.append(symbol2)
    if price1-price2 < 0.01 and price1-price2 > -0.01 :
        sell_list.append(symbol1)
        sell_list.append(symbol2)
   
    hold = []
    buy = []
   
    for symbol in context.universe:
        if symbol in sell_list:
            price = context.get_price(symbol1)
            context.account.sell(symbol, price, context.amount*0.1)
        else:
            hold.append(symbol)
            
    buy = hold
    for symbol in buy_list:
        if symbol not in hold:
            buy.append(symbol)
            
    if len(buy) > 0:
        available = context.account.get_position('USDT')['available']
        price = context.get_price(symbol)
        context.amount = available/price
        amout = available/len(buy)
        for symbol in buy:
            context.account.buy(symbol, price, context.amount*0.1)   
  
# 配置策略参数
my_strategy = ai.create_strategy(
    initialize,
    handle_data,
    universe=universe,
    benchmark='csi5',
    freq='d',
    refresh_rate=1
)

# 配置回测参数
ai.backtest(strategy=my_strategy,
            start='2019-01-10',
            end='2019-12-01',
            commission={'taker': 0.0002, 'maker': 0.0002}
            )
累计收益率
94.81%
基准累计收益率
61.15%
年化收益率
110.99%
基准年化收益率
70.62%
阿尔法
0.51
夏普比率
1.63
信息比率
1.14
贝塔
0.85
年化波动率
0.68
最大回撤
48.80%
绝对收益 相对收益 对数收益
补充

跨交易所之间:binance的BTC/USDT 和 huobi的BTC/USDT 之间统计套利之配对交易

隐藏输出
data1 = api.coinbar(symbol='BTCUSDT',exchange='binance',freq='daily',start_date='2019-01-01',end_date='2019-12-01')['close']
data2 = api.coinbar(symbol='BTCUSDT',exchange='huobi',freq='daily',start_date='2019-01-01',end_date='2019-12-01')['close']

x=np.array(data1)
y=np.array(data2)
zz=pd.concat([testStationarity(x),testStationarity(y)],axis=1)
zz.columns=['binance.btcusdt','binance.ethusdt']

diffx=data1.diff(1)
diffx.dropna(inplace=True)
diffx=np.array(diffx)
diffy=data2.diff(1)
diffy.dropna(inplace=True)
diffy=np.array(diffy)
tz=pd.concat([testStationarity(diffx),testStationarity(diffy)],axis=1)
zz.columns=['binance.btcusdt','binance.ethusdt']

mean=(data1-data2).mean()
std=(data1-data2).std()

s1=pd.Series(mean,index=range(len(data1)))
s2=pd.Series(mean+std,index=range(len(data1)))
s3=pd.Series(mean-std,index=range(len(data1)))

data3=pd.concat([data1-data2,s1,s2,s3],axis=1)
data3.columns=['spreadprice','mean','upper','down']
data3.plot(figsize=(14,7))
print(mean+std,mean-std)
plt.grid()
plt.show()
178.191381016475 -155.72850676497794



回复

使用道具 举报

294

主题

20

回帖

1380

积分

专栏作家

积分
1380
2020-2-18 15:50:57 显示全部楼层
协整性与相关性 cointegration vs correlation
    需要特别注意的是协整性和相关性虽然比较像,但实际是不同的两个东西。两个变量之间可以相关性强,协整性却很弱,比如说两条直线,y=x和y=2x,它们之间的相关性是1,但是协整性却比较差,其pvalue等于0.87811389067154477(两个变量之间的pvalue值越小表示协整性越好)。也有弱相关性+强协整性的例子,比如方波信号和白噪声信号,它们之间相关性很弱,但是却有强协整性。如下图所示的方波信号和白噪声信号,它们之间的相关性只有0.0075395597167645838,但是pvalue的值却为零
回复

使用道具 举报

209

主题

26

回帖

1424

积分

超级版主

积分
1424
2020-2-18 15:56:03 显示全部楼层
回复

使用道具 举报

95

主题

18

回帖

515

积分

高级会员

积分
515
2020-2-18 15:58:33 显示全部楼层
所谓的统计套利根本就不应该和套利折上关系。统计套利本质是金融领域的数据挖掘。真正的套利,应该是原理明确并且稳定,风险可知,可操作。而统计套利,通常只关注结果,从数据中发现规律以后,假定未来规律依然延续,而忽视了产生结果的内在原因。统计套利的典型案例就是LTCM,一群世界顶尖的学术和业界牛人搞的基金,用各种高深莫测的数学模型利用不同交易品种的价格规律赚钱。前三年成绩喜人,大牛们对统计套利的手法更信心满满,把自己钱都投入基金里。不知他们当中有没有人思考过使他们能够赚钱的规律背后因素是什么,这些因素能否持续稳定,在什么情况下会失效。所以说,统计套利本身的模型再复杂精确,历史拟合再好,甚至实盘一段时间的表现再优异,如果其背后的逻辑和本质无法被解释并追踪,模型未来失效的风险就会是巨大,甚至不可控的。"
在幫LTCM紓困後,Meriwether創辦了避險基金JWM Partners,Haghani、Hilibrand、Leahy和Rosenfeld都參與了新公司的成立。在1999年12月前,他們已募得2.5億美元的基金,可延續許多LTCM的策略──這次用較低槓桿。然而由於次貸風暴的影響,JWM Partners從2007年九月到2009年二月間,公司旗下的相關價值機會二號基金蒙受了44%的虧損。因此,JWM避險基金最終於2009年七月宣告倒閉。" ——来自维基百科

有人认为LTCM的失败主要是过高杠杆造成的,其策略本身是可行的。然而,LTCM的创办者在之后另外两次尝试以低杠杆的尝试同样以失败告终,现实证明了其策略本身就有天然的缺陷。有人认为是黑天鹅造成了统计模型的失灵。但是我认为,在金融市场,违约,泡沫,暴跌这类事件,根本上是必然发生的。如果俄罗斯债务违约是黑天鹅事件,那连续数年债务市场风平浪静,各国债务一直平稳运作就是正常的吗?如果永远如此平稳的话,那么各国债券的收益率就趋向于相近了,那LTCM利用各国债券价差来盈利的模型恐怕也会失效。事实上,97年债务危机,07年次贷危机这类事件的出现,在金融市场上是必然事件。如果将从市场平稳阶段数据中挖掘到的规律理所当然的拿来当发财的工具,只要没有停手的一天,赚到的钱早晚有一天会还给市场。 现实中LTCM的牛人们不仅没想收手,还把自己的钱往里面扔,最大规模的加杠杆,甚至在危机发生的早期,面对亏损仍然越亏越开仓,妄想在基本面改变的情况下,他们的统计模型还能如上帝之手一般将价差收敛回去。

题主提到利用均线系统是否算是统计套利。我认为,只要是使用统计的方法,在历史数据当中对均线这样的技术指标与价格趋势进行挖掘发现它们之间的运行规律,以此来作为未来交易的依据,如此就能归类到统计套利的范畴。我觉得,技术指标有效的背后,其反应出的是市场参与者交易的习惯,偏好,心理等特征。但与统计套利一样,技术指标未来的有效性是建立在市场参与者的特征是否稳定上面。





回复

使用道具 举报

34

主题

33

回帖

270

积分

中级会员

积分
270
2020-2-18 16:03:53 显示全部楼层
统计套利是一种中性的市场策略。具体指应用各种统计方法识别不同资产标的之间的相对错误定价关系,然后对相对高估的标的建立空头头寸,对相对低估的标的建立多头头寸,期待未来错误定价关系被市场修正时,所建立的头寸可以获得正收益。往往可以通过构造大量统计套利套利对,从横截面的分散上保证时间序列上的均值回复。虽然统计套利策略不局限于两个标的,但是往往认为只包含两个标的的统计策略是最经典的一种特例,我们也将其称之为配对交易(Pairs Trading)。举个形象化的例子,A序列与B序列走势相近,我们构造Spread序列,令Spread = A – B,得益于A序列与B序列相关性很强,Spread序列应当具备比较明显的均值回复特征,也就是说发散程度有限(可以脑补牛皮市的震荡整理形态)。这时,我们就可以在Spread序列的均值上方某处做空价差(即卖A买B,因为此时价差过大,说明A强B弱),反之我们在Spread序列的均值下方某处做多价差(即买A卖B,因为价差过小,说
回复

使用道具 举报

19

主题

36

回帖

201

积分

中级会员

积分
201
2020-2-18 16:10:14 显示全部楼层
这里不去解释广义,只对狭义上的统计套利策略进行解释。用个例子起头:假设公司A既在欧洲上市,也在美国上市,记它们的股价分别为A1和A2。那么,A1和A2的股价涨跌变化应该很相似(毕竟是一家公司),但不会完全相等,原因是两个市场的交易行为,和供需不一致。统计套利策略是观察A1和A2的相关性。当它们的价差(算上汇率)超出一定范围的时候,就会买低卖高,以此来赚取短时偏离产生的价差。统计套利可以扩展到其它相关性高的产品。它的本质是研究产品间的相关性,并对研究的产品采取相同或相反的操作。来回看你的例子,a涨起来了,b有很大概率涨。你通过a的变化去买卖b,这更像多因子模型用相关性进行预测,而不算统计套利策略。统计套利策略是,你发现a和b在大部分时候会同涨同跌。这时候你发现某一天,a涨的时候,b却跌了。并且两者的差值超过了一定范围。于是你买跌的,卖涨的。因为你知道根据他们的相关性,他们的价差会回到原来的水平。所以狭义的统计套利策略是对相关的产品(两个或者多个)进行同步操作,而不是用一个去预测另一个,然后只对某个产品进行操作。一样的,关于你的旺财的例子。旺财撒尿只能做预测因子,严格意义上不属于统计套利的范畴。
回复

使用道具 举报

13

主题

3

回帖

107

积分

专栏作家

积分
107
2020-2-19 20:48:57 显示全部楼层
第一个问题:简单的统计套利就是两个股票的配对交易比如说你某天发现同行业的两家公司例如说游戏板块的星际老男孩公司和09dota公司的股价的差值看上去很稳定,价格的相关性居然达到了惊人的0.9999999,然后又去做了个时间序列检验发现他们价格的时间序列的某个线性组合是个稳定的序列然后价格差又很谐(xie)整,然后你利用ols回归估计出了两个的配比参数beta,建造了一个具有均值回复数学特性的产品。这样就是统计套利的第一步,然后发现价格偏离平均值(一般是zscore的大小)比较多的时候你可以long或者short,等价格差恢复以后你就可以赚钱了第二个问题:统计套利风险还是比较大的,因为你完全不知道价格是否会回去即价格差未必均值回复(即使你找到了所谓经济上的关系)。例如说你建仓买了星际老男孩和09公司的股票想做 statis arb,结果09公司第二年st了,黄旭东说要告证监会不公正对待他公司,结果直接停牌了,你就sb了(斜眼)。结果你想反正我做的是投资组合,一个股票对失败也没关系,然后你又发现你做的中粮集团系列价格差越来越小,亏的要死只能强行平仓等等,然后你的老板就把你干死了
第三个问题:如果做学术可以用日线,如果你真的想去实盘做一下,那估计要精确到至少一分钟扫描一次吧
第四个问题;这不叫统计套利,这叫瞎几把猜,赌赢了是运气好,赌输了才正常
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 免费注册
关注微信