- 交易
- 智能交易
- NetTradeX 智慧交易系統 (簡稱EA)
- 創建NTL+語言的神經網路
創建NTL+語言的神經網路
引言
人工神經網路 - 是由數學模型, 及其機器硬體和軟體的實現, 是基於生物神經網路的組合和功能 - 大腦的神經細胞網路.
當前神經網路應用廣泛, 例如識別,分類,聯合存儲,規律性的確定,預測等等.
神經網路需要單獨的數學或基於數學包的附加模型, 以便於提供不同類型和配置方案的網路結構
我們試圖基於NTL+語言重新創建自己的網路,並同時嘗試物件導向的程式設計.
問題選擇
在本文中我們來測試, 基於過去的燭圖可以預測未來柱圖的確定走勢: 下降或上漲。
這涉及分類問題。我們公司的金融工具允許使用歷史資料,以此獲得專業的評估。並創建基於多層感知的網路。
因此,根據k柱的收盤價創建網路而預測隨後燭圖的狀態. 如果其收盤價高於前一柱, 那麼取輸出值1(價格上漲)。在其他情況下,輸出值取0(價格沒有變化或下跌)。
網路建設
一般而言,多層感知具有一個輸入層,一個或多個隱藏層和一個輸出層。單個隱藏層足夠進行輸入轉為輸出. 使用更多數量的隱藏層只能導致網路學習速度明顯放緩, 而沒有顯著的學習品質.
在網路中保留1個輸入層, 一個隱藏層和一個輸出層. 在下面的圖中顯示網路的體系結構.
x1 - xn - 輸入 (收盤價), wi,j - 自節點i至j的邊緣權重;
y1 - ym 隱層神經元, o1 - ok 網路輸出.
網路也使用輸入偏移(偏移輸入). 使用這些輸入可以確保我們的網路沿x軸移動啟動的函數, 從而不僅改變啟動函數的斜率, 還可以保證線性偏移.
1. 啟動函數表 當 = 1
2. 啟動函數表 при =2 和 = 1
3. 啟動函數表, 偏移為 當=2, = 1 和 = 1
每個網路節點的值將按照下面的公式計算:
, где f(x) - 啟動函數, n - 前一層的節點數.
啟動函數
啟動函數來計算經過加法器之後獲得輸出信號。 人工神經元通常作為一個非線性函數的參數。最常用的啟動函數:
費米函數(S型指數):合理的S型:
雙曲正切
確定每個節點的輸出需要選擇合理的S型, 因其計算需要較少時間.
網路學習的過程
為了學習, 我們的神經網路實現了誤差的反向傳輸. 該方法是利用了多層感知達到誤差最小化的重複演算法. 演算法的主要思想是: 在神經網路輸出計算後, 計算每個節點和邊的誤差W的偏差, 並且錯誤的計算方法是由輸出端至輸入端. 之後按照誤差值校正權重W . 該演算法對啟動函數的唯一的要求是: 被微分. S型和雙曲正切滿足這一要求.
因此, 在學習的過程中, 我們需要做到以下幾點:
- 初始化所有邊的權重隨機值.
-
對於所有的輸出, 神經網路計算統計修正
, 其中 oj - 神經網路計算的輸出, tj - 實際值 - 除了最後一個節點, 其他都由下面的公式計算
, wj,k 節點輸出的邊的權重用於計算修正 節點計算的誤差位於兩個系那個林的輸出層. -
對於每個神經網路的邊計算修正:
, 其中oi 自邊的輸出的節點計算輸出 被計算的節點輸出, 用於計算修正, 而被計算的節點修正, 其中包括確定的邊. -
校正所有邊的權重值:
- 重複步驟2 - 5 , 針對所有學習的例子或暫時未達到品質準則的.
準備輸入資料
對於實現神經網路的學習需要準備輸入資料, 有品質的輸入值可以很好的影響網路的工作及其參數w的穩定速度, 也就是學習的過程.
所有的輸入向量被正常化, 以便起分量處於區間[0;1] 或 [-1;1]. 正常化使得所有輸入向量在網路學習的過程中是平等的, 從而保障學習的修正.
我們來正常化輸入向量 - 使其分量處於[0;1], 對此需要使用下列公式:
作為向量的分量, 將進入柱體的收盤價, 並且作為輸入移動至[n+k;n+1]柱體的收盤價, 其中k是輸入向量的大小. 希望值的確定基於n柱體. 其值大小的確定將遵循: 如果n柱的收盤價大於n+1柱的收盤價, 則取希望值為1, 如果低於或等於, 那麼取0;
在圖表中標出了黃色的柱體, 其參與組成每組資料(#1, #2), 橙色的是用於確定希望值.
在網路學習的過程中, 也會影響資料的次序也會影響學習的過程. 如果輸入向量均勻提供1和0,那麼學習的過程更穩定.
同樣形成了單獨的資料組, 用於評估網路工作的有效性. 這些資料網路不會用於學習, 僅用於按照最小二次方的方法計算錯誤. 在測試組資料添加10%的輸入例子. 其結果是90%例子將用學習, 10%用於評估.
最小二次方計算錯誤的功能有下列方式:
,
где - 網路輸出信號和 - 輸出信號的需要值.
查看準備為神經網路輸入向量的腳本代碼
分析DataSet類 - 資料組. 該類包括:
- 輸入值向量陣列 - input
- 生出輸出值- output
- Normalize 方法- 標準化(正常化)資料
- OutputDefine方法- 確定價格的實際值
- AddData方法- 在輸入向量的記錄值和變數的實際值
- To_file 方法 - 單矩陣的資料組, 針對下一條目
我們來看Run()函數的程式碼, 其實現下列步驟:
- 載入歷史資料. 包括圖表的字元和時期.
- 截資料組為輸入向量+ 輸出值的長度
- 形成輸入向量的資料組. 標準化這些向量. 確定希望值是1或0.
- 形成輸入向量, 相對對於0和1
- 資料組主要部分的記錄和用於測試的其餘部分的記錄, 並通過最小二次方的方法進行評估.
在本文中, 您還需要聲明一個全域變數int state = 0
, 需要存在輪換的輸入向量.
創建神經網路的種類
對於我們的網路需要:
- 聯合輸入層和隱藏層的類layer
- 聯合隱藏層和輸出層的類layer
- 連接各層的類 net
創建類layer-層
我們需要包含下列屬性和方法的類:
- 保存神經網路的輸入'input'陣列
- 保存神經網路的輸出'output'陣列
- 保存神經網路的修正'delta'陣列
- 所有邊的權重'weights' 的雙層陣列
- 'LoadInputs'方法賦值輸入層
- 'LoadWeights'方法載入層的權重
- 'SaveWeights'方法保存層的權重至硬碟中
- 選出使用陣列所需要的記憶體
- 'RandomizeWeights'方法, 填寫權重隨機值
- 'OutputCalculation'方法,計算輸出值
- 'CalculatingDeltaLast' 和 CalculatingDeltaPrevious方法, 計算修正值
- 'WeightsCorrection'方法, 修正權重值
- 補充(診斷)方法, 輸出資訊至螢幕.:
- PrintInputs() - 列印輸入層
- PrintOutputs() - 列印輸出層 ('OutputCalculation'幫助下, 在計算輸出之後打開)
- PrintDelta() - 列印層的修正(在'CalculatingDeltaLast' 或 'CalculatingDeltaPrevious'幫助下, 在計算修正之後打開)
- PrintWeights() - 列印層的權重w
- 'Calculate'方法, 連接層來計算網路的輸出. 該方法將用於網路的學習.
- 'CalculateAndLearn'方法, 計算輸出, 修正和錯誤. 計算輸出您需要使用前一個方法, 而對於修正和錯誤您需要引用每個層的相應的方法
- 'SaveNetwork '方法, 保存網路的參數.
- 'LoadNetwork'方法, 載入網路的參數.
- 創建net類的對象NT
- 校對參數w 並載入至NT
- 創建陣列的網路輸出和輸入
- 校對輸入值並置於陣列'x'中, 校對輸入並置於'reals'
- 計算網路的輸出, 提供給數位'x'
- 計算錯誤error, 所有計算值和實際值差異的平方和
- 當臨近檔結尾, 輸出錯誤值並退出腳本
所得類放置在單獨的檔中. 此外, 在該檔中將存儲的網路配置: 輸入層, 隱藏層和輸出層的節點數量. 這些變數被取出使得同樣用於準備輸入資料的腳本.
我們還需要輔助的功能: 標準化輸入向量和啟動功能
創建網路的類net
我們還需要這樣的類, 即可以統一層和唯一的網路, 因此這樣的類需要包括:
檢查網路的工作
在本節中,我們以一個基本的例子來檢查網路的工作, 在其幫助下我們可以確定輸出向量的正確分類. 對此將使用2個輸入層和隱藏層, 1個輸出層的神經網路. 參數nu 設置為1. 輸入資料的集如下:
輸入 1,2 和希望值 1
輸入 2,1 和希望值 0
在文找中將是如下形式::
輸入不同數量的學習的例子, 可以看到我們的網路學習的過程.
圖中紅線對應1的學習例子. 藍線 - 對應0. 根據各自橫軸截取學習的例子, 根據縱軸計算學習例子的網路值. 可以看出, 如果例子的數量少(25及其以下)網路不能差別不同的輸入向量, 如果數量多- 很明確的分為兩類.
評估網路
為了評估學習的效果, 我們使用最小二次方的方法計算錯誤. 對此要創建具有以下代碼的實用程式並運行它. 在此添加2個文件: "test.txt" - 計算錯誤時用到的資料和希望值, "NT.txt" - 已計算參數的文件.
該腳本完成下列步驟:
顯示的長條圖反映下一個柱圖的預期. 值從0.5-1說明下一個柱圖很有可能是下降的. 值從0至0.5則說明下一個柱圖很有可能是上漲的. 0.5對應的是不確定. 即下一個柱圖可能上漲, 也可能下降.
概要
神經網路是技術分析的強大工具. 在本文中展示了通過NTL+利用物件導向的語言來創建神經網路的過程. 使用物件導向的方法使得簡化代碼, 並更容易用在未來的腳本中. 在實踐中, 我們創建了類 layer 描述神經網路的層和類net描述整體的網路. 類net我們用於確定錯誤數量和計算權重的指標. 此外還舉例展示了如何利用學習網路.