一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

深度神經(jīng)網(wǎng)絡(luò)在量化交易里的應(yīng)用

 長江黃鶴 2018-05-30

[提要] 

  隨著人工智能技術(shù)的快速發(fā)展, 深度學(xué)習(xí),強化學(xué)習(xí)等技術(shù)不斷進入各行各業(yè)。金融領(lǐng)域也不例外,利用深度學(xué)習(xí)進行大數(shù)據(jù)挖掘,分析客戶的畫像,提供對應(yīng)的金融服務(wù)已經(jīng)在現(xiàn)實中使用。在金融交易領(lǐng)域其中一個分支量化交易(金融工程)采用相關(guān)的人工智能技術(shù),必將大勢所趨。本文主要是針對證券期貨交易的量化交易采用深度神經(jīng),卷積神經(jīng)網(wǎng)絡(luò)在交易信號選取的一個落地應(yīng)用。深度學(xué)習(xí)和金融工程都是屬于高精尖專業(yè),不足不周之處請勘正。

關(guān)鍵詞:金融工程, 量化交易,深度學(xué)習(xí),卷積神經(jīng)網(wǎng)絡(luò),VGG

[引言,背景] 

  在量化交易系統(tǒng)中, 一般系統(tǒng)分為三個部分: 交易信號(模式識別), 持倉控制, 資金管理。交易信號指的是,在什么時間點,買入什么股票(本文均已股票二級市場,且為散戶的角度做說明)。持倉控制是指在買入股票后,根據(jù)后期的股票走勢進行,加倉,減倉,平倉等操作。而資金管理,是對許多交易策略進行資金分配,用來保證資金在固定時間周期內(nèi)達到最低的風(fēng)險和最大的收益平衡。下文是利用卷積神經(jīng)網(wǎng)絡(luò)對交易信號的識別。

[正文] 

  人類識別股票行情的方式是直觀的,擬態(tài)的, 比如多根均線向上, 均線交叉,多根陽線,多根陰線等。 傳統(tǒng)的量化交易把這些抽象的圖提取成數(shù)學(xué)數(shù)據(jù), 再用條件判斷,形成信號。再利用統(tǒng)計學(xué),統(tǒng)計后期的收益情況來分析信號的性能(準(zhǔn)確率)。在深度學(xué)習(xí)領(lǐng)域里, AI已經(jīng)能高概率的識別數(shù)字, 圖像內(nèi)容。 那人工智能是否能(依靠圖像感知,而非數(shù)據(jù)的表示)識別,讀懂金融的k線, 折線呢?答案是肯定的。(以下試驗論述會有較多多的神經(jīng)網(wǎng)絡(luò)和編程術(shù)語)

    我們將一個股票的當(dāng)天分時線提取成 48 個5分鐘的k線,再根據(jù)k線繪制成圖像。如下: 

我們將日內(nèi)走勢分型, 暫分為: 橫盤震蕩,  上行, 下行, V形, A形, 例如:

 

 

我們根據(jù)2017年上半年實際滬深行情, 制作了40多萬個日內(nèi)圖, 并對其中10萬個圖進行了機器 + 人工標(biāo)識。 我們得到了10萬個訓(xùn)練/測試數(shù)據(jù)。

數(shù)據(jù)內(nèi)容 :  480x480 分辨率的圖片 + 對應(yīng)的分型標(biāo)識(0,1,2,3,4 )

我們的試驗內(nèi)容:把10萬個數(shù)據(jù)扔給卷積神經(jīng)網(wǎng)絡(luò)進行訓(xùn)練; 用另外的 1000 個數(shù)據(jù)進行測試(測試數(shù)據(jù)不參與訓(xùn)練)。  

試驗結(jié)果:VGG卷積神經(jīng)網(wǎng)絡(luò)的準(zhǔn)確為:94%(尚未調(diào)優(yōu))。(實際實驗數(shù)據(jù)目前為 4800)。

 

在試驗過程中,我們碰到許多問題, 把這些問題也簡單的羅列一下,以便再研究深度學(xué)習(xí)的同學(xué),同行,不再踩坑。

A. 內(nèi)存溢出: 剛開始采用 480 x 480, 3 的數(shù)據(jù), 直接顯卡內(nèi)存不夠 (out of memory )。 解決方法:調(diào)成 240x240,1 


B. 訓(xùn)練時間過長:48000 個數(shù)據(jù),1輪學(xué)習(xí) 需要 4 個小時左右, 如果整個 30 輪, 那還不瘋掉,需要等個4,5天才知道結(jié)果。
解決辦法:
1). 降低數(shù)據(jù)維度 480->240->120->28 ,
2).  放大卷積核 3x3 ->5x5->7x7  , 從文件讀取 --- > 一次讀入內(nèi)存再訓(xùn)練

C. 梯度不下降:這個是做深度學(xué)習(xí)最要命的問題。
解決辦法:
1. 變更模型,調(diào)超參數(shù);  
2.圖像變換(裁剪成核心數(shù)據(jù)圖片), 圖像反色, 圖像歸1(0~
1)

最后效率和結(jié)果: 45000 個圖片。 圖像縮小到 28x28。20分鐘左右,跑完一次訓(xùn)練/預(yù)測。 

遺留問題:
  圖像縮小是否會影響判斷的準(zhǔn)確率?這個問題需要在細化求精的過程中,反復(fù)試驗驗證了。準(zhǔn)確率是否能提高,我相信肯定能提高。(我會在最后開源代碼和數(shù)據(jù),有興趣的朋友可以用更牛x的網(wǎng)絡(luò)模型,提升準(zhǔn)確率。如能提高希望能在blog留言)。

[用途,意義]

1. 機器可以根據(jù)人的前期指導(dǎo), 學(xué)會判別走勢形態(tài)。有別于傳統(tǒng)的數(shù)值分類統(tǒng)計的判別。判別的結(jié)果是一個可能性,比如80%,而傳統(tǒng)的為1,0.

2. 可以根據(jù)我上述論文的原理進行特定模型學(xué)習(xí)。 參考建議: 把特征進行二分類, 包含有你特征的圖片定義為1, 其它圖形為0;  進行訓(xùn)練學(xué)習(xí)。以此得到模型識別器

3. 對于量化交易系統(tǒng)行業(yè)是一次革命性的提升, 因為它具有更強的泛化性。 它的使用可以使程序開發(fā)人員和策略開發(fā)人員 一定的程度的分開。 策略師不再依靠程序員一個思路一個思路編寫一個程序(指標(biāo))。這一點對于 大智慧/通達信 提供神經(jīng)網(wǎng)絡(luò)機構(gòu)版,是一個相當(dāng)不錯的思路。機構(gòu)策略開發(fā)變成了,不斷選取入場點。(還有一個在期貨交易上也有貌似不錯的點子)。 

[總結(jié)]     

深度神經(jīng)網(wǎng)絡(luò)(卷積神經(jīng) CNN) 在量化交易里的模式(圖形)識別效果較好。 相信不久的將來, 深度神經(jīng)網(wǎng)絡(luò)的相關(guān)技術(shù)會不斷進入金融工程(量化交易)這個領(lǐng)域。

[代碼

導(dǎo)入相關(guān)庫

# -*- coding: UTF-8 -*-
print(__doc__)
'''
    author : hylas
    date:2017/8/19
    discp: 用cnn給證券的行情進行分類, 未來用來識別當(dāng)天的行情或者檢測某個特殊的特征模型
'''
import sys
import os
import time
from keras.utils import np_utils
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Dropout
import numpy as np
import PIL.Image as Image
import keras
from keras.layers import Conv2D, MaxPooling2D
from keras.optimizers import SGD
from keras.models import load_model
from keras.layers import Dense, Dropout, Flatten
from keras.utils import np_utils
pngRootPath ='/home/hylas/dev/data/min5_png/'
imgWidth  =480
imgHeitht =480
nWidth  = 28
nHeight = 28
nCannle = 1
input_dim = (nWidth, nHeight, nCannle )
# 卷積層中使用的卷積核的個數(shù)
nb_filters = 32
# 卷積核的大小
kernel_size = (3, 3)
# 池化層操作的范圍
pool_size = (2, 2)
nEpochs = 20
batch_size = 32
samples_per_epoch= 48000
#samples_per_epoch= 9600

網(wǎng)絡(luò)模型

#  類似VGG的卷積神經(jīng)網(wǎng)絡(luò):   Conv2D --> Conv2D --> MaxPooling2D --> Conv2D --> Conv2D --> MaxPooling2D
#   --> Flatten -->Dense(256) -->Dense(10)
def BuildMode_VGG():
    print 'input_dim:', input_dim
    model = Sequential()
    model.add(Conv2D(nb_filters , kernel_size, activation='relu', input_shape= input_dim   ))
    model.add(Conv2D(nb_filters , kernel_size, activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))
    model.add(Conv2D( nb_filters*2 , kernel_size,  activation='relu'))
    model.add(Conv2D( nb_filters*2 , kernel_size,  activation='relu'))
    model.add(MaxPooling2D(pool_size=  pool_size   ))
    model.add(Dropout(0.25))
    model.add(Flatten())
    model.add(Dense(256, activation='relu'))
    model.add(Dropout(0.5))
    model.add(Dense(5, activation='softmax'))
    print model.summary()
    #return
    sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
    model.compile(loss='categorical_crossentropy', optimizer=sgd)
    return model

訓(xùn)練神經(jīng)網(wǎng)絡(luò)及測試神經(jīng)網(wǎng)絡(luò)

def do2_fit_mem():
    t = time.time()
    #X,y = generate2mem( 'png_file_list.csv',  samples_per_epoch)
    X, y = loaddatafromdisk()
    print type(X), type(y)
    print X.shape ,  y.shape
    print 'time:' , time.time() - t
    model = BuildMode_VGG()
    #print generate_arrays_from_file('png_file_list.csv', batch_size  )
    model.fit(  X,y, batch_size,  nb_epoch= nEpochs,     verbose=1 , validation_split=0.10   )
    model.save('stock_vgg2_'+ time.strftime('vgg2_%Y-%m-%d-%X', time.localtime()) +'.h5')
    x_test=X[:1000]
    y_test=y[:1000]
    x_test, y_test = loadtestdatafromdisk()
    testModle(model, x_test, y_test, batch_size= batch_size )

其它代碼:

def loaddatafromdisk():
    data = np.loadtxt('data_table_' + str(samples_per_epoch) + '_x.txt' )
    print 'from:', data.shape
    data = data.reshape(  (samples_per_epoch, 28,28,1)   )
    print  'to:', data.shape
    y =  np.loadtxt('data_table_' + str(samples_per_epoch) + '_y.txt' )
    return  data,y
def loadtestdatafromdisk():
    data = np.loadtxt('data_table_test_x.txt' )
    print 'from:', data.shape
    data = data.reshape(  (1000, 28,28,1)   )
    print  'to:', data.shape
    y =  np.loadtxt('data_table_test_y.txt' )
    return  data,y
def testModle(model, x_test ,y_test, batch_size= 32 ):
    y_pret= model.predict(x_test , batch_size= batch_size  )
    y_pret[0] =  y_pret[0] / y_pret[0].max()
    y_pret[0][(y_pret[0] != y_pret[0].max() )  ] = 0
    print y_pret[0]
    y_pret_ex =  y_pret.copy()
    for in range(0, len( y_pret ) ):
        y_pret_ex[i] = y_pret_ex[i] / y_pret_ex[i].max()
        y_pret_ex[i][(y_pret_ex[i] != y_pret_ex[i].max())] = 0
    print '------------------------------------'
    #print y_pret_ex[:10]
    #print y_pret[:10]
    test_accuracy = np.mean(np.equal(y_test, y_pret_ex))
    print("accuarcy:", test_accuracy)
def test():
    do2_fit_mem()
    pass
if __name__ == "__main__":
    sys_code_type = sys.getfilesystemencoding()
    test()

代碼補充說明:

代碼文件: 一份為最終整理代碼, 一份包含調(diào)測過程,圖片處理可做參考。

下載


相關(guān)截圖:

網(wǎng)絡(luò)模型參數(shù)

 

訓(xùn)練過程

 

預(yù)測分類成績:

數(shù)據(jù)下載:

 下載 http://pan.baidu.com/s/1mifxQNu

 

個人群: 杭州程序化交易群  375129936


    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    日韩无套内射免费精品| 亚洲内射人妻一区二区| 国产又大又黄又粗的黄色| 欧美尤物在线视频91| 亚洲国产中文字幕在线观看| 绝望的校花花间淫事2| 亚洲午夜精品视频在线| 亚洲第一视频少妇人妻系列| 成人欧美精品一区二区三区| 欧美在线观看视频三区| 亚洲一区二区三区在线免费 | 中国美女偷拍福利视频| 亚洲国产成人av毛片国产| 大尺度剧情国产在线视频| 欧美视频在线观看一区| 欧美激情中文字幕综合八区| 熟女一区二区三区国产| 夫妻激情视频一区二区三区| 国产精品激情在线观看| 久久精品国产在热亚洲| 香蕉网尹人综合在线观看 | 精品少妇人妻av免费看| 在线亚洲成人中文字幕高清 | 亚洲av首页免费在线观看| 不卡免费成人日韩精品| 我的性感妹妹在线观看| 美女极度色诱视频在线观看| 久久福利视频视频一区二区| 精品少妇一区二区视频| 中文字幕精品一区二区三| 国产精品偷拍视频一区| 国产成人午夜福利片片| 91欧美亚洲精品在线观看| 精品国产91亚洲一区二区三区| 国产一二三区不卡视频| 午夜福利精品视频视频| 好吊日在线观看免费视频| 99在线视频精品免费播放| 91麻豆精品欧美视频| 亚洲欧洲精品一区二区三区| 亚洲精品欧美精品日韩精品|