代码拉取完成,页面将自动刷新
同步操作将从 闻香茶主/Python2024 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
print?
%matplotlib inline
import tensorflow as tf
import pandas as pd
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
# 支持中文
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
from numpy import array
from sklearn import metrics
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense,LSTM,Bidirectional
from numpy.random import seed
np.__path__
# 确保结果尽可能重现
seed(1)
tf.random.set_seed(1)
# 设置相关参数
n_timestamp = 5 # 时间戳
n_epochs = 30 # 训练轮数
# ====================================
# 选择模型:
# 1: 单层 LSTM
# 2: 多层 LSTM
# 3: 双向 LSTM
# ====================================
model_type = 1
# 导入tushare
import tushare as ts
#pro=ts.get_hist_data('603722')
help(ts.pro_api)
# 初始化pro接口
pro = ts.pro_api('66f88ebe33ca20ebed66ba99509f7607b6a05f1e64f51454e3d4021c')
# 拉取数据
data = pro.daily(**{
"ts_code": '603722.SH',
"trade_date": "",
"start_date": "2017-10-1",
"end_date": "",
"offset": "",
"limit": ""
}, fields=[
"trade_date",
"open",
"close",
"high",
"low",
"vol",
"ts_code"
])
print(data)
data.to_csv("stock603722.csv")
data=pd.read_csv("./stock603722.csv",parse_dates=["trade_date"],index_col="trade_date")[["open","high","low","close"]]
# data=pd.read_csv("./stock688333.csv",parse_dates=["trade_date"])[["trade_date","open","high","low","close","vol"]]
data
mydata=pd.read_csv("./stock603722.csv")[["open","high","low","close"]]
plt.plot(mydata)
注意:把pandas数据逆序,需要把数据导出到numpy再赋值,否则不改变原来数据的内容
myindex=range(1268)
mydata.loc[:]=mydata.iloc[::-1].to_numpy()
mydata[:2]
# 获取股价数据
import pandas as pd
import numpy as np
# import akshare as ak
df3 = data.reset_index().iloc[-30:, :6] # 取过去30天数据
df3 = df3.dropna(how='any').reset_index(drop=True) #去除空值且从零开始编号索引
df3 = df3.sort_values(by='trade_date', ascending=True)
print(df3.info())
# 均线数据
df3['5'] = df3.close.rolling(5).mean()
df3['10'] = df3.close.rolling(10).mean()
df3.tail()
import matplotlib
matplotlib.style.use('ggplot') #用于调整图标样式,可选
import matplotlib.pyplot as plt
from mplfinance.original_flavor import candlestick2_ohlc
from matplotlib.ticker import FormatStrFormatter
fig, ax = plt.subplots(1, 1, figsize=(8,3), dpi=200)
candlestick2_ohlc(ax,
opens = df3[ 'open'].values,
highs = df3['high'].values,
lows = df3[ 'low'].values,
closes = df3['close'].values,
width=0.5, colorup="r",colordown="g")
# 显示最高点和最低点
ax.text( df3.high.idxmax(), df3.high.max(), s =df3.high.max(), fontsize=8)
ax.text( df3.high.idxmin(), df3.high.min()-2, s = df3.high.min(), fontsize=8)
ax.set_facecolor("white")
ax.set_title("阿科力")
# 画均线
plt.plot(df3['5'].values, alpha = 0.5, label='MA5')
plt.plot(df3['10'].values, alpha = 0.5, label='MA10')
ax.legend(facecolor='white', edgecolor='white', fontsize=6)
# 修改x轴坐标
plt.xticks(ticks = np.arange(0,len(df3)), labels = df3.trade_date.dt.strftime('%Y-%m-%d').to_numpy() )
plt.xticks(rotation=90, size=8)
# 修改y轴坐标
ax.yaxis.set_major_formatter(FormatStrFormatter('%.2f'))
plt.show()
#from matplotlib.dates import date2num
#data['date']=date2num(data.index.to_pydatetime())
#data=data.sort_values(by="date",ascending=True)
data
# 获取股价数据
import pandas as pd
import numpy as np
df3 = data.reset_index().iloc[:,:] #取过去30天数据
df3 = df3.dropna(how='any').reset_index(drop=True) #去除空值且从零开始编号索引
print(df3)
df3 = df3.sort_values(by='trade_date', ascending=True)
print(df3.info())
# 均线数据
df3['5'] = df3.close.rolling(5).mean()
df3['10'] = df3.close.rolling(10).mean()
df3['30']=df3.close.rolling(30).mean()
df3
import matplotlib
matplotlib.style.use('ggplot') #用于调整图标样式,可选
import matplotlib.pyplot as plt
from mplfinance.original_flavor import candlestick2_ohlc
from matplotlib.ticker import FormatStrFormatter
fig, ax = plt.subplots(1, 1, figsize=(8,3), dpi=200)
candlestick2_ohlc(ax,
opens = df3[ 'open'].values,
highs = df3['high'].values,
lows = df3[ 'low'].values,
closes = df3['close'].values,
width=0.5, colorup="r",colordown="g")
# 显示最高点和最低点
ax.text( df3.high.idxmax(), df3.high.max(), s =df3.high.max(), fontsize=8)
ax.text( df3.high.idxmin(), df3.high.min()-2, s = df3.high.min(), fontsize=8)
ax.set_facecolor("white")
ax.set_title("阿科力")
# 画均线
plt.plot(df3['5'].values, alpha = 0.5, label='MA5')
plt.plot(df3['10'].values, alpha = 0.5, label='MA10')
plt.plot(df3['30'].values,alpha=0.5, label='MA30')
ax.legend(facecolor='white', edgecolor='white', fontsize=6)
# 修改x轴坐标
tempXticks=np.arange(0,len(df3))
#XticksData=data.asfreq("2M").dropna()
nameXticks = df3.trade_date.dt.strftime('%Y-%m-%d').to_numpy()
plt.xticks(ticks =tempXticks , labels =nameXticks )
plt.xticks(rotation=45, size=8)
#修改X轴间隔
x_major_locator=plt.MultipleLocator(100)
ax.xaxis.set_major_locator(x_major_locator)
ax.spines['bottom'].set_color('red')
ax.spines['left'].set_color('red')
plt.xlim(0,1100)
# 修改y轴坐标
ax.yaxis.set_major_formatter(FormatStrFormatter('%.2f'))
plt.show()
a=np.linspace(0,round(len(df3),0),10,dtype=int).tolist()
b=df3.trade_date.dt.strftime('%Y-%m-%d').to_numpy()
c=data.asfreq("2M").dropna()
#c.dropna().index
cc=c.index.strftime('%Y-%m-%d').to_numpy()
e=df3.trade_date.tolist()
#f=[e[i] for i in cc]
cc
# data1=pd.DataFrame(data,columns=["trade_date","close"])
#data1=pd.DataFrame(data,columns=["close"])
data1=data.iloc[::-1]
data1["open"].plot(label="open")
data1["close"].plot(label="close")
plt.legend()
plt.show()
ddd=[]
for item in data1.items():
ddd.append(item)
ind=ddd[0][1].values
da1=ddd[1][1].values
index1=[]
data2=[]
for item in ind:
index1.append(item)
index1.reverse()
for item in da1:
data2.append(item)
data2.reverse()
data1={'trade_date':index1,'close':data2}
stockdata=pd.DataFrame(data1)
stockdata.items
df3.iloc[0:3000,1:3].values[:,1]
from matplotlib.dates import date2num
date2num(df3.trade_date.values)
df3['date']=date2num(df3.trade_date.values)
#df3=df3.sort_values(by="date",ascending=True)
#df3=df3[['date','open', 'high', 'low', 'close']]
ind=np.arange(0,3000)
dataf1=df3[['date','open', 'high', 'low', 'close']]
dataf1.set_index("date")
#
#拟合开始
#
training_set = dataf1.iloc[0:512, 4:5].to_numpy()#要提取一列数据,否则会出错
test_set = dataf1.iloc[973 - 300:, 4:5].to_numpy()
print(training_set)
#将数据归一化,范围是0到1
sc = MinMaxScaler(feature_range=(0, 1))
training_set_scaled = sc.fit_transform(training_set)
testing_set_scaled = sc.transform(test_set)
# 取前 n_timestamp 天的数据为 X;n_timestamp+1天数据为 Y。
def data_split(sequence, n_timestamp):
X = []
y = []
for i in range(len(sequence)):
end_ix = i + n_timestamp
if end_ix > len(sequence)-1:
break
seq_x, seq_y = sequence[i:end_ix], sequence[end_ix]
X.append(seq_x)
y.append(seq_y)
return array(X), array(y)
X_train, y_train = data_split(training_set_scaled, n_timestamp)
X_train = X_train.reshape(X_train.shape[0], X_train.shape[1], 1)
X_test, y_test = data_split(testing_set_scaled, n_timestamp)
X_test = X_test.reshape(X_test.shape[0], X_test.shape[1], 1)
#五、构建模型
# 建构 LSTM模型
model_type=3
if model_type == 1:
# 单层 LSTM
model = Sequential()
model.add(LSTM(units=50, activation='relu',
input_shape=(X_train.shape[1], 1)))
model.add(Dense(units=1))
if model_type == 2:
# 多层 LSTM
model = Sequential()
model.add(LSTM(units=50, activation='relu', return_sequences=True,
input_shape=(X_train.shape[1], 1)))
model.add(LSTM(units=50, activation='relu'))
model.add(Dense(1))
if model_type == 3:
# 双向 LSTM
model = Sequential()
model.add(Bidirectional(LSTM(50, activation='relu'),
input_shape=(X_train.shape[1], 1)))
model.add(Dense(1))
model.summary() # 输出模型结构
model.compile(optimizer=tf.keras.optimizers.Adam(0.001),
loss='mean_squared_error') # 损失函数用均方误差
#七、训练模型
history = model.fit(X_train, y_train,
batch_size=64,
epochs=n_epochs,
validation_data=(X_test, y_test),
validation_freq=1) # 测试的epoch间隔数
model.summary()
plt.plot(history.history['loss'], label='Training Loss')
plt.plot(history.history['val_loss'], label='Validation Loss')
#plt.title('Training and Validation Loss')
plt.legend()
plt.show()
predicted_stock_price = model.predict(
X_test) # 测试集输入模型进行预测
predicted_stock_price = sc.inverse_transform(
predicted_stock_price) # 对预测数据还原---从(0,1)反归一化到原始范围
real_stock_price = sc.inverse_transform(y_test) # 对真实数据还原---从(0,1)反归一化到原始范围
# 画出真实数据和预测数据的对比曲线
plt.plot(real_stock_price, color='red', label='Stock Price')
plt.plot(predicted_stock_price, color='blue', label='Predicted Stock Price')
plt.title('阿科力')
plt.xlabel('Time')
plt.ylabel('Stock Price')
plt.legend()
plt.show()
MSE = metrics.mean_squared_error(predicted_stock_price, real_stock_price)
RMSE = metrics.mean_squared_error(predicted_stock_price, real_stock_price)**0.5
MAE = metrics.mean_absolute_error(predicted_stock_price, real_stock_price)
R2 = metrics.r2_score(predicted_stock_price, real_stock_price)
print('均方误差: %.5f' % MSE)
print('均方根误差: %.5f' % RMSE)
print('平均绝对误差: %.5f' % MAE)
print('R2: %.5f' % R2)
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。