使用pandas和matplotlib在股票数据上进行回归分析

3

我希望在股票图表上绘制Excel所称的“指数趋势/回归”图。当我在IPython笔记本中运行下面的代码时,它只是显示“内核已死亡,您要重新启动吗?”。有什么解决办法吗?此外,这仅仅是尝试进行线性回归,我不太清楚如何对指数数据进行回归。

import datetime
import matplotlib.pyplot as plt
import statsmodels.api as sm
from pandas.io.data import DataReader

sp500 = DataReader("AGG", "yahoo", start=datetime.datetime(2000, 1, 1)) # returns a DataFrame
sp500["regression"] = sm.OLS(sp500["Adj Close"], sp500.index).fit().fittedvalues()
top = plt.subplot2grid((3,1), (0, 0), rowspan=2)
top.plot(sp500.index, sp500["Adj Close"], 'b-', sp500.index, sp500["regression"], 'r-')
bottom = plt.subplot2grid((3,1), (2,0))
bottom.bar(sp500.index, sp500.Volume)
plt.gcf().set_size_inches(18,8)

使用 ipython --pylab 时出现分段错误。 - bmu
至于分段错误(也参见第二个答案):这是由于numpy 1.6.2中的点函数中存在一个错误引起的,该版本添加了日期时间数组,并且仍然存在一些问题。这已在numpy 1.7.0的beta版本中得到修复。我从中得出的信息是,在numpy对这个新特性的支持失去其尖锐的边角之前,我们应该小心地使用日期时间数组。 - Josef
2个回答

9
我重新审视了一下,并意识到我的先前答案不太恰当,因为它没有包括截距。我已经更新了我的答案。
段错误来自于尝试将Datetime索引用作外生变量。而应该尝试使用:
import datetime
import matplotlib.pyplot as plt
import statsmodels.api as sm
import pandas
from pandas.io.data import DataReader

sp500 = DataReader("AGG", "yahoo", start=datetime.datetime(2000, 1, 1)) # returns a DataFrame
sp500["regression"] = sm.OLS(sp500["Adj Close"],
    sm.add_constant(range(len(sp500.index)),
    prepend=True)).fit().fittedvalues

请注意,您无需将statsmodels的fittedvalues作为函数调用。如果您的数据点都是等间隔的,则此模型将与使用实际索引相同的结果。
对于您的第二个问题,pandas具有内置的指数加权移动平均值,您可能需要了解一下:pandas.ewma 这里

欢迎来到StackOverflow!pandas的ewma加1分。 - Andy Hayden
谢谢你的帮助。实际上我需要回归而不是移动平均,如果你有任何想法,请告诉我。 - Ben McCann
我想我弄清楚了第二部分:sp500["regression"] = exp(sm.OLS(log(sp500["Adj Close"]), sm.add_constant(range(len(sp500.index)), prepend=True)).fit().fittedvalues)。 - Ben McCann

1
你需要发布更多信息 - 版本号以及如何构建pandas - 可能会有追踪信息帮助缩小问题范围。我无法在IPython中使用或不使用pylab的64位Linux上复制pandas 0.9.1的段错误。您可能还想将错误报告到github问题而不是堆栈溢出。在那里更容易引起开发人员的注意。

我也无法复制。 - Wes McKinney
我在0.9.1 64位版本中遇到了段错误。 - bmu
我打开了问题[586](https://github.com/statsmodels/statsmodels/issues/586)(我创建了statsmodels标签,所以也许是我的错,它在这里报告;-()。 - bmu
我使用Ubuntu 12.04,并使用pip安装了所有内容。以下是我的版本号:ipython == 0.13.1,numpy == 1.6.2,pandas == 0.9.1,scipy == 0.11.0,statsmodels == 0.5.0,tables == 2.4.0。 - Ben McCann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接