python - 如何绘制标准偏差误差线?
问题描述
使用 scipy 我可以绘制标准偏差线。我如何复制同一行 95% 以上和另一行 95% 以下。
请参阅下面的两张图片,了解我的意思:
我的代码:
import datetime as date
import matplotlib.pyplot as plt
%matplotlib inline
import datetime
from scipy import stats
Ins_Name = "EURUSD=X"
#Ins_Name = "AAPL"
df = yf.download(Ins_Name,'2019-05-01','2020-01-03')
df.reset_index(inplace=True)
df['date_ordinal'] = pd.to_datetime(df['Date']).apply(lambda date: date.toordinal())
DateVariance = [datetime.date(2019, 5, 1), datetime.date(2020, 1, 3)]
x_reg = df.date_ordinal
y_reg = df.Close
slope, intercept, r_value, p_value, std_err = stats.linregress(x_reg, y_reg)
print("slope: %f intercept: %f STD Error: %f" % (slope, intercept, std_err))
sns.set()
#plt.figure(figsize=(26, 10))
fig, ax = plt.subplots(figsize=(15,7))
ax = plt.plot(x_reg,intercept + slope*x_reg, color='b')
#ax = sns.lmplot('date_ordinal', 'Close', data=df, fit_reg=True, aspect=2, ) #Scatter PLot
ax = sns.regplot(data=df,x='date_ordinal',y=df.Close,ci=1,fit_reg=False,scatter_kws={"color": "red"}, line_kws={"color": "black"}, marker='x') #scatterplot
#sns.jointplot('date_ordinal', df.Close, data=df, kind="reg",ylim=[1.089,1.15],xlim=DateVariance, height=12,color='red',scatter_kws={"color": "red"}, line_kws={"color": "black"})
ax.set_xlabel('Interval', fontsize=25)
ax.set_xlim(DateVariance)
ax.set_ylabel('Price', fontsize=25)
ax.set_title('Mean reversion of ' + Ins_Name + ' Close Prices',fontsize= 45,color='black')
new_labels = [datetime.date.fromordinal(int(item)) for item in ax.get_xticks()]
ax.set_xticklabels(new_labels)
解决方案
我认为该功能stats.linregress()
不是您想要的。它只返回斜率的不确定性而不是 y 截距,如果我理解你的问题,这就是你想要的。
我会使用scipy.optimize.curve_fit()
如下:
import datetime as date
import matplotlib.pyplot as plt
import datetime
from scipy.optimize import curve_fit
import yfinance as yf
import pandas as pd
import numpy as np
import seaborn as sns
def fline(x, *par):
return par[0] + par[1]*x
Ins_Name = "EURUSD=X"
#Ins_Name = "AAPL"
df = yf.download(Ins_Name,'2019-05-01','2020-01-03')
df.reset_index(inplace=True)
df['date_ordinal'] = pd.to_datetime(df['Date']).apply(lambda date: date.toordinal())
DateVariance = [datetime.date(2019, 5, 1), datetime.date(2020, 1, 3)]
x_reg = df.date_ordinal
x_trans = x_reg - x_reg[0]
y_reg = df.Close
pi = [1.1, -0.0001] # initial guess. Could use linregress to get these values
# Perform curve fitting here
popt, cov = curve_fit(fline, x_trans, y_reg, p0=pi) # returns the values and the covariance (error) matrix
yInterceptSigma = np.sqrt(cov[0,0])
print(x_reg)
print(x_reg - x_reg[0])
print(popt)
print(cov)
sns.set()
#plt.figure(figsize=(26, 10))
fig, ax = plt.subplots(figsize=(15,7))
ax = plt.plot(x_reg, fline(x_trans, *popt), color='b')
# +/- 2sigma gives ~95% CI
plt.plot(x_reg, fline(x_trans, *[popt[0] + 2 * yInterceptSigma, popt[1]]), '--b') # +2sigma on the yintercept
plt.plot(x_reg, fline(x_trans, *[popt[0] - 2 * yInterceptSigma, popt[1]]), '--b') # -2sigma on teh yintercept
#ax = sns.lmplot('date_ordinal', 'Close', data=df, fit_reg=True, aspect=2, ) #Scatter PLot
ax = sns.regplot(data=df,x='date_ordinal',y=df.Close,ci=1,fit_reg=False,scatter_kws={"color": "red"}, line_kws={"color": "black"}, marker='x') #scatterplot
#sns.jointplot('date_ordinal', df.Close, data=df, kind="reg",ylim=[1.089,1.15],xlim=DateVariance, height=12,color='red',scatter_kws={"color": "red"}, line_kws={"color": "black"})
ax.set_xlabel('Interval', fontsize=25)
ax.set_xlim(DateVariance)
ax.set_ylabel('Price', fontsize=25)
ax.set_title('Mean reversion of ' + Ins_Name + ' Close Prices',fontsize= 45,color='black')
new_labels = [datetime.date.fromordinal(int(item)) for item in ax.get_xticks()]
ax.set_xticklabels(new_labels)
plt.show()
推荐阅读
- c# - 添加到带有 TDD 的单元测试的私有列表
- java - 在后台更新 JavaFX 窗口
- gradle - gradle 什么时候存储在 .m2 中,什么时候存储在缓存中?
- javascript - 将网络工作者排序到一个数组中(供以后使用)
- styled-components - 组件中的三元运算符将道具传递给样式组件?
- node.js - 护照js'缺少凭据'
- java - 根据他们的分数和他们的名字对备选方案进行排名
- python - 如何使用 Matplotlib 制作具有光晕效果的散点图?
- javascript - 我的倒数计时器不工作
- amazon-web-services - DynamoDB:我的用例的最佳哈希/排序键 [与 AppSync/GraphQL 混淆]