量化金融投资及其python应用,基于python的量化投资
统计套期保值需要的基础知识之前也整理过:
时间序列分析的ADF检验
时间序列分析的协整检验
时间序列分析的相关性
使用python实现简单的配对交易策略:
目录
一、交易对手的选择
相关检查
ADF检查
协整检验
二。主要策略
投资组合的构建
设置开仓和止损的阈值。
三。历史评论
四。注意力
1.交易对手以我们在商品期货市场进行螺纹钢品种的跨期套期保值为例,选择两组期限不同的同类商品期货合约作为交易对手。
相关性测试是通过新浪财经的期货数据接口抓取螺纹钢rb1903到rb1908的数据。我们先来看看他们的动向。
importpandas aspdimportnumpyasnpimportmatplotlib . pyplotaspltimportsabornassnimporturllib . requestasurlib 2 importjsondefinnnndefintplib Rb 1904 、 rb1905 、 rb1906 、 rb1907 、 Rb 1908 ] URL _ 5m= http://stock2。finance symbol= result=[]for idinids 3360 URL=URL _ 5 mid req=URL lib 2。request(URL)RSP=URL lib 2 . URL open)req)RES=RES _ JSON=JSON . loade for instrument result 3360 one day in instrument 3360 one day _ list . append(float(one day(-2)))close _ ray close _ result=close _ result。TDF=PD . data frame(data=close _ result,columns=ids ) df.plot ) (plt.show)
从价格走势图可以看出,rb1903和rb1904、rb1908和rb1907的走势具有很强的相关性。它们之间的相关矩阵如下。
SNS.heatmap(df.corr),不能
=True,square=True) plt.show()
根据我们的推断,rb1903和rb1904、rb1908和rb1907之间有很强的相关性,其中rb1907和rb1908的相关性最大,所以下面我们将选择rb1907和rb1908作为配对交易。
ADF检验:下面检验这两组数据的平稳性。
从statsmodels.tsa.stattools导入adfullerdef check():df=PD . read _ CSV(。/data . CSV )price _ A=df[ Rb 1907 ]。值price_B=df[rb1908]。values result _ a=ad fuller(price _ a)result _ b=ad fuller(price _ b)print(result _ a)print(result _ b)结果如下:
(-1.7605803524947852,0.4002005032657946,3,238,{1%: -3.458128284586202, 5% :-2.8737763761835239,286, 10% :-2.57372835 }、1756.
一阶差分后检查:
def check(): df=pd.read_csv(。/data . CSV )price _ A=df[ Rb 1907 ]。值price_B=df[rb1908]。values Price _ A=NP . diff(Price _ A)Price _ b=NP . diff(Price _ b)result _ A=ad fuller(Price _ A)result _ b=ad fuller(Price _ b)print(result _ A)print(result _ b)结果如下:
(-7.519664365222082,3.820429924735319e-11,2,238,{1%: -3.458128284586202, 5%: -2.873761835239286, 10% :-2.57328359706235 },1744因此,下一步,我们对这两组数据进行协整检验,看它们是否协整。
来自statsmodels.tsa.stattools的协整检验导入coindef check (): df=pd.read _ csv(。/data . CSV )price _ a=df[ Rb 1907 ]。Values price _ b=df[ Rb 1908 ]Values Print(Coint(price _ a,price _ b)) (-3.610438717208277,0.02372384906601,array([-3.9424646081,-3.3616059,-3.366685 . 59096
二、主力策略下面将构建一个匹配的交易策略。统计套利的关键是保证策略的市场中性。也就是说,不管市场趋势是涨是跌,都要做策略或者预期收益。
投资组合构造配对交易的主要分析对象是两个品种价格之间的偏离。根据均值回归理论,在股票、期货或其他金融衍生品的交易市场中,无论是高于还是低于价值中枢(或均值),都有很大概率会回到价值中枢。因此,在存在协整关系的两组数据中,当它们之间的价格差较高且为均值时,会趋于走低,当价格差低于均值时,会趋于走高。
得到下面的分散差价序列:
def strategy(): df=pd.read_csv(。/data . CSV )price _ A=df[ Rb 1907 ]。值price_B=df[rb1908]。values spread=price _ A-price _ B mspread=spread-NP . mean(spread)fig=PLT . figure()ax=fig . add _ subplot(111)ax . plot(range(len(mspread))、mspread) ax.hlines(0,0,len(mspread)) plt.show()
注意,这里直接研究的是A和B的价差,在统计套利策略中,B的价格通常乘以一个协整系数,研究对象是它们的残差。由于协整检验表明它们的残差是稳定的,因此更适合应用均值回归理论。
设置开仓和止损的阈值为了更好的比较开仓和止损的阈值,开仓阈值设置为窗口内数据标准差的两倍,止损设置为标准差的三倍。这个标准差的倍数可以通过调整参数不断优化,标准差的设定也可以用类似GARCH等模型拟合的自回归异方差的时变标准差来代替。
def strategy(): df=pd.read_csv(。/data . CSV )price _ A=df[ Rb 1907 ]。值price_B=df[rb1908]。values spread=price _ A-price _ B mspread=spread-NP . mean(spread)sigma=NP . STD(mspread)fig=PLT . figure()ax=fig . add _ subplot(111)ax . plot(range(len(mspread)),mspread) ax.hlines(0,0,len(mspread)) ax.hlines(2 * sigma,0,len(mspread),colors=b) ax.hlines(-2 * sigma,0,len(mspread),colors=b )
三。历史回溯测试。这里有一个样本内数据的回测:
def strategy(): df=pd.read_csv( ./数据。CSV )price _ A=df[ Rb 1907 ].值price_B=df[rb1908].值spread=price _ A-price _ B mspread=spread-NP。平均(扩散)=NP。STD(mspread)open=2 * sigma stop=3 * sigma profit _ list=[]hold=False hold _ price _ A=0 hold _ price _ B=0 hold _ state=0 # 1(A:long B:short)-1(A:short B:long)profit _ sum=0 for I in range(len(price _ A)):if hold==False:if mspread[I]=open:hold _ price _ A=1 hold _ price _ B=price _ B[I]hold _ state=1 hold=True else:if mspread[I]=stop and hold _ state===-1:profit=(hold _ price _ A-price _ A[I])(price _ B[I]-hold _ price _ B利润==1:利润=(price _ A[I]-hold _ price _ A)(hold _ price _ B-price _ B[I])利润_总和=利润hold _ state=0 hold=False如果mspread[I]=0且hold _ state==1:profit=(price _ A[I]-hold _ price _ A)(hold _ price _ B-price _ B[I])profit _ sum=利润hold _ state=0 hold=False profit _ list。 追加(利润总额)打印(利润列表)fig=PLT。图()ax=图add _ subplot(111)ax。plot(range(len(profit _ list))、profit _ list)。收益结果如下:
可以看出回测结果是很不尽人意的,因为我们并没有对参数进行调优,从前面可以知道统计套利单次的收益是比较薄弱的,主要原因不仅仅是价差带来的这种相对收益本来就比较低,还有就是止损阈值设置的问题,有时一次止损就会涉及掉之前所有的收益。所以说在统计套利中,阈值的设置是非常重要的。
四、注意1、为了方便操作,以上实验的策略构建以及历史回测都是样本内进行测试的,真正的策略回测要划分训练数据和测试数据,进行样本外测试。
2、在选择配对数据的品种时,除了要考虑配对品种的相关性之外,还要考虑品种的市场流动性等因素。
3、历史回测时,还需要将手续费、滑点等因素考虑进去。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。