阿尔法& beta(用于线性回归)计算输出nan?

时间:2016-08-26 00:03:14

标签: python pandas numpy linear-regression

我是Python的新手并且一直在尝试计算两种证券的线性回归/ Beta / Alpha,但是我的代码输出的是Beta和& Alpha,因此我无法绘制回归线。

这是有问题的代码:

#calculate linear regression
beta_yPlt, alpha_yPlt = np.polyfit(xPlt, yPlt, 1)  # fit poly degree 1
print "Y Beta", beta_yPlt
print "Y Alpha", alpha_yPlt
plt.plot(xPlt, beta_yPlt * xPlt + alpha_yPlt, '-', color='red')

这是完整的脚本:

from pandas.io.data import DataReader
from datetime import datetime
import matplotlib.pyplot as plt
import numpy as np

#inputs
symbols   = ['EUR=X', 'JPY=X']
startDate = datetime(2011,1,1)
endDate   = datetime(2016,12,31)

#get data from yahoo
instrument = DataReader(symbols, 'yahoo', startDate, endDate)
#isolate column
close = instrument['Adj Close']

#calculate daily returns
def compute_daily_returns(df):
    daily_returns = (df / df.shift(1)) - 1
    return daily_returns

dlyRtns = compute_daily_returns(close)
xPlt = dlyRtns[symbols[0]]
yPlt = dlyRtns[symbols[1]]

#draw "scatter plot" - using "o" workaround
dlyRtns.plot(x=symbols[0], y=symbols[1], marker='o', linewidth=0)

#calculate linear regression
beta_yPlt, alpha_yPlt = np.polyfit(xPlt, yPlt, 1)  # fit poly degree 1
print "Y Beta", beta_yPlt
print "Y Alpha", alpha_yPlt
plt.plot(xPlt, beta_yPlt * xPlt + alpha_yPlt, '-', color='red')

# Calculate correlation coefficient
print "Correlation", dlyRtns.corr(method='pearson')
plt.show()

这是输出:

C:\Python27\python.exe C:/Users/Us/Desktop/untitled3/scatterPlot.py
Y Beta nan
Y Alpha nan
Correlation           EUR=X     JPY=X
EUR=X  1.000000  0.228223
JPY=X  0.228223  1.000000

Process finished with exit code 0

为什么我在这里找到南?我很茫然,非常感谢任何帮助。

3 个答案:

答案 0 :(得分:0)

试着调查一下,但这对我来说有点混乱。另外,我无法在当前机器上重现yahoo的数据提取,所以我无法按原样运行你的代码。

这里有几个问题和想法:

  • 您不应该命名变量xPlt,因为Python使用了这个词。有时候(如你的例子中)它仍然适用,但这不是一种好的做法。
  • 您是否可以单独绘制数据yPltDataReader,而无需其他任何内容?我怀疑错误就在那里。
  • 使用两个值的数组调用instrument并将输出保存在close中。然后你将一列(按名称选择)分配给Adj close,但事实上,会有两列名为print,对吧?

简而言之:您应该尝试逐步构建代码,在每个步骤后添加一些plotNSObject命令,以查看变量中保存的数据的方式看起来像。

答案 1 :(得分:0)

我无法检索数据。

我最好的猜测:检索到的数据中有nan个或重复点。

答案 2 :(得分:0)

def compute_daily_returns(df):
    daily_returns = (df / df.shift(1)) - 1
    daily_returns.ix[0, :] = 0  
    return daily_returns

添加daily_returns.ix[0, :] = 0解决了问题,感谢Nickil Maveli