1. 深度學(xué)習(xí)簡介
深度學(xué)習(xí)是模擬人腦進(jìn)行分析學(xué)習(xí)的神經(jīng)網(wǎng)絡(luò)。
2. 常用深度學(xué)習(xí)模型架構(gòu)
- 深度神經(jīng)網(wǎng)絡(luò)(DNN)
- 卷積神經(jīng)網(wǎng)絡(luò)(CNN)
- 馬爾可夫鏈(MC)
- 玻爾茲曼機(jī)(BM)
- 生成對抗網(wǎng)絡(luò)(GAN)
- 長短期記憶網(wǎng)絡(luò)(LSTM)
2.1 LSTM 介紹
長短期記憶網(wǎng)絡(luò)(LSTM)是一種常用于處理序列數(shù)據(jù)的循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)的變體,被廣泛應(yīng)用于自然語言處理、語音識別、時間序列預(yù)測等任務(wù)中。
LSTM通過門控機(jī)制解決了傳統(tǒng)RNN中的梯度問題,能夠有效地處理序列數(shù)據(jù),并在多個領(lǐng)域取得了顯著的成果。
2.2 LSTM在股票預(yù)測中的應(yīng)用
LSTM在量化預(yù)測股票方面被廣泛應(yīng)用。它可以利用歷史股票價格和交易量等數(shù)據(jù)來學(xué)習(xí)股票價格的趨勢和波動,從而進(jìn)行未來的預(yù)測。
在股票預(yù)測中,LSTM可以接受時間序列數(shù)據(jù)作為輸入,并通過遞歸地更新隱藏狀態(tài)來捕獲長期依賴關(guān)系。它可以通過學(xué)習(xí)歷史價格和交易量等特征的模式,對未來的股票價格進(jìn)行預(yù)測。
通過將股票歷史數(shù)據(jù)作為訓(xùn)練樣本,LSTM可以學(xué)習(xí)不同時間尺度上的模式,例如每日、每周或每月的波動情況。它還可以利用技術(shù)指標(biāo)、市場情緒數(shù)據(jù)等輔助信息,以提高預(yù)測準(zhǔn)確性。
在實際應(yīng)用中,研究人員和投資者通過訓(xùn)練LSTM模型來預(yù)測股票的價格趨勢、波動情況和交易信號。這些預(yù)測結(jié)果可以用于制定投資策略、風(fēng)險管理和決策制定等方面。
需要注意的是,股票市場受到多種因素的影響,包括經(jīng)濟(jì)因素、政治事件和市場心理等。LSTM在股票預(yù)測中的應(yīng)用并不是完全準(zhǔn)確的,因此在實際應(yīng)用中需要結(jié)合其他因素進(jìn)行綜合分析和決策。此外,過度依賴LSTM模型所做的預(yù)測結(jié)果也可能存在風(fēng)險,投資者仍需謹(jǐn)慎分析和評估。
3. 模塊分類
3.1 卷積層
卷積層是深度學(xué)習(xí)中的基本層之一,通過卷積操作對輸入數(shù)據(jù)進(jìn)行特征提取和特征映射,并利用參數(shù)共享和局部連接等機(jī)制提高模型的參數(shù)效率。
- 一維卷積層
- 二維卷積層
- 三維卷積層
3.2 池化層
平均池化和最大池化是卷積神經(jīng)網(wǎng)絡(luò)中常用的池化操作,用于減少特征圖的維度,并提取出重要的特征信息。
- 平均池化
- 最大池化
3.3 全連接層
全連接層是神經(jīng)網(wǎng)絡(luò)中的一種常見層類型。在全連接層中,每個輸入神經(jīng)元與輸出層中的每個神經(jīng)元都有連接。每個連接都有一個權(quán)重,用于調(diào)整輸入神經(jīng)元對于輸出神經(jīng)元的影響。全連接層的輸出可以通過激活函數(shù)進(jìn)行非線性變換。
3.4 Dropout層
Dropout層是一種正則化技術(shù),用于在訓(xùn)練過程中隨機(jī)丟棄一部分輸入神經(jīng)元,以減少過擬合的風(fēng)險。Dropout層通過隨機(jī)斷開神經(jīng)元之間的連接來實現(xiàn)丟棄操作。在每個訓(xùn)練迭代中,Dropout層會隨機(jī)選擇一些神經(jīng)元進(jìn)行丟棄,并在前向傳播和反向傳播過程中不使用這些丟棄的神經(jīng)元。
4. 深度學(xué)習(xí)模型構(gòu)建
- 通過模塊堆疊將輸入層、中間層、輸出層連接,然后構(gòu)建模塊進(jìn)行初始化
- 訓(xùn)練模型
- 模型預(yù)測
5. 策略實現(xiàn)
本部分將介紹如何在BigQuant實現(xiàn)一個基于LSTM的選股策略文章來源:http://www.zghlxwxcb.cn/news/detail-648690.html
from biglearning.api import M
from biglearning.api import tools as T
from bigdatasource.api import DataSource
from biglearning.module2.common.data import Outputs
from zipline.finance.commission import PerOrder
import pandas as pd
import math
# LSTM模型訓(xùn)練和預(yù)測
def m4_run_bigquant_run(input_1, input_2, input_3):
df = input_1.read_pickle()
feature_len = len(input_2.read_pickle())
df['x'] = df['x'].reshape(df['x'].shape[0], int(feature_len), int(df['x'].shape[1]/feature_len))
data_1 = DataSource.write_pickle(df)
return Outputs(data_1=data_1)
# LSTM模型訓(xùn)練和預(yù)測的后處理
def m4_post_run_bigquant_run(outputs):
return outputs
# LSTM模型訓(xùn)練和預(yù)測
def m8_run_bigquant_run(input_1, input_2, input_3):
df = input_1.read_pickle()
feature_len = len(input_2.read_pickle())
df['x'] = df['x'].reshape(df['x'].shape[0], int(feature_len), int(df['x'].shape[1]/feature_len))
data_1 = DataSource.write_pickle(df)
return Outputs(data_1=data_1)
# LSTM模型訓(xùn)練和預(yù)測的后處理
def m8_post_run_bigquant_run(outputs):
return outputs
# 模型評估和排序
def m24_run_bigquant_run(input_1, input_2, input_3):
pred_label = input_1.read_pickle()
df = input_2.read_df()
df = pd.DataFrame({'pred_label':pred_label[:,0], 'instrument':df.instrument, 'date':df.date})
df.sort_values(['date','pred_label'],inplace=True, ascending=[True,False])
return Outputs(data_1=DataSource.write_df(df), data_2=None, data_3=None)
# 模型評估和排序的后處理
def m24_post_run_bigquant_run(outputs):
return outputs
# 初始化策略
def m19_initialize_bigquant_run(context):
# 從options中讀取數(shù)據(jù)
context.ranker_prediction = context.options['data'].read_df()
# 設(shè)置傭金費率
context.set_commission(PerOrder(buy_cost=0.0003, sell_cost=0.0013, min_cost=5))
stock_count = 30
# 根據(jù)股票數(shù)量設(shè)置權(quán)重
context.stock_weights = T.norm([1 / math.log(i + 2) for i in range(0, stock_count)])
context.max_cash_per_instrument = 0.9
context.options['hold_days'] = 5
# 處理每個交易日的數(shù)據(jù)
def m19_handle_data_bigquant_run(context, data):
# 獲取當(dāng)日的預(yù)測結(jié)果
ranker_prediction = context.ranker_prediction[
context.ranker_prediction.date == data.current_dt.strftime('%Y-%m-%d')]
is_staging = context.trading_day_index < context.options['hold_days']
cash_avg = context.portfolio.portfolio_value / context.options['hold_days']
cash_for_buy = min(context.portfolio.cash, (1 if is_staging else 1.5) * cash_avg)
cash_for_sell = cash_avg - (context.portfolio.cash - cash_for_buy)
positions = {e.symbol: p.amount * p.last_sale_price
for e, p in context.perf_tracker.position_tracker.positions.items()}
if not is_staging and cash_for_sell > 0:
equities = {e.symbol: e for e, p in context.perf_tracker.position_tracker.positions.items()}
instruments = list(reversed(list(ranker_prediction.instrument[ranker_prediction.instrument.apply(
lambda x: x in equities and not context.has_unfinished_sell_order(equities[x]))])))
for instrument in instruments:
context.order_target(context.symbol(instrument), 0)
cash_for_sell -= positions[instrument]
if cash_for_sell <= 0:
break
buy_cash_weights = context.stock_weights
buy_instruments = list(ranker_prediction.instrument[:len(buy_cash_weights)])
max_cash_per_instrument = context.portfolio.portfolio_value * context.max_cash_per_instrument
for i, instrument in enumerate(buy_instruments):
cash = cash_for_buy * buy_cash_weights[i]
if cash > max_cash_per_instrument - positions.get(instrument, 0):
cash = max_cash_per_instrument - positions.get(instrument, 0)
if cash > 0:
context.order_value(context.symbol(instrument), cash)
# 準(zhǔn)備工作
def m19_prepare_bigquant_run(context):
pass
# 獲取2020年至2021年股票數(shù)據(jù)
m1 = M.instruments.v2(
start_date='2020-01-01',
end_date='2021-01-01',
market='CN_STOCK_A',
instrument_list=' ',
max_count=0
)
# 使用高級自動標(biāo)注器獲取標(biāo)簽
m2 = M.advanced_auto_labeler.v2(
instruments=m1.data,
label_expr="""
shift(close, -5) / shift(open, -1)-1
clip(label, all_quantile(label, 0.01), all_quantile(label, 0.99))
where(shift(high, -1) == shift(low, -1), NaN, label)
""",
start_date='',
end_date='',
benchmark='000300.SHA',
drop_na_label=True,
cast_label_int=False
)
# 標(biāo)準(zhǔn)化標(biāo)簽數(shù)據(jù)
m13 = M.standardlize.v8(
input_1=m2.data,
columns_input='label'
)
# 輸入特征
m3 = M.input_features.v1(
features="""close_0/mean(close_0,5)
close_0/mean(close_0,10)
close_0/mean(close_0,20)
close_0/open_0
open_0/mean(close_0,5)
open_0/mean(close_0,10)
open_0/mean(close_0,20)"""
)
# 抽取基礎(chǔ)特征
m15 = M.general_feature_extractor.v7(
instruments=m1.data,
features=m3.data,
start_date='',
end_date='',
before_start_days=30
)
# 提取派生特征
m16 = M.derived_feature_extractor.v3(
input_data=m15.data,
features=m3.data,
date_col='date',
instrument_col='instrument',
drop_na=True,
remove_extra_columns=False
)
# 標(biāo)準(zhǔn)化基礎(chǔ)特征
m14 = M.standardlize.v8(
input_1=m16.data,
input_2=m3.data,
columns_input='[]'
)
# 合并標(biāo)簽和特征
m7 = M.join.v3(
data1=m13.data,
data2=m14.data,
on='date,instrument',
how='inner',
sort=False
)
# 將特征轉(zhuǎn)換成二進(jìn)制數(shù)據(jù)
m26 = M.dl_convert_to_bin.v2(
input_data=m7.data,
features=m3.data,
window_size=5,
feature_clip=5,
flatten=True,
window_along_col='instrument'
)
# 使用m4_run_bigquant_run函數(shù)運行緩存模式
m4 = M.cached.v3(
input_1=m26.data,
input_2=m3.data,
run=m4_run_bigquant_run,
post_run=m4_post_run_bigquant_run,
input_ports='',
params='{}',
output_ports=''
)
# 獲取2021年至2022年股票數(shù)據(jù)
m9 = M.instruments.v2(
start_date=T.live_run_param('trading_date', '2021-01-01'),
end_date=T.live_run_param('trading_date', '2022-01-01'),
market='CN_STOCK_A',
instrument_list='',
max_count=0
)
# 抽取基礎(chǔ)特征
m17 = M.general_feature_extractor.v7(
instruments=m9.data,
features=m3.data,
start_date='',
end_date='',
before_start_days=30
)
# 提取派生特征
m18 = M.derived_feature_extractor.v3(
input_data=m17.data,
features=m3.data,
date_col='date',
instrument_col='instrument',
drop_na=True,
remove_extra_columns=False
)
# 標(biāo)準(zhǔn)化基礎(chǔ)特征
m25 = M.standardlize.v8(
input_1=m18.data,
input_2=m3.data,
columns_input='[]'
)
# 將特征轉(zhuǎn)換成二進(jìn)制數(shù)據(jù)
m27 = M.dl_convert_to_bin.v2(
input_data=m25.data,
features=m3.data,
window_size=5,
feature_clip=5,
flatten=True,
window_along_col='instrument'
)
# 使用m8_run_bigquant_run函數(shù)運行緩存模式
m8 = M.cached.v3(
input_1=m27.data,
input_2=m3.data,
run=m8_run_bigquant_run,
post_run=m8_post_run_bigquant_run,
input_ports='',
params='{}',
output_ports=''
)
# 構(gòu)造LSTM模型的輸入層
m6 = M.dl_layer_input.v1(
shape='7,5',
batch_shape='',
dtype='float32',
sparse=False,
name=''
)
# 構(gòu)造LSTM模型的LSTM層
m10 = M.dl_layer_lstm.v1(
inputs=m6.data,
units=32,
activation='tanh',
recurrent_activation='hard_sigmoid',
use_bias=True,
kernel_initializer='glorot_uniform',
recurrent_initializer='Orthogonal',
bias_initializer='Zeros',
unit_forget_bias=True,
kernel_regularizer='None',
kernel_regularizer_l1=0,
kernel_regularizer_l2=0,
recurrent_regularizer='None',
recurrent_regularizer_l1=0,
recurrent_regularizer_l2=0,
bias_regularizer='None',
bias_regularizer_l1=0,
bias_regularizer_l2=0,
activity_regularizer='None',
activity_regularizer_l1=0,
activity_regularizer_l2=0,
kernel_constraint='None',
recurrent_constraint='None',
bias_constraint='None',
dropout=0,
recurrent_dropout=0,
return_sequences=False,
implementation='0',
name=''
)
# 構(gòu)造LSTM模型的Dropout層
m12 = M.dl_layer_dropout.v1(
inputs=m10.data,
rate=0.2,
noise_shape='',
name=''
)
# 構(gòu)造LSTM模型的全連接層1
m20 = M.dl_layer_dense.v1(
inputs=m12.data,
units=30,
activation='tanh',
use_bias=True,
kernel_initializer='glorot_uniform',
bias_initializer='Zeros',
kernel_regularizer='None',
kernel_regularizer_l1=0,
kernel_regularizer_l2=0,
bias_regularizer='None',
bias_regularizer_l1=0,
bias_regularizer_l2=0,
activity_regularizer='None',
activity_regularizer_l1=0,
activity_regularizer_l2=0,
kernel_constraint='None',
bias_constraint='None',
name=''
)
# 構(gòu)造LSTM模型的Dropout層2
m21 = M.dl_layer_dropout.v1(
inputs=m20.data,
rate=0.2,
noise_shape='',
name=''
)
# 構(gòu)造LSTM模型的全連接層2
m22 = M.dl_layer_dense.v1(
inputs=m21.data,
units=1,
activation='tanh',
use_bias=True,
kernel_initializer='glorot_uniform',
bias_initializer='Zeros',
kernel_regularizer='None',
kernel_regularizer_l1=0,
kernel_regularizer_l2=0,
bias_regularizer='None',
bias_regularizer_l1=0,
bias_regularizer_l2=0,
activity_regularizer='None',
activity_regularizer_l1=0,
activity_regularizer_l2=0,
kernel_constraint='None',
bias_constraint='None',
name=''
)
# 初始化LSTM模型
m34 = M.dl_model_init.v1(
inputs=m6.data,
outputs=m22.data
)
# 訓(xùn)練LSTM模型
m5 = M.dl_model_train.v1(
input_model=m34.data,
training_data=m4.data_1,
optimizer='RMSprop',
loss='mean_squared_error',
metrics='mae',
batch_size=256,
epochs=5,
n_gpus=0,
verbose='2:每個epoch輸出一行記錄'
)
# 使用LSTM模型進(jìn)行預(yù)測
m11 = M.dl_model_predict.v1(
trained_model=m5.data,
input_data=m8.data_1,
batch_size=1024,
n_gpus=0,
verbose='2:每個epoch輸出一行記錄'
)
# 使用m24_run_bigquant_run函數(shù)運行緩存模式
m24 = M.cached.v3(
input_1=m11.data,
input_2=m18.data,
run=m24_run_bigquant_run,
post_run=m24_post_run_bigquant_run,
input_ports='',
params='{}',
output_ports=''
)
# 執(zhí)行交易
m19 = M.trade.v4(
instruments=m9.data,
options_data=m24.data_1,
start_date='',
end_date='',
initialize=m19_initialize_bigquant_run,
handle_data=m19_handle_data_bigquant_run,
prepare=m19_prepare_bigquant_run,
volume_limit=0.025,
order_price_field_buy='open',
order_price_field_sell='close',
capital_base=1000000,
auto_cancel_non_tradable_orders=True,
data_frequency='daily',
price_type='后復(fù)權(quán)',
product_type='股票',
plot_charts=True,
backtest_only=False,
benchmark='000300.SHA'
)
文章來源地址http://www.zghlxwxcb.cn/news/detail-648690.html
到了這里,關(guān)于【量化課程】08_2.深度學(xué)習(xí)量化策略基礎(chǔ)實戰(zhàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!