Numpy.diff 问题和 Python 中的 numpy.cov 问题
Numpy.diff problem and numpy.cov problem in Python
from matplotlib.finance import quotes_historical_yahoo_ochl as getData
import scipy as sp
ticker='IBM'
begdate=(2013,9,1)
enddate=(2013,11,11)
data= getData(ticker, begdate, enddate,asobject=True, adjusted=True)
p=data.aclose
d=sp.diff(p)
cov_=sp.cov(d[:-1],d[1:])
if cov_[0,1]<0:
print("Roll spread for ", ticker, 'is', round(2*sp.sqrt(-cov_[0,1]),3))
else:
print("Cov is positive for ",ticker, 'positive', round(cov_[0,1],3))
我的努力是在 Python 中计算上述代码,但由于 matplotlib.finance 已被弃用,我尝试了另一条使用 pandas_datareader.data.
的道路
这样做我做了这个:
import pandas_datareader.data as web
end = '2013-11-11'
start = '2013-09-01'
get_px = lambda x: web.DataReader(x, 'yahoo', start=start, end=end)['Adj Close']
symbols = ['IBM']
data = pd.DataFrame({sym:get_px(sym) for sym in symbols})
data = data.rename({'IBM': 'Adj Close'}, axis=1)
p1 = data.dropna()
p = np.asarray(p1);p
d = np.diff(p);d
cov_= np.cov(d[:-1],d[1:])
cov_
我收到一条错误消息
/opt/anaconda3/lib/python3.8/site-packages/numpy/lib/function_base.py:380: RuntimeWarning: Mean of empty slice.
avg = a.mean(axis)
RuntimeWarning: Mean of empty slice.
if cov_[0,1]<0:
print("Roll spread for ", symbols, 'is', round(2*sp.sqrt(-cov_[0,1]),3))
else:
print("Cov is positive for ",symbols, 'positive', round(cov_[0,1],3)
我的错误是什么?
我不知道在第一个代码中数据对象是什么类型的对象 is.And 可能是问题开始的地方。
已更新
线路代码
d = np.diff(p);d
是empty.The结果是:
array([], shape=(50, 0), dtype=float64)
需要的结果是 1.136
使用你的代码,p
的形状是错误的:
p.shape
Out[8]: (50, 1)
当您将 np.diff()
应用于此时,它会在每个条目上应用差异,而不是像您预期的那样跨向量应用差异,因此会出现错误。
你可以这样做:
p = p1['Adj Close'].ravel()
d = np.diff(p)
cov_= np.cov(d[:-1],d[1:])
cov_
array([[ 3.12100146, -0.15854027],
[-0.15854027, 3.20098506]])
不太确定你是如何定义滚动的,我认为:
np.sqrt(abs(cov_))
array([[1.76663563, 0.39817116],
[0.39817116, 1.78912969]])
你需要得到1.766的是:
np.sqrt(abs(cov_))[0,0]
from matplotlib.finance import quotes_historical_yahoo_ochl as getData
import scipy as sp
ticker='IBM'
begdate=(2013,9,1)
enddate=(2013,11,11)
data= getData(ticker, begdate, enddate,asobject=True, adjusted=True)
p=data.aclose
d=sp.diff(p)
cov_=sp.cov(d[:-1],d[1:])
if cov_[0,1]<0:
print("Roll spread for ", ticker, 'is', round(2*sp.sqrt(-cov_[0,1]),3))
else:
print("Cov is positive for ",ticker, 'positive', round(cov_[0,1],3))
我的努力是在 Python 中计算上述代码,但由于 matplotlib.finance 已被弃用,我尝试了另一条使用 pandas_datareader.data.
的道路这样做我做了这个:
import pandas_datareader.data as web
end = '2013-11-11'
start = '2013-09-01'
get_px = lambda x: web.DataReader(x, 'yahoo', start=start, end=end)['Adj Close']
symbols = ['IBM']
data = pd.DataFrame({sym:get_px(sym) for sym in symbols})
data = data.rename({'IBM': 'Adj Close'}, axis=1)
p1 = data.dropna()
p = np.asarray(p1);p
d = np.diff(p);d
cov_= np.cov(d[:-1],d[1:])
cov_
我收到一条错误消息
/opt/anaconda3/lib/python3.8/site-packages/numpy/lib/function_base.py:380: RuntimeWarning: Mean of empty slice.
avg = a.mean(axis)
RuntimeWarning: Mean of empty slice.
if cov_[0,1]<0:
print("Roll spread for ", symbols, 'is', round(2*sp.sqrt(-cov_[0,1]),3))
else:
print("Cov is positive for ",symbols, 'positive', round(cov_[0,1],3)
我的错误是什么? 我不知道在第一个代码中数据对象是什么类型的对象 is.And 可能是问题开始的地方。
已更新
线路代码
d = np.diff(p);d
是empty.The结果是:
array([], shape=(50, 0), dtype=float64)
需要的结果是 1.136
使用你的代码,p
的形状是错误的:
p.shape
Out[8]: (50, 1)
当您将 np.diff()
应用于此时,它会在每个条目上应用差异,而不是像您预期的那样跨向量应用差异,因此会出现错误。
你可以这样做:
p = p1['Adj Close'].ravel()
d = np.diff(p)
cov_= np.cov(d[:-1],d[1:])
cov_
array([[ 3.12100146, -0.15854027],
[-0.15854027, 3.20098506]])
不太确定你是如何定义滚动的,我认为:
np.sqrt(abs(cov_))
array([[1.76663563, 0.39817116],
[0.39817116, 1.78912969]])
你需要得到1.766的是:
np.sqrt(abs(cov_))[0,0]