首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用Pandas Data Reader进行Python回归建模

使用Pandas Data Reader进行Python回归建模
EN

Stack Overflow用户
提问于 2018-07-29 07:07:44
回答 2查看 624关注 0票数 1

我正在尝试构建一个函数,该函数将拉取任何股票的数据,然后绘制回归图。然而,我遇到了源数据的问题。我的问题是-如何获取熊猫数据帧中的时间序列,并绘制随时间的线性趋势?我的代码如下:

此代码将生成回归:

代码语言:javascript
复制
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
import numpy as np
rng = np.random.RandomState(1)
x = 10 * rng.rand(50)
y = 2 * x - 5 + rng.randn(50)
plt.scatter(x, y);
plt.show()
from sklearn.linear_model import LinearRegression
model = LinearRegression(fit_intercept=True)

model.fit(x[:, np.newaxis], y)

xfit = np.linspace(0, 10, 1000)
yfit = model.predict(xfit[:, np.newaxis])

plt.scatter(x, y)
plt.plot(xfit, yfit);
plt.show()

这是我尝试通过dataframe传递数据

代码语言:javascript
复制
from datetime import datetime
import pandas_datareader.data as web

start = datetime(2017, 8, 1)
end = datetime(2018, 7, 30)
data_SP = web.DataReader('JPM', 'iex', start, end)

y = dates # not sure how to get here?
plt.scatter(data['close'], y);
plt.show()

from sklearn.linear_model import LinearRegression
model = LinearRegression(fit_intercept=True)

model.fit(data['close'][:, np.newaxis], y)

xfit = np.linspace(0, 10, 1000)
yfit = model.predict(xfit[:, np.newaxis])

plt.scatter(data['close'], y)
plt.plot(xfit, yfit);
plt.show()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-29 07:47:23

回归不能接受datetime对象,必须转换为number类型:

代码语言:javascript
复制
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
import numpy as np
from datetime import datetime
import pandas as pd
pd.core.common.is_list_like = pd.api.types.is_list_like
from sklearn.linear_model import LinearRegression
import pandas_datareader.data as web

start = datetime(2017, 8, 1)
end = datetime(2018, 7, 30)
data_SP = web.DataReader('JPM', 'iex', start, end)

dates = list(map(lambda x: datetime.strptime(x,"%Y-%m-%d"),list(data_SP.index)))
days_since = list(map(lambda x: (x-start).days,dates))

model = LinearRegression(fit_intercept=True)
model.fit(np.array(days_since)[:, np.newaxis],data_SP['close'])

yfit = model.predict(np.array(days_since)[:, np.newaxis])

plt.figure()
plt.scatter(dates, yfit)
plt.scatter(dates, data_SP['close'])
plt.xlabel('date')
plt.ylabel('close')
plt.show()

如果使用百分比更改,则需要考虑NaN。

代码语言:javascript
复制
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
import numpy as np
from datetime import datetime
import pandas as pd
pd.core.common.is_list_like = pd.api.types.is_list_like
from sklearn.linear_model import LinearRegression
import pandas_datareader.data as web

start = datetime(2017, 8, 1)
end = datetime(2018, 7, 30)
data_SP = web.DataReader('JPM', 'iex', start, end)

dates = list(map(lambda x: datetime.strptime(x,"%Y-%m-%d"),list(data_SP.index)))
days_since = list(map(lambda x: (x-start).days,dates))

model = LinearRegression(fit_intercept=True)
model.fit(np.array(days_since)[1:][:, np.newaxis],data_SP['close'].pct_change(1)[1:]) # <------------

yfit = model.predict(np.array(days_since)[:, np.newaxis])

plt.figure()
plt.scatter(dates, yfit)
plt.scatter(dates, data_SP['close'].pct_change(1))
plt.xlabel('date')
plt.ylabel('close')
plt.show()

票数 1
EN

Stack Overflow用户

发布于 2018-07-29 22:10:12

我已经将代码调整为以下内容。它将产生显示超过基准的回报的视觉效果。代码有很多方向可供选择。例如,我们可以让它对标普500指数中的所有500只股票进行循环,找出相对于指数回报最好的股票,或者我们可以让它以1个月的周期循环所有500只股票,并根据历史计算出什么时候持有最好的股票。视觉效果对分析来说是一种很好的触感。

代码语言:javascript
复制
import matplotlib.pyplot as plt
import numpy as np
from datetime import datetime
import pandas
from sklearn.linear_model import LinearRegression
import pandas_datareader.data as pdr

def close_price_trending(analysis):
    model = LinearRegression(fit_intercept=True)
    model.fit(np.array(days_since)[:, np.newaxis],data_sample_processed[analysis])
    yfit = model.predict(np.array(days_since)[:, np.newaxis])
    plt.scatter(dates, data_sample_processed[analysis])
    plt.scatter(dates, yfit)
    plt.xlabel('date')
    plt.ylabel('close')
    plt.show()

def return_excess_benchmark1(analysis, benchmark):
    fig = plt.figure()
    ax = fig.add_subplot(111)
    fig.subplots_adjust(top=0.85)
    ax.set_title(str(analysis) + ' O/U ' + str(benchmark))
    plt.scatter(dates, (1 + data_sample_processed[analysis]).cumprod() - (1 + data_sample_processed[benchmark]).cumprod())
    model = LinearRegression(fit_intercept=True)
    model.fit(np.array(days_since)[:, np.newaxis],(1 + data_sample_processed[analysis]).cumprod() - (1 + data_sample_processed[benchmark]).cumprod())
    yfit = model.predict(np.array(days_since)[:, np.newaxis])
    plt.scatter(dates, yfit)
    plt.xlabel('date')
    plt.ylabel('close')
    fig.show()


# get and process data
start = datetime(2015, 8, 1)
end = datetime(2018, 7, 30)

Symbol_List = ['GSLC', 'AGG', 'JPM','CAR', 'IVV', 'DSI', 'VTI']

data = pandas.concat([pdr.DataReader(s, 'iex', start, end).rename(columns={'close': s})
                      for s in Symbol_List], axis=1)
data_sample = data[Symbol_List]
data_sample_processed = data_sample.pct_change()
data_sample_processed = data_sample_processed.fillna(0)
dates = list(map(lambda x: datetime.strptime(x,"%Y-%m-%d"),list(data_sample_processed.index)))
days_since = list(map(lambda x: (x-start).days,dates))

# start analysis
analysis_symbol_1 = 'DSI'
analysis_symbol_2 = 'GSLC'
benchmark_1 = 'VTI'

return_excess_benchmark1(analysis_symbol_1, benchmark_1)
return_excess_benchmark1(analysis_symbol_2, benchmark_1)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51575927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档