Home >  > 价差套利

价差套利

0

一、策略说明:
这是一个小小的Demo。最好在jupyter notebook下面执行,不然图形无法显示。
在cmd执行时如果提示“ No module named 'statsmodels'”,则直接使用“pip install statsmodels ”安装即可。

二、测试结果:

三、代码

import numpy as np
import pandas as pd
import talib as ta
import matplotlib.pyplot as plt
import rqdatac as rq
rq.init()

leg1_symbol = 'M1609' # Leg1
leg2_symbol = 'M1701' # Leg2
start_date = '20160401'
end_date = '20160830'

# 显示走势图,传入df以及要显示的columns,传入格式为['leg1','leg2'],相当于执行df2=df2[['leg1','leg2']]
def display(df,columns):    
    df2=df.copy()
    df2=df2[columns]
    df2.index  = list(range(len(df)))  #生成数字列表作为df2的索引。
    df2.plot(figsize=[12,8])           #figsize控制图表的大小,因为df2有leg1,leg2,所以生成的图表上有两条线。
    plt.legend()                       #作用就是给图加上图例
    
# 显示两个合约的相关度
def display_coor(df,columns):
    df2 = df.copy()
    df2 = df2[columns]
    corr=df2.corr()
    print(corr)
    
    
# 显示两个合约的协整值,合约配比
def display_ols(df,leg1,leg2):
    import statsmodels.api as sm    # 最小二乘
    
    columns = []
    columns.append(leg1)
    columns.append(leg2)
    df2 = df.copy()
    df2 = df2[columns]
    X=df2[leg1].values   #取出leg1这一列的值,返回的是numpy.ndarray
    y=df2[leg2].values


    model = sm.OLS(y, X)    # 普通最小二乘模型,ordinary least square model
    results = model.fit()   #获取拟合结果
    print(results.summary())
    
    # 查看两个合约的配比
    plt.figure(figsize=[20,8])
    plt.plot(y/X) # 利用 leg2/leg1的价格比率,画出线图。 y/X是numpy.ndarray
    plt.axhline(np.mean(y/X), color="red", linestyle="--")  #axhline绘制平行于x轴的水平参考线
    plt.axhline(np.mean(y/X)+np.std(y/X)*1.5, color="red", linestyle="--")
    plt.axhline(np.mean(y/X)-np.std(y/X)*1.5, color="red", linestyle="--")
    
# 读取2个合约的3四个月内的分钟数据,取到的是pandas.core.series.Series
leg1=rq.get_price(leg1_symbol,start_date=start_date,end_date=end_date,fields='close',frequency='1m') # leg1
leg2=rq.get_price(leg2_symbol,start_date=start_date,end_date=end_date,fields='close',frequency='1m') # leg2


leg1.head()
leg2.tail()


df = leg1.to_frame(name='leg1')   #执行后df的类型变成了pandas.core.frame.DataFrame
df['leg2']=leg2                   #df添中了一列leg2

display(df,['leg1','leg2'])
display_coor(df,['leg1','leg2'])

display_ols(df,'leg1','leg2')

# filename = u'{0}_{1}_{2}_{3}.csv'.format(leg1_symbol,leg2_symbol,start_date,end_date)
# df.to_csv(filename)

四、小知识
1. plt.legend()
plt.legend()函数主要的作用就是给图加上图例,plt.legend([x,y,z])里面的参数使用的是list的的形式将图表的的名称喂给这和函数。
比如,设定["red","Blue"]就会在图表的右上解显示red,blue。

2.corr()
用来刻画二维随机变量两个分量间相互关联程度。

3.Statsmodels
Statsmodels 是 Python 中一个强大的统计分析包,包含了回归分析、时间序列分析、假设检
验等等的功能。Statsmodels 在计量的简便性上是远远不及 Stata 等软件的,但它的优点在于可以与 Python 的其他的任务(如 NumPy、Pandas)有效结合,提高工作效率。
它最常用的就是 OLS(ordinary least square)功能。

4.线性回归
线性回归也被称为最小二乘法回归(Linear Regression, also called Ordinary Least-Squares (OLS) Regression)。它的数学模型是这样的:y = a+ b* x+e

其中,a 被称为常数项或截距;b 被称为模型的回归系数或斜率;e 为误差项。a 和 b 是模型的参数。

当然,模型的参数只能从样本数据中估计出来:y'= a' + b'* x

我们的目标是选择合适的参数,让这一线性模型最好地拟合观测值。拟合程度越高,模型越好。
那么,接下来的问题就是,我们如何判断拟合的质量呢?

代码:

import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm

nsample = 100
x = np.linspace(0, 10, nsample)  #用于产生x1,x2之间的N点行矢量,相邻数据跨度相同。
X = sm.add_constant(x)           #将截距列添加到现有矩阵,在 array 上加入一列常项1
beta = np.array([1, 10])         #系数
e = np.random.normal(size=nsample)  #所谓标准正态分布
y = np.dot(X, beta) + e      #观察值y  np.dot:向量点积

model = sm.OLS(y,X)          #最小二乘法
results = model.fit()        #拟合数据
print(results.params)
print(results.summary())


运行结果

可参考:

https://www.jianshu.com/p/e45558ccf533
https://xueqiu.com/8287840120/75542824

暧昧帖

本文暂无标签

发表评论

*

*