【RNN實(shí)戰(zhàn)進(jìn)階】手把手教你如何預(yù)測當(dāng)天股票的最高點(diǎn)

      網(wǎng)友投稿 706 2025-03-31

      摘要

      在頭條上有很多人做股市的分析,分析每天大盤的漲跌,我觀察了幾位,預(yù)測的都不理想,我一直想著用AI去預(yù)測大盤的漲跌。股市數(shù)據(jù)是個(gè)時(shí)間序列數(shù)據(jù),用RNN再合適不過了,今天我用GRU手把手教大家實(shí)現(xiàn)這一算法。

      免責(zé)聲明

      算法的結(jié)果不能作為投資的依據(jù)!!!如果你根據(jù)算法的結(jié)果去投資,賠錢別找我啊!

      獲取原始數(shù)據(jù)

      網(wǎng)站的地址:http://quotes.money.163.com/trade/lsjysj_zhishu_000001.html

      在這上面能找到大盤額歷史數(shù)據(jù),我們選擇所有的數(shù)據(jù)下載下來即可。

      下載方法如下圖:

      點(diǎn)擊下載數(shù)據(jù),默認(rèn)選擇全部數(shù)據(jù),然后下載即可。

      制作訓(xùn)練用的數(shù)據(jù)

      原始的數(shù)據(jù)不能直接拿來使用,我們需要構(gòu)建時(shí)序數(shù)據(jù)。我的想法是用前n-1天的數(shù)據(jù)來預(yù)測n天的最高點(diǎn)或者收盤價(jià)。所以前n-1天的數(shù)據(jù)組成x,當(dāng)天的最高點(diǎn)就是y。

      制作數(shù)據(jù)的具體思路:

      第一步 讀入數(shù)據(jù),把幾個(gè)“None”替換為0,格式化日期,由于下載的數(shù)據(jù)默認(rèn)是按照日期的倒序,所以對(duì)日期做升序排列。

      第二步 刪除“股票代碼”、“名稱”和日期列。

      第三步 定義時(shí)序的長度n,n代表用多少天的數(shù)據(jù)。定義列名cols,類型是list,定義data,存放時(shí)序數(shù)據(jù)。

      第四步 循壞df,讀取數(shù)據(jù),構(gòu)建時(shí)序數(shù)據(jù)然后存放到data中,這個(gè)過程比較慢,不知道有沒有快捷的方式,如果有,還請(qǐng)指教。

      第五步 保存data數(shù)據(jù)到sssh.csv 文件中

      得到的最終結(jié)果是sssh.csv文件,然后就可以訓(xùn)練了。

      注:文件的最后一行是test數(shù)據(jù),所以沒有標(biāo)簽,我設(shè)置為0。

      完整的代碼如下:

      import pandas as pd df = pd.read_csv("000001.csv", encoding='gbk') df=df.replace("None", '0') df["日期"] = pd.to_datetime(df["日期"], format="%Y-%m-%d") df.sort_values(by=["日期"], ascending=True) del df["股票代碼"] del df["名稱"] df = df.sort_values(by=["日期"], ascending=True) df.to_csv("sh.csv", index=False, sep=',') del df['日期'] n = 60 cols = [] for col in df.columns: for i in range(n): cols.append(col + str(i)) cols.append('y') data = [] for k in range(n, len(df) + 1): onedata = [] for ii in range(n, 0, -1): for colindex in range(len(df.columns)): onedata.append(df.values[k - ii][colindex]) if k < len(df): onedata.append(df.values[k][1]) else: onedata.append(0) print(onedata) data.append(onedata) df_train = pd.DataFrame(data, columns=cols) df_train.to_csv("sssh.csv", index=False, sep=',')

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      【RNN實(shí)戰(zhàn)進(jìn)階】手把手教你如何預(yù)測當(dāng)天股票的最高點(diǎn)

      30

      31

      構(gòu)建模型

      模型選用GRU,隱藏層設(shè)置為64,平臺(tái)用的pytorch,模型的代碼如下:

      RNN是模型,TrainSet是數(shù)據(jù)讀取邏輯。

      class RNN(nn.Module): def __init__(self, input_size): super(RNN, self).__init__() self.rnn = nn.GRU( input_size=input_size, hidden_size=64, num_layers=1, batch_first=True ) self.out = nn.Sequential( nn.Linear(64, 1), ) self.hidden = None def forward(self, x): r_out, self.hidden = self.rnn(x) # None 表示 hidden state 會(huì)用全0的 state out = self.out(r_out) return out class TrainSet(Dataset): def __init__(self, data, lables): # 定義好 image 的路徑 self.data, self.label = data.float(), lables.float() def __getitem__(self, index): return self.data[index], self.label[index] def __len__(self): return len(self.data)

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      特征工程

      我做的特征工程有:

      1、對(duì)標(biāo)簽做縮放,把標(biāo)簽縮放到0到1之間。

      2、使用多項(xiàng)式對(duì)特征做擴(kuò)展。

      3、對(duì)x數(shù)據(jù)做縮放,縮放到0到1之間。

      代碼如下:

      LR = 0.0001 EPOCH = 300 # 數(shù)據(jù)集建立 df = pd.read_csv("sssh.csv", encoding='utf-8') scaler_y = MinMaxScaler(feature_range=(0, 1)) df['y'] = scaler_y.fit_transform(df['y'].values.reshape(-1, 1)) target = df['y'] del df['y'] polyCoder = PolynomialFeatures(degree=2, include_bias=True, interaction_only=False) df = polyCoder.fit_transform(df) df = pd.DataFrame(df, columns=polyCoder.get_feature_names()) cols = df.columns scaler = MinMaxScaler(feature_range=(0, 1)) for clo in cols: df[clo] = scaler.fit_transform(df[clo].values.reshape(-1, 1))

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      數(shù)據(jù)集切分

      先把測試集切出來,測試集是最后一行。然后再按照一定比例切分測試集和驗(yàn)證集,切分方法采用train_test_split,切分比例一般是7:3。代碼如下:

      data = df[:df.shape[0] - 1] y=target[:df.shape[0] - 1] test = df[df.shape[0] - 1:] X_train, X_val, y_train, y_val = train_test_split(data, y, test_size=0.1, random_state=6)

      1

      2

      3

      4

      訓(xùn)練驗(yàn)證

      第一步 使用DataLoader加載訓(xùn)練集和測試集。

      第二步 設(shè)置模型的,n是輸入的size,優(yōu)化器采用Adam,loss采用mse。

      第三步 測試。

      第四部 驗(yàn)證。

      整個(gè)過程比較簡單。

      代碼如下:

      # 第一步 trainloader = DataLoader(trainset, batch_size=64, shuffle=True) valloader = DataLoader(valset, batch_size=64, shuffle=True) #第二步 rnn = RNN(n) optimizer = torch.optim.Adam(rnn.parameters(), lr=LR) # optimize all cnn parameters loss_func = nn.MSELoss() #第三步 for step in range(EPOCH): rnn.train() for tx, ty in trainloader: output = rnn(torch.unsqueeze(tx, dim=1)) loss = loss_func(torch.squeeze(output), ty) optimizer.zero_grad() # clear gradients for this training step loss.backward() # back propagation, compute gradients optimizer.step() print(step, loss) if step % 10: torch.save(rnn, 'rnn.pkl') #第四步 rnn.eval() for vx, vy in valloader: output = rnn(torch.unsqueeze(vx, dim=1)) loss = loss_func(torch.squeeze(output), vy) print("Val Loss {}".format(loss))

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      測試

      這個(gè)過程就比較簡單。

      測試test數(shù)據(jù),輸出結(jié)果,然后執(zhí)行inverse_transform,將結(jié)果還原。

      rnn.eval() test = np.array(test) test = torch.Tensor(test) test=torch.unsqueeze(test, dim=1) output=rnn(test) print(output.data.item()) output=np.array(output.data.item()) inv_y = scaler_y.inverse_transform(output.reshape(-1,1)) inv_y = inv_y[0] print(inv_y)

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      預(yù)測今天的最高點(diǎn)是3597,實(shí)際最高點(diǎn)是3594,差了三個(gè)點(diǎn)。

      完整代碼:https://download.csdn.net/download/hhhhhhhhhhwwwwwwwwww/19934980

      機(jī)器學(xué)習(xí) 神經(jīng)網(wǎng)絡(luò)

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:wps中怎么復(fù)制表格
      下一篇:使用社交媒體推銷– Twitter
      相關(guān)文章
      亚洲精品无码高潮喷水在线| 亚洲电影唐人社一区二区| 亚洲精品午夜国产VA久久成人| 亚洲午夜福利在线视频| 亚洲乱码在线播放| 亚洲免费福利视频| 亚洲伊人久久大香线蕉| 亚洲一卡2卡4卡5卡6卡在线99 | 亚洲欧洲精品久久| 亚洲综合色丁香麻豆| 亚洲高清免费在线观看| 亚洲福利视频一区二区三区| 亚洲国产韩国一区二区| 亚洲一区二区三区无码国产| 中日韩亚洲人成无码网站| 亚洲精品乱码久久久久久蜜桃图片| 亚洲sm另类一区二区三区| 亚洲爆乳大丰满无码专区| 色欲aⅴ亚洲情无码AV| 亚洲国产91精品无码专区| 久久久无码精品亚洲日韩软件| 亚洲中文字幕无码不卡电影| 亚洲国产精品VA在线观看麻豆| 亚洲国产综合91精品麻豆| 亚洲神级电影国语版| 亚洲中文字幕无码亚洲成A人片| 亚洲精品无码专区久久| 人人狠狠综合久久亚洲高清| 久久久久亚洲精品中文字幕| 亚洲AV午夜成人片| 亚洲网址在线观看| 亚洲夂夂婷婷色拍WW47| 无码专区一va亚洲v专区在线| 国产亚洲精品成人AA片新蒲金| 亚洲AV无码专区国产乱码4SE | 亚洲国产精久久久久久久| 亚洲日本乱码一区二区在线二产线 | 亚洲av片一区二区三区| 国产亚洲精品无码专区| 久久精品国产精品亚洲艾| 亚洲沟沟美女亚洲沟沟|