0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

設(shè)計了一個強強聯(lián)合型模型來預(yù)測股票價格,為什么這么形容?

電子工程師 ? 來源:lp ? 2019-04-22 11:38 ? 次閱讀

【導(dǎo)語】用深度學(xué)習(xí)預(yù)測股票價格不是一個新話題,隨著技術(shù)的不斷發(fā)展,大家一直在不斷嘗試新技術(shù)。這次教程中,作者設(shè)計了一個強強聯(lián)合型模型來預(yù)測股票價格,為什么這么形容?作者設(shè)計了一個 GAN 模型,其生成網(wǎng)絡(luò)為 LSTM 模型用來預(yù)測時間序列數(shù)據(jù)、CNN 模型作判別網(wǎng)絡(luò),用 BERT 模型作為情緒分析模型。帶有高斯過程的貝葉斯優(yōu)化和深度強化學(xué)習(xí)方法來獲得 GAN 的超參數(shù)。為什么創(chuàng)建這樣的組合?都將在下面的內(nèi)容中為大家進行一一解答。

這篇教程的篇幅很長,為了讓大家能對重要技術(shù)內(nèi)容一目了然,作者在開始加入了層級清晰的目錄,主要從【背景】、【數(shù)據(jù)特征】、【GAN 模型架構(gòu)】、【超參數(shù)優(yōu)化】等幾大方面進行全面講解。

下面營長對其中涉及的技術(shù)細節(jié)進行了編譯:

背景

在今天的任務(wù)中,預(yù)測的是高盛公司(本文中會簡稱為 GS)的股票變化趨勢,使用 2010 年 1 月 1 日至 2018 年 12 月 31 日的日收盤價作為訓(xùn)練(七年)和測試(兩年)數(shù)據(jù)。

成功訓(xùn)練一個 GAN 最棘手的部分是獲得正確的超參數(shù)。為此,作者使用 Bayesian optimisation(帶有高斯過程的貝葉斯優(yōu)化)和用于決定何時以及如何改變 GAN 的超參數(shù)的深層強化學(xué)習(xí)(DRL),在創(chuàng)建強化學(xué)習(xí)過程中,將使用一些最新技術(shù),如 RAINBOW 和 PPO。

此外,在模型中還使用許多不同類型的輸入數(shù)據(jù)。隨著股票的歷史交易數(shù)據(jù)和技術(shù)指標(biāo),設(shè)計了一些技術(shù)方法,如使用 NLP 中的 BERT 來創(chuàng)建情緒分析模型(作為基本面分析的來源),以及用傅立葉變換(Fourier transforms)提取總體趨勢方向、識別其他高級特征的棧式自動編碼器( Stacked autoencoder);采用特征投資組合尋找相關(guān)資產(chǎn);采用 ARIMA 方法進行股票函數(shù)近似。實際上,這些技術(shù)都是為了盡可能多的獲取關(guān)于股票的信息、模式、依賴關(guān)系等等。

開發(fā)環(huán)境和框架選擇 MXNet 和其高級 API(Gluon)創(chuàng)建所有的神經(jīng)網(wǎng)絡(luò),并在多個 GPU 上進行訓(xùn)練。

圖:完整體系結(jié)構(gòu)概覽

通過上面的技術(shù)背景介紹,相信大家已經(jīng)感覺到想準(zhǔn)確預(yù)測股市是一項非常復(fù)雜的任務(wù),影響股票變化的事件、條件或因素等實在是太多了。所以,想更好的了解這些先決條件,還需要先做幾個重要的假設(shè):(1)市場不是 100% 的隨機;(2)歷史重復(fù);(3)市場遵循人們的理性行為;(4)市場是“完美的”。

數(shù)據(jù)

首先,要了解什么因素會影響 GS 的股票價格波動,需要包含盡可能多的信息(從不同的方面和角度)。將使用 1585 天的日數(shù)據(jù)來訓(xùn)練各種算法(70% 的數(shù)據(jù)),并預(yù)測另外 680 天的結(jié)果(測試數(shù)據(jù))。然后,將預(yù)測結(jié)果與測試數(shù)據(jù)進行比較。每種類型的數(shù)據(jù)(亦稱為特征)將在后面的部分中詳細解釋。

簡而言之,將使用的特征有:

a.相關(guān)資產(chǎn):涉及商品、外匯、指數(shù)、固定收益證券等各類資產(chǎn)數(shù)據(jù);影響高盛公司股票價格趨勢的外部因素又有很多,并且很復(fù)雜,包括競爭對手、客戶、全球經(jīng)濟、地緣政治形勢、財政和貨幣政策等等,這些因素還會相互產(chǎn)生影響。選擇合適的相關(guān)資產(chǎn)是非常重要的:

(1)首先是和 GS 相似的公司,如將摩根大通(JPMorgan Chase)和摩根士丹利(Morgan Stanley)等加入數(shù)據(jù)集。

(2)作為一家投資銀行,高盛依賴于全球經(jīng)濟,需要關(guān)注全球經(jīng)濟指數(shù)和 libor 利率。

(3)每日波動指數(shù)(VIX)。

(4)綜合指數(shù),如 NASDAQ 和 NYSE(美國)、FTSE 100(英國)、日經(jīng)指數(shù) 225(日本)、恒生指數(shù)和 BSE Sensex(APAC)指數(shù)。

(5)貨幣,全球貿(mào)易多次反映在貨幣流動中,使用一籃子貨幣(如美元-日元、英鎊-美元等)作為特征。

總的來說,在數(shù)據(jù)集中還有 72 個其他資產(chǎn)(每個資產(chǎn)的每日價格)。

b.技術(shù)指標(biāo):許多投資人都會關(guān)注技術(shù)指標(biāo),在這里,把最受歡迎的指標(biāo)作為獨立特征,包括 7 天和 21 天波動平均值、指數(shù)波動平均、Momentum、MACD 等 12項技術(shù)指標(biāo)。

def get_technical_indicators(dataset): # Create 7 and 21 days Moving Average dataset['ma7'] = dataset['price'].rolling(window=7).mean() dataset['ma21'] = dataset['price'].rolling(window=21).mean() # Create MACD dataset['26ema'] = pd.ewma(dataset['price'], span=26) dataset['12ema'] = pd.ewma(dataset['price'], span=12) dataset['MACD'] = (dataset['12ema']-dataset['26ema']) # Create Bollinger Bands dataset['20sd'] = pd.stats.moments.rolling_std(dataset['price'],20) dataset['upper_band'] = dataset['ma21'] + (dataset['20sd']*2) dataset['lower_band'] = dataset['ma21'] - (dataset['20sd']*2) # Create Exponential moving average dataset['ema'] = dataset['price'].ewm(com=0.5).mean() # Create Momentum dataset['momentum'] = dataset['price']-1 return datasetdataset_TI_df = get_technical_indicators(dataset_ex_df[['GS']])dataset_TI_df.head()

c.基本面分析:無論股票漲跌,這都是一個非常重要的數(shù)據(jù)。分析時會用到兩個特征:公司業(yè)績報告和新聞將引導(dǎo)的一些趨勢,因此通過分析新聞來準(zhǔn)確預(yù)測市場的情緒也是一項非常重要的工作,所以這次的方法中,將使用 BERT 來構(gòu)建情緒分析模型,提取股票新聞中的情緒傾向。最后采用 sigmoid 歸一化,結(jié)果介于 0 到 1 之間,(0 表示負面情緒,1 表示正面情緒),每一天都會創(chuàng)建一個平均每日分數(shù)作為一個特征添加。

使用的是 MXNet 中 Gluon NLP 庫中所提供的經(jīng)過預(yù)訓(xùn)練的 BERT 模型,大家可以嘗試一下。此前我們也為大家介紹過簡單易上手的 Gluon,詳情可參考營長親自上手的教程。

d.傅里葉變換:利用每日收盤價,創(chuàng)建傅立葉變換,以獲得幾個長期和短期趨勢。使用這些變換消除大量的噪聲,獲得真實股票波動的近似值。有了趨勢近似,可以幫助 LSTM 網(wǎng)絡(luò)更準(zhǔn)確地選擇其預(yù)測趨勢。

data_FT = dataset_ex_df[['Date', 'GS']]close_fft = np.fft.fft(np.asarray(data_FT['GS'].tolist()))fft_df = pd.DataFrame({'fft':close_fft})fft_df['absolute'] = fft_df['fft'].apply(lambda x: np.abs(x))fft_df['angle'] = fft_df['fft'].apply(lambda x: np.angle(x))plt.figure(figsize=(14, 7), dpi=100)fft_list = np.asarray(fft_df['fft'].tolist())for num_ in [3, 6, 9, 100]: fft_list_m10= np.copy(fft_list); fft_list_m10[num_:-num_]=0 plt.plot(np.fft.ifft(fft_list_m10), label='Fourier transform with {} components'.format(num_))plt.plot(data_FT['GS'], label='Real')plt.xlabel('Days')plt.ylabel('USD')plt.title('Figure 3: Goldman Sachs (close) stock prices & Fourier transforms')plt.legend()plt.show()

圖:高盛股票的傅里葉變換

e.ARIMA:這是預(yù)測時間序列數(shù)據(jù)未來值的最流行技術(shù)之一。

frompandasimportread_csvfrom pandas import datetimefrom statsmodels.tsa.arima_model import ARIMAfrom sklearn.metrics import mean_squared_errorX = series.valuessize = int(len(X) * 0.66)train, test = X[0:size], X[size:len(X)]history = [x for x in train]predictions = list()for t in range(len(test)): model = ARIMA(history, order=(5,1,0)) model_fit = model.fit(disp=0) output = model_fit.forecast() yhat = output[0] predictions.append(yhat) obs = test[t] history.append(obs)error = mean_squared_error(test, predictions)print('Test MSE: %.3f' % error)Test MSE: 10.151# Plot the predicted (from ARIMA) and real pricesplt.figure(figsize=(12, 6), dpi=100)plt.plot(test, label='Real')plt.plot(predictions, color='red', label='Predicted')plt.xlabel('Days')plt.ylabel('USD')plt.title('Figure 5: ARIMA model on GS stock')plt.legend()plt.show

f.Stacked autoencoders?(棧式自動編碼器):上面提到的一些特征是研究人員經(jīng)過幾十年的研究發(fā)現(xiàn)的,但是還是會忽視一些隱藏的關(guān)聯(lián)特征,由此,Stacked autoencoders? 就可以解決這個問題,通過學(xué)習(xí)每個隱藏層,發(fā)現(xiàn)更多新特征(可能有些是我們無法發(fā)現(xiàn),理解的)。這次沒有把 RELU 作為激活函數(shù),而是使用了 GELU,也可以用于 BERT 模型中。至于為什么選擇 GELU,大家可以在原文中看到作者給出的和 RELU 對比的實例。

g.深度無監(jiān)督學(xué)習(xí):用于期權(quán)定價中的異常檢測,將再使用一個特征:每天都會增加高盛股票90天看漲期權(quán)的價格。期權(quán)定價本身結(jié)合了很多數(shù)據(jù)。期權(quán)合約的價格取決于股票的未來價值(分析師也試圖預(yù)測價格,以便為看漲期權(quán)得出最準(zhǔn)確的價格)。使用深度無監(jiān)督學(xué)習(xí)(自組織映射),嘗試發(fā)現(xiàn)出現(xiàn)異常的每日價格。異常(如價格的劇烈變化)可能表明出現(xiàn)了一個事件,這有助于LSTM了解整體股票模式。

from utils import *import timeimport numpy as npfrom mxnet import nd, autograd, gluonfrom mxnet.gluon import nn, rnnimport mxnet as mximport datetimeimportseabornassnsimport matplotlib.pyplot as plt%matplotlib inlinefrom sklearn.decomposition import PCAimport mathfrom sklearn.preprocessing import MinMaxScalerfrom sklearn.metrics import mean_squared_errorfrom sklearn.preprocessing import StandardScalerimport xgboost as xgbfrom sklearn.metrics import accuracy_scoreimport warningswarnings.filterwarnings("ignore")context = mx.cpu(); model_ctx=mx.cpu()mx.random.seed(1719)Note: The purpose of this section (3. The Data) is to show the data preprocessing and to give rationale for using different sources of data, hence I will only use a subset of the full data (that is used for training).def parser(x): return datetime.datetime.strptime(x,'%Y-%m-%d')dataset_ex_df = pd.read_csv('data/panel_data_close.csv', header=0, parse_dates=[0], date_parser=parser)dataset_ex_df[['Date','GS']].

接下來,有了這么多特征,還需要執(zhí)行幾個重要步驟:

h.對數(shù)據(jù)的“質(zhì)量”進行統(tǒng)計檢查:確保數(shù)據(jù)質(zhì)量對模型來說非常重要,因此要執(zhí)行以下幾個簡單的檢驗,如異方差、多重共線性、Serial correlation 等。

i.確定特征重要性:采用 XGBoost 算法。這么多的特征,必須考慮是否所有這些都真正地指示了 GS 股票波動方向。例如,數(shù)據(jù)集中包括其變化可能意味著經(jīng)濟變化的 LIBOR,而這又可能暗示 GS 股票將會發(fā)生波動,因此需要對此預(yù)測進行測試,在眾多的測試方法中,本教程中選擇了 XGBoost,其在分類和回歸問題上都提供了很好的結(jié)果。

defget_feature_importance_data(data_income): data = data_income.copy() y = data['price'] X = data.iloc[:, 1:] train_samples = int(X.shape[0] * 0.65) X_train = X.iloc[:train_samples] X_test = X.iloc[train_samples:] y_train = y.iloc[:train_samples] y_test = y.iloc[train_samples:] return (X_train, y_train), (X_test, y_test)# Get training and test data(X_train_FI, y_train_FI), (X_test_FI, y_test_FI) = get_feature_importance_data(dataset_TI_df)regressor = xgb.XGBRegressor(gamma=0.0,n_estimators=150,base_score=0.7,colsample_bytree=1,learning_rate=0.05)xgbModel = regressor.fit(X_train_FI,y_train_FI, \ eval_set = [(X_train_FI, y_train_FI), (X_test_FI, y_test_FI)], \ verbose=False)eval_result = regressor.evals_result()training_rounds=range(len(eval_result['validation_0']['rmse']))

最后一步,使用主成分分析(PCA)創(chuàng)建特征組合,以減少自動編碼器生成特征的維數(shù)。在自動編碼器中創(chuàng)建了 112 個特征,不過高維特征對我們的價值更大,所以在這 112 個特征的基礎(chǔ)上通過 PCA 創(chuàng)建高維的特征組合,減少數(shù)據(jù)維度。不過,這也是我們提出的實驗性方法。

plt.figure(figsize=(15, 5))plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=.5, hspace=None)ranges_ = (-10, 3, .25)plt.subplot(1, 2, 1)plt.plot([i for i in np.arange(*ranges_)], [relu(i) for i in np.arange(*ranges_)], label='ReLU', marker='.')plt.plot([i for i in np.arange(*ranges_)], [gelu(i) for i in np.arange(*ranges_)], label='GELU')plt.hlines(0, -10, 3, colors='gray', linestyles='--', label='0')plt.title('Figure 7: GELU as an activation function for autoencoders')plt.ylabel('f(x) for GELU and ReLU')plt.xlabel('x')plt.legend()plt.subplot(1, 2, 2)plt.plot([i for i in np.arange(*ranges_)], [lrelu(i) for i in np.arange(*ranges_)], label='Leaky ReLU')plt.hlines(0, -10, 3, colors='gray', linestyles='--', label='0')plt.ylabel('f(x) for Leaky ReLU')plt.xlabel('x')plt.title('Figure 8: LeakyReLU')plt.legend()plt.sho

讓我們看一下過去 9 年的股價變化。虛線表示訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù)之間的分割線。

plt.figure(figsize=(14, 5), dpi=100)plt.plot(dataset_ex_df['Date'], dataset_ex_df['GS'], label='Goldman Sachs stock')plt.vlines(datetime.date(2016,4, 20), 0, 270, linestyles='--', colors='gray', label='Train/Test data cut-off')plt.xlabel('Date')plt.ylabel('USD')plt.title('Figure 2: Goldman Sachs stock price')plt.legend()plt.show()

圖:過去9年高盛股價的波動

num_training_days = int(dataset_ex_df.shape[0]*.7)print('Number of training days: {}. Number of test days: {}.'.format(num_training_days, \ dataset_ex_df.shape[0]-num_training_days))Numberoftrainingdays:1585.Numberoftestdays:680.

生成對抗性網(wǎng)絡(luò)(GAN)

圖:GAN 架構(gòu)

1、為什么采用GAN進行股市預(yù)測?

GAN 最多被應(yīng)用在創(chuàng)作逼真的圖像、畫作和視頻剪輯等。對預(yù)測時間序列數(shù)據(jù)的應(yīng)用并不多。但這兩者的思想都是類似的。我們希望預(yù)測未來的股票價格,GS 的股票波動和行為應(yīng)該大致相同(除非開始以完全不同的方式運作,或者經(jīng)濟急劇變化)。因此,希望“生成”的數(shù)據(jù)與已經(jīng)擁有的歷史交易數(shù)據(jù)分布相似,當(dāng)然不是完全相同。在這個例子中將使用 LSTM 作為時間序列生成模型,CNN 作為判別模型。

2、Metropolis-Hastings GAN 和 Wasserstein GAN

(1)Metropolis-Hastings GAN:與傳統(tǒng)的 GAN 相比,Uber 團隊最近提出一種新改進的 GAN 模型——Metropolis-Hastings GAN (MHGAN),它有點類似于谷歌和加州大學(xué)伯克利分校提出的Discriminator Rejection Sampling。通常情況下,在訓(xùn)練完GAN之后就不再使用 D 了。然而,MHGAN 和 DRS 試圖使用 D 來選擇由 G 生成的接近真實的樣本。

(2)Wasserstein GAN:訓(xùn)練 GAN 是相當(dāng)困難的。模型可能永遠不會收斂,模式崩潰也很容易發(fā)生。,通過 Wasserstein GAN 嘗試解決這個問題。KL 距離和 JS 距離是兩種常用的分布,而 WGAN 使用的是 Wasserstein distanc。

3、生成模型:單層RNN

(1)LSTM 還是 GRU?

關(guān)于 RNN、LSTM 等模型的基礎(chǔ)介紹這里不多做贅述,主要聚焦在 RNN 在時間序列數(shù)據(jù)上的應(yīng)用,因為它們可以跟蹤所有以前的數(shù)據(jù)點,并且可以捕獲經(jīng)過時間發(fā)展的模式??梢酝ㄟ^裁剪解 RNN 梯度消失或梯度爆炸問題。

在精度方面,LSTM 和 GRU 的結(jié)果相差不多,但是 GRU 使用的訓(xùn)練參數(shù)要比 LSTM 少,計算強度也要小。

(2)LSTM 體系結(jié)構(gòu)

LSTM架構(gòu)非常簡單:一個LSTM層,包含112個輸入單元(數(shù)據(jù)集中有112個特征)和500個隱藏單元;一個以每日股價為輸出的 Dense 層;采用 Xavier 初始化,使用 L1 損失函數(shù)

在下面的代碼中,采用adam作為優(yōu)化器,學(xué)習(xí)率為 0.01。

gan_num_features = dataset_total_df.shape[1]sequence_length = 17class RNNModel(gluon.Block): def __init__(self, num_embed, num_hidden, num_layers, bidirectional=False, \ sequence_length=sequence_length, **kwargs): super(RNNModel, self).__init__(**kwargs) self.num_hidden = num_hidden with self.name_scope(): self.rnn = rnn.LSTM(num_hidden, num_layers, input_size=num_embed, \ bidirectional=bidirectional, layout='TNC') self.decoder = nn.Dense(1, in_units=num_hidden) def forward(self, inputs, hidden): output, hidden = self.rnn(inputs, hidden) decoded = self.decoder(output.reshape((-1, self.num_hidden))) return decoded, hidden def begin_state(self, *args, **kwargs): return self.rnn.begin_state(*args, **kwargs)lstm_model = RNNModel(num_embed=gan_num_features, num_hidden=500, num_layers=1)lstm_model.collect_params().initialize(mx.init.Xavier(), ctx=mx.cpu())trainer = gluon.Trainer(lstm_model.collect_params(), 'adam', {'learning_rate': .01})loss=glu

(3)學(xué)習(xí)率調(diào)度器

學(xué)習(xí)率是非常重要的參數(shù)之一,每個優(yōu)化器設(shè)置學(xué)習(xí)率,如 SGD、Adam 或 RMSProp 在訓(xùn)練神經(jīng)網(wǎng)絡(luò)時至關(guān)重要,因為它既控制著網(wǎng)絡(luò)的收斂速度,又控制著網(wǎng)絡(luò)的最終性能,接下來就要確定每個階段的學(xué)習(xí)率。

classTriangularSchedule(): def __init__(self, min_lr, max_lr, cycle_length, inc_fraction=0.5): self.min_lr = min_lr self.max_lr = max_lr self.cycle_length = cycle_length self.inc_fraction = inc_fraction def __call__(self, iteration): if iteration <= self.cycle_length*self.inc_fraction: unit_cycle = iteration * 1 / (self.cycle_length * self.inc_fraction) elif iteration <= self.cycle_length: unit_cycle = (self.cycle_length - iteration) * 1 / (self.cycle_length * (1 - self.inc_fraction)) else: unit_cycle = 0 adjusted_cycle = (unit_cycle * (self.max_lr - self.min_lr)) + self.min_lr return adjusted_cycleclass CyclicalSchedule(): def __init__(self, schedule_class, cycle_length, cycle_length_decay=1, cycle_magnitude_decay=1, **kwargs): self.schedule_class = schedule_class self.length = cycle_length self.length_decay = cycle_length_decay self.magnitude_decay = cycle_magnitude_decay self.kwargs = kwargs def __call__(self, iteration): cycle_idx = 0 cycle_length = self.length idx = self.length while idx <= iteration: cycle_length = math.ceil(cycle_length * self.length_decay) cycle_idx += 1 idx += cycle_length cycle_offset = iteration - idx + cycle_length schedule = self.schedule_class(cycle_length=cycle_length,**self.kwargs)????????return?schedule(cycle_offset)?*self.magnitude_decay**cycle_idx

(4)防止過擬合與偏差-方差權(quán)衡

防止過擬合,注意總損失也是要在訓(xùn)練模型中非常重要的一個問題。不僅在生成器中的 LSTM 模型,判別器中的 CNN 模型、自動編碼器中都使用了幾種防止過擬合的技術(shù):

a.確保數(shù)據(jù)質(zhì)量

b.正則化,或權(quán)重懲罰:最常用的兩種正則化技術(shù)是L1 和 L2 正則法。L1對離散值更有魯棒性,當(dāng)數(shù)據(jù)稀疏時使用,可得到特征重要性。因此,在股票價格預(yù)測這個應(yīng)用案例中將使用 L1 正則法。

c.Dropout。Dropout層隨機刪除隱藏層中的節(jié)點。

d.Dense-sparse-dense training

e.提前停止.

(5)權(quán)衡偏差-方差

建立復(fù)雜神經(jīng)網(wǎng)絡(luò)時,另一個重要的考慮因素是偏差-方差權(quán)衡。訓(xùn)練網(wǎng)絡(luò)的誤差基本上是偏差、方差和不可約誤差 σ(噪聲和隨機性引起的誤差)的函數(shù)。

最簡單的權(quán)衡公式是:誤差=偏差^2+方差+σ.

a.偏差(Bias):偏差衡量一個經(jīng)過訓(xùn)練的(訓(xùn)練數(shù)據(jù)集)算法對未見數(shù)據(jù)的概括能力。高偏差(欠擬合)意味著模型在隱藏數(shù)據(jù)上不能很好地工作。

b.方差(Variance):方差衡量模型對數(shù)據(jù)集變化的敏感性。高方差意味著過擬合。

4、 一維 CNN 判別模型

(1)為何采用CNN作為判別模型?

CNN 網(wǎng)絡(luò)在提取隱藏特征等工作上具有優(yōu)勢,那如何應(yīng)用于這個任務(wù)中?大家不妨嘗試一下,數(shù)據(jù)點行程小趨勢,小趨勢行程大趨勢,趨勢反之形成模式,而 CNN 在此用檢測特征的能力來提取 GS 股價趨勢中的模式信息。

圖:本文提出的 CNN 模型的體系結(jié)構(gòu)。

超參數(shù)優(yōu)化

(1)跟蹤和優(yōu)化的超參數(shù)是:

batch_size:LSTM 和 CNN 的 Batch 大小

cnn_lr:CNN 的學(xué)習(xí)率

strides:CNN 的跨步卷積數(shù)

lrelu_alpha:GAN 中 LeakyReLU 的 Alpha 值

batchnorm_momentum:CNN Batch 正則化的 momentum

padding:CNN 中的 Padding

kernel_size:1 CNN 的內(nèi)核大小

dropout:LSTM 中的 Dropout 層

filters:過濾器的初始數(shù)目

epoch = 200

(2)超參數(shù)優(yōu)化

經(jīng)過 200 次 GAN 訓(xùn)練后,將記錄 MAE(LSTM、GG 中的誤差函數(shù))并作為獎勵值傳遞給強化學(xué)習(xí)(RL)模型,以決定是否用同一組超參數(shù)來改變保持訓(xùn)練的超參數(shù),如果RL決定更新超參數(shù),它將調(diào)用 Bayes 優(yōu)化庫。

(3)超參數(shù)優(yōu)化中的強化學(xué)習(xí)

為什么在超參數(shù)優(yōu)化中使用強化學(xué)習(xí)?股票市場一直在變化。即使能夠訓(xùn)練 GAN 和 LSTM 來創(chuàng)造非常精確的結(jié)果,結(jié)果也只能在一定的時間內(nèi)有效。也就是說,我們需要不斷優(yōu)化整個過程。為了優(yōu)化這一過程,可以添加或刪除特征,或改進深度學(xué)習(xí)模型。改進模型的最重要的方法之一就是通過超參數(shù)。一旦找到了一組特定的超參數(shù),就需要決定何時修改它們,以及何時使用已經(jīng)知道的集合(探索或利用)。此外,股票市場代表了一個依賴于數(shù)百萬參數(shù)的連續(xù)空間。

(4)強化學(xué)習(xí)理論

使用無模型的 RL 算法,原因很明顯,我們不知道整個環(huán)境,因此沒有關(guān)于環(huán)境如何工作的定義模型(如果存在,就不需要預(yù)測股票價格的變化)。使用兩個細分的無模型RL:策略優(yōu)化(Policy Optimization)和 Q-Learning。構(gòu)建 RL 算法的一個關(guān)鍵方面是精確設(shè)置獎勵。它必須捕捉環(huán)境的所有方面以及代理與環(huán)境的交互。

a.Q-Learning:一種基于Q-Learning的非策略深度強化學(xué)習(xí)算法,它將7種算法結(jié)合在一起:DQN、Double Q Learning(雙QL)、Prioritized replay、決斗網(wǎng)絡(luò)(Dueling networks)、多步學(xué)習(xí)、分布式RL、噪聲網(wǎng)絡(luò)(Noisy Nets)。在Q-Learning中,學(xué)習(xí)價值從某一狀態(tài)采取行動。Q 值采取行動后的預(yù)期回報。

b.策略優(yōu)化:這里采用近端策略優(yōu)化(Proximal Policy Optimization, PPO),在決策優(yōu)化中,學(xué)習(xí)從某一狀態(tài)采取的行動。(如果使用諸如Actor/Critic之類的方法,也會了解處于給定狀態(tài)的價值。

(5)貝葉斯優(yōu)化

使用貝葉斯優(yōu)化,不采用網(wǎng)格搜索,因為可能需要很長時間才能找到超參數(shù)的最佳組合。

圖:貝葉斯超參數(shù)優(yōu)化的高斯過程

5、結(jié)果

最后,使用測試數(shù)據(jù)作為不同階段的輸入,LSTM 的輸出與實際股價進行比較:

(1)繪制第一次訓(xùn)練之后的結(jié)果

(2)繪制 50 次訓(xùn)練后的結(jié)果。

(3)繪制 200 次訓(xùn)練后的結(jié)果。

RL 運行了 10 eposide ,本文定義一個 eposide 是 GAN 完整訓(xùn)練 200 次后,下圖是得到的最終的結(jié)果。

總結(jié)

可見,作者在把各路強模型聯(lián)合打造的結(jié)果還是非常優(yōu)秀的。不過作者還嘗試創(chuàng)建一個 RL 環(huán)境,用于測試決定何時以及如何進行交易的交易算法。GAN 的輸出將是此環(huán)境中的一個參數(shù),雖然這些都不能完全做到預(yù)測的作用,但是在實際任務(wù)中不斷嘗試新技術(shù)還是很有意義的,期待作者后續(xù)工作可以帶來更好的結(jié)果。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • GaN
    GaN
    +關(guān)注

    關(guān)注

    19

    文章

    1884

    瀏覽量

    71034
  • 深度學(xué)習(xí)
    +關(guān)注

    關(guān)注

    73

    文章

    5422

    瀏覽量

    120591
  • 強化學(xué)習(xí)
    +關(guān)注

    關(guān)注

    4

    文章

    263

    瀏覽量

    11157

原文標(biāo)題:開什么玩笑?股票價格如何經(jīng)得起AI的推敲?| 技術(shù)頭條

文章出處:【微信號:rgznai100,微信公眾號:rgznai100】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    【「時間序列與機器學(xué)習(xí)」閱讀體驗】時間序列的信息提取

    。 時間序列的單調(diào)性理論是數(shù)學(xué)求導(dǎo)。下面是使用EWMA分析股票價格變動,以決定買入還是賣出。通過仿真數(shù)據(jù),這種指數(shù)移動平均的技術(shù)剔除了短期波動,有助看清股票整體趨勢。 通過對本章學(xué)習(xí),對時間序列的研究目的、方法與特征有較全
    發(fā)表于 08-17 21:12

    基于網(wǎng)絡(luò)共識的股票價格行為數(shù)據(jù)挖掘(英文

    線索并存儲到平臺數(shù)據(jù)庫。圍繞融合兩方面數(shù)據(jù)進行股票價格行為數(shù)據(jù)挖掘,完成了體系架構(gòu)、數(shù)據(jù)結(jié)構(gòu)和分析支持組件的設(shè)計,實現(xiàn)股票價格行為數(shù)據(jù)挖掘原型系統(tǒng)。【關(guān)鍵詞】:數(shù)據(jù)挖掘;;網(wǎng)絡(luò)共識
    發(fā)表于 04-24 09:56

    炒股福利:樹莓派股票查詢庫(Python)

    本帖最后由 348081236 于 2016-1-6 14:20 編輯 本教程介紹如何通過樹莓派用Yahoo Finance API建個股票查詢庫,獲?。ù蟛糠郑崟r股票價格。第
    發(fā)表于 01-06 14:20

    阿里云MaxCompute(大數(shù)據(jù))公開數(shù)據(jù)集---帶你玩轉(zhuǎn)人工智能

    摘要: 目前阿里云大數(shù)據(jù)產(chǎn)品已經(jīng)免費向全部用戶開放了多種公用數(shù)據(jù)集。開放的數(shù)據(jù)類別包括:股票價格數(shù)據(jù),房產(chǎn)信息,影視及其票房數(shù)據(jù)。點此查看原文:http://click.aliyun.com/m
    發(fā)表于 01-23 17:16

    模型預(yù)測控制+邏輯控制

    模型預(yù)測控制(MPC)+邏輯控制(相平面分區(qū)控制)–matlab例程介紹MATLAB-模型模糊神經(jīng)網(wǎng)絡(luò)預(yù)測控制demo(訓(xùn)練數(shù)據(jù)用):鏈接:目錄構(gòu)建思想matlab simulink框
    發(fā)表于 08-17 07:09

    使用keras搭建神經(jīng)網(wǎng)絡(luò)實現(xiàn)基于深度學(xué)習(xí)算法的股票價格預(yù)測

    本文使用keras搭建神經(jīng)網(wǎng)絡(luò),實現(xiàn)基于深度學(xué)習(xí)算法的股票價格預(yù)測。本文使用的數(shù)據(jù)來源為tushare,免費開源接口;且只取開票價進行
    發(fā)表于 02-08 06:40

    基于混沌時間序列分析的股票價格預(yù)測

    根據(jù)股票市場是非線性動力系統(tǒng)的假設(shè),利用混沌理論對混沌時間序列的分析方法,提出了股票價格預(yù)測方法。同時利用重構(gòu)相空間的嵌入維數(shù)和延遲時間分別確定經(jīng)向基函數(shù)模
    發(fā)表于 02-18 14:07 ?40次下載

    航空發(fā)動機T-S模型模糊廣義預(yù)測控制算法設(shè)計

    航空發(fā)動機T-S模型模糊廣義預(yù)測控制算法設(shè)計 The Design of Fuzzy Generalized Predictive Control Algorithm for T-S Model in Aviation Engine
    發(fā)表于 03-16 12:13 ?5次下載

    基于CART和相似股的股票價格走勢預(yù)測算法研究

    目前預(yù)測股票價格大多都基于單支股票的歷史價格數(shù)據(jù),并試圖找出其股價變化規(guī)律,訓(xùn)練出可預(yù)測價格
    發(fā)表于 11-28 14:25 ?0次下載
    基于CART和相似股的<b class='flag-5'>股票價格</b>走勢<b class='flag-5'>預(yù)測</b>算法研究

    基于支持向量回歸的交易模型的穩(wěn)健性策略

    多樣化的方法。首先,介紹基于支持向量回歸技術(shù)的算法交易模型;然后,基于常用指標(biāo),構(gòu)造若干導(dǎo)出指標(biāo),用于股票價格的短期預(yù)測。這些指標(biāo),刻畫了近期價格
    發(fā)表于 12-05 15:30 ?0次下載
    基于支持向量回歸的交易<b class='flag-5'>模型</b>的穩(wěn)健性策略

    Oracles正在為物質(zhì)世界和區(qū)塊鏈之間架起座橋梁

    Oracle對期貨合約交易平臺(即預(yù)測市場)特別有用,而預(yù)測市場本質(zhì)上是種DU BO形式。體育比賽的結(jié)果、政治選舉、天氣、股票價格、比特幣的價格
    發(fā)表于 02-26 13:47 ?601次閱讀

    利用人工智能,成功預(yù)測2020年2月18日當(dāng)前的市場崩潰

    Vantagepoint交易員有洞察力,可以避免股票價格突然下跌,因為股票價格 在2月最后周下跌了超過 2.5萬億美元,抹去了許多交易員辛辛苦苦賺的資本。
    的頭像 發(fā)表于 03-01 17:58 ?2051次閱讀

    基于LSTM和遺傳算法的股票價格漲跌預(yù)測模型

    如何準(zhǔn)確地進行股票預(yù)測直是量仳金融領(lǐng)域的重要問題。長短期記憶細胞神經(jīng)網(wǎng)絡(luò)(LSTM)的岀現(xiàn)較好地解決股票
    發(fā)表于 06-17 15:04 ?20次下載

    LSTM GRU Bidirectional-LSTM股票預(yù)測

    本文使用keras搭建神經(jīng)網(wǎng)絡(luò),實現(xiàn)基于深度學(xué)習(xí)算法的股票價格預(yù)測。本文使用的數(shù)據(jù)來源為tushare,免費開源接口;且只取開票價進行
    發(fā)表于 12-05 09:06 ?11次下載
    LSTM GRU Bidirectional-LSTM<b class='flag-5'>股票</b><b class='flag-5'>預(yù)測</b>

    python數(shù)據(jù)挖掘案例

    Python數(shù)據(jù)挖掘的強大功能。 、金融領(lǐng)域 1.股票價格預(yù)測 股票市場是復(fù)雜的系統(tǒng),而
    的頭像 發(fā)表于 08-17 16:29 ?1485次閱讀