Simple moving average(SMA)
使用最近的50天分析,n=20
import numpy
import talib
import pandas as pd
import numpy as np
import os
import re
import statistics as stats
import csv
import pickle
import matplotlib.pyplot as plt
from math import sqrt
from sklearn.metrics import mean_squared_error
'预测模型:Simple moving average(SMA)简单易懂平均'
'我们把一段时间的价格加起来,除以这段时间的长度就可以得到。'
'简单移动平均的思想是,我们给于每一天同样的权值,'
'因为我们假设不管是离我们当前较近的日期,还是较远的日期,'
'对于我们当前价格的影响都是相同的。当我们的日期不断的往后走,'
'我们的『窗口』也在同时滑动,所以称之为移动平均。'
data = pd.read_csv('mean_mwd.csv',header=0)
df = pd.DataFrame(data)
mwd = df['mwd']
with open("dict_data.pkl", 'wb') as fo:
pickle.dump(df, fo)
with open("dict_data.pkl", 'rb') as fo:
dict_data = pickle.load(fo, encoding='bytes')
a=dict_data.tail(492)
close=a['mwd']
time_period = 100
history = []
sma_values = []
for close_price in close:
history.append(close_price)
if len(history) > time_period:
del (history[0])
sma_values.append(stats.mean(history))
a = a.assign(our_mwd=pd.Series(close, index=a.index))
a = a.assign(Simple20DayMovingAverage=pd.Series(sma_values, index=a.index))
close_price = a['our_mwd']
sma = a['Simple20DayMovingAverage']
rmse = sqrt(mean_squared_error(mwd, sma))
print('Test RMSE: %.3f' % rmse)
fig = plt.figure()
ax1 = fig.add_subplot(111, ylabel='height')
close_price.plot(ax=ax1, color='g', lw=2., legend=True)
sma.plot(ax=ax1, color='r', lw=2., legend=True)
plt.show()
朴素法Naive Forecast
'''
如果数据集在一段时间内都很稳定,
我们想预测第二天的价格,可以取前面一天的价格,预测第二天的值。
这种假设第一个预测点和上一个观察点相等的预测方法就叫朴素预测法(Naive Forecast)
'''
import pandas as pd
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from math import sqrt
from sklearn.metrics import mean_squared_error
from statsmodels.tsa.holtwinters import ExponentialSmoothing
train=pd.read_csv('mean_mwd.csv')
train['time'] = pd.to_datetime(train.time, format='%Y-%m-%d-%H-%M')
Train = train.loc[:390]
valid = train.loc[390:]
dd = np.asarray(Train.mwd)
y_hat = valid.copy()
y_hat['naive'] = dd[len(dd)-1]
plt.plot(Train.index, Train['mwd'], label ='Train')
plt.plot(valid.index,valid['mwd'], label='Valid')
plt.plot(y_hat.index,y_hat['naive'], label='Naive Forecast')
rmse = sqrt(mean_squared_error(valid.mwd, y_hat.naive))
print('Test RMSE: %.3f' % rmse)
plt.show()
'''
霍尔特-温特(Holt-Winters)方法
在 Holt模型基础上引入了 Winters 周期项(也叫做季节项),
可以用来处理月度数据(周期 12)、季度数据(周期 4)、星期数据(周期 7)等时间序列中的固定周期的波动行为。
引入多个 Winters 项还可以处理多种周期并存的情况。
'''
y_hat_avg = valid.copy()
fit1=ExponentialSmoothing(np.asarray(Train['mwd']),seasonal_periods=7,trend='add',seasonal='add',).fit()
y_hat_avg['Holts_Winter'] = fit1.forecast(len(valid))
plt.plot( Train['mwd'], label='Train')
plt.plot(valid['mwd'], label='Valid')
plt.plot(y_hat_avg['Holts_Winter'], label='Holt_Winter')
rms = sqrt(mean_squared_error(valid.mwd, y_hat_avg.Holts_Winter))
print('Test RMSE: %.3f' % rmse)
plt.show()
蓝色部分为训练集数据,橙色部分为测试集部分。绿色的那条线就是这个朴素模型预测的结果
霍尔特-温特(Holt-Winters)
'''
霍尔特-温特(Holt-Winters)方法
在 Holt模型基础上引入了 Winters 周期项(也叫做季节项),
可以用来处理月度数据(周期 12)、季度数据(周期 4)、星期数据(周期 7)等时间序列中的固定周期的波动行为。
引入多个 Winters 项还可以处理多种周期并存的情况。
'''
import pandas as pd
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from math import sqrt
from sklearn.metrics import mean_squared_error
from statsmodels.tsa.holtwinters import ExponentialSmoothing
train=pd.read_csv('mean_mwd.csv')
train['time'] = pd.to_datetime(train.time, format='%Y-%m-%d-%H-%M')
Train = train.loc[:390]
valid = train.loc[390:]
y_hat_avg = valid.copy()
fit1=ExponentialSmoothing(np.asarray(Train['mwd']),seasonal_periods=7,trend='add',seasonal='add',).fit()
y_hat_avg['Holts_Winter'] = fit1.forecast(len(valid))
plt.plot( Train['mwd'], label='Train')
plt.plot(valid['mwd'], label='Valid')
plt.plot(y_hat_avg['Holts_Winter'], label='Holt_Winter')
rmse = sqrt(mean_squared_error(valid.mwd, y_hat_avg.Holts_Winter))
print('Test RMSE: %.3f' % rmse)
plt.show()
|