當前位置:首頁 » 價格知識 » rnn預測股票價格

rnn預測股票價格

發布時間: 2021-04-24 12:41:34

❶ lstm做交通預測的輸入輸出是什麼樣的

間序列預測分析就是利用過去一段時間內某事件時間的特徵來預測未來一段時間內該事件的特徵。這是一類相對比較復雜的預測建模問題,和回歸分析模型的預測不同,時間序列模型是依賴於事件發生的先後順序的,同樣大小的值改變順序後輸入模型產生的結果是不同的。
舉個栗子:根據過去兩年某股票的每天的股價數據推測之後一周的股價變化;根據過去2年某店鋪每周想消費人數預測下周來店消費的人數等等
RNN 和 LSTM 模型
時間序列模型最常用最強大的的工具就是遞歸神經網路(recurrent neural network, RNN)。相比與普通神經網路的各計算結果之間相互獨立的特點,RNN的每一次隱含層的計算結果都與當前輸入以及上一次的隱含層結果相關。通過這種方法,RNN的計算結果便具備了記憶之前幾次結果的特點。
典型的RNN網路結構如下:

❷ 深度學習的主要分類是什麼呀這些網路cnn dbn dnm rnn是怎樣的關系

簡單來說:

1)深度學習(Deep Learning)只是機器學習(Machine Learning)的一種類別,一個子領域。機器學習 > 深度學習

2)大數據(Big Data)不是具體的方法,甚至不算具體的研究學科,而只是對某一類問題,或需處理的數據的描述

具體來說:

1)機器學習(Machine Learning)是一個大的方向,裡麵包括了很多種 approach,比如 deep learning, GMM, SVM, HMM, dictionary learning, knn, Adaboosting...不同的方法會使用不同的模型,不同的假設,不同的解法。這些模型可以是線性,也可以是非線性的。他們可能是基於統計的,也可能是基於稀疏的....

不過他們的共同點是:都是 data-driven 的模型,都是學習一種更加 abstract 的方式來表達特定的數據,假設和模型都對特定數據廣泛適用。好處是,這種學習出來的表達方式可以幫助我們更好的理解和分析數據,挖掘數據隱藏的結構和關系。

Machine Learning 的任務也可以不同,可以是預測(prediction),分類(classification),聚類(clustering),識別(recognition),重建(reconstruction),約束(regularization),甚至降噪(denoising),超分辨(super-resolution),除馬賽克(Demosaicing)等等....

2)深度學習(Deep Learning)是機器學習的一個子類,一般特指學習高層數的網路結構。這個結構中通常會結合線性和非線性的關系。

Deep Learning 也會分各種不同的模型,比如 CNN, RNN, DBN...他們的解法也會不同。

Deep Learning 目前非常流行,因為他們在圖像,視覺,語音等各種應用中表現出了很好的 empirical performance。並且利用 gpu 的並行運算,在模型相當復雜,數據特別大量的情況下,依然可以達到很理想的學習速度。

因為 Deep Learning 往往會構建多層數,多節點,多復雜度的模型,人們依然缺乏多裡面學習的結構模型的理解。很多時候,Deep Learning 甚至會被認為擁有類似於人類神經網路的結構,並且這種類似性被當做 deep learning 居然更大 potential 的依據。但答主個人認為,其實這略有些牽強...聽起來更像是先有了這種 network 的結構,再找一個類似性。當然,這僅僅是個人觀點...(私貨私貨)

3)大數據(Big Data,我們也叫他逼格數據....)是對數據和問題的描述。通常被廣泛接受的定義是 3 個 V 上的「大」:Volume(數據量), Velocity(數據速度)還有 variety(數據類別)。大數據問題(Big-data problem)可以指那種在這三個 V 上因為大而帶來的挑戰。

Volume 很好理解。一般也可以認為是 Large-scale data(其實學術上用這個更准確,只是我們出去吹逼的時候就都叫 big data 了...)。「大」可以是數據的維度,也可以是數據的 size。一般 claim 自己是 big-data 的演算法會比較 scalable,復雜度上對這兩個不敏感。演算法和系統上,人們喜歡選擇並行(Parallel),分布(distributed)等屬性的方法來增加 capability。
ITjob----採集

❸ 什麼是波動率指數

1987的全球股災後,為穩定股市與保護投資者,紐約證券交易所(NYSE)於1990年引進了斷路器機制(Circuit-breakers),當股價發生異常變動時,暫時停止交易,試圖降低市場的波動性來恢復投資者的信心。但斷路器機制引進不久,對於如何衡量市場波動性市場產生了許多新的認識,漸漸產生了動態顯示市場波動性的需求。因此,在NYSE採用斷路器來解決市場過度波動問題不久,芝加哥期權交易所從1993年開始編制市場波動率指數(Market Volatility Index,VIX),以衡量市場的波動率。
CBOE 在1973年4月開始股票期權交易後,就一直有通過期權價格來構造波動率指數的設想,以反映市場對於的未來波動程度的預期。其間有學者陸續提出各種計算方法,Whaley(1993)[1] 提出了編制市場波動率指數作為衡量未來股票市場價格波動程度的方法。同年,CBOE開始編制VIX 指數,選擇S&P100 指數期權的隱含波動率為編制基礎,同時計算買權與賣權的隱含波動率,以考慮交易者使用買權或賣權的偏好。
VIX表達了期權投資者對未來股票市場波動性的預期,當指數越高時,顯示投資者預期未來股價指數的波動性越劇烈;當VIX指數越低時,代表投資者認為未來的股價波動將趨於緩和。由於該指數可反應投資者對未來股價波動的預期,並且可以觀察期權參與者的心理表現,也被稱為「投資者情緒指標」(The investor fear gauge )。經過十多年的發展和完善,VIX指數逐漸得到市場認同,CBOE於2001年推出以NASDAQ 100指數為標的的波動性指標 (NASDAQ Volatility Index ,VXN); CBOE2003年以S&P500指數為標的計算VIX指數,使指數更貼近市場實際。2004年推出了第一個波動性期貨(Volatility Index Futures)VIX Futures, 2004年推出第二個將波動性商品化的期貨,即方差期貨 (Variance Futures),標的為三個月期的S&P500指數的現實方差(Realized Variance)。2006年,VIX指數的期權開始在芝加哥期權交易所開始交易
計算波動率指數(VIX)需要的核心數據是隱含波動率,隱含波動率由期權市場上最新的交易價格算出,可以反映市場投資者對於未來行情的預期。其概念類似於債券的到期收益率(Yield To Maturity):隨著市場價格變動,利用適當的利率將債券的本金和票息貼現,當債券現值等於市場價格時的貼現率即為債券的到期收益率,也就是債券的隱含報酬率。在計算過程中利用債券評價模型,通過使用市場價格可反推出到期收益率,這一收益率即為隱含的到期收益率。

❹ 實際波動率的概念

要明確實際波動率,首先要從波動率的概念入手。波動率(Volatility):是指關於資產未來價格不確定性的度量。它通常用資產回報率的標准差來衡量。也可以指某一證券的一年最高價減去最低價的值再除以最低價所得到的比率。業內將波動率定義為價格比率自然對數的標准差。波動率的種類有:實際波動率,隱含波動率,歷史波動率等等,實際波動率便是波動率的一種。

❺ 如何運用機器學習解決復雜系統的預測問題

現實生活中預測通常難做到精準,比如股市,自然災害, 長久的天氣預測。

在市場這種系統里, 有兩個關鍵要素, 一個是個體和個體之間的互相作用(博弈),一個是系統與外部環境(地球資源)之間的相互作用(反饋),因此而形成復雜模式(Pattern), 這種模式通常很難預測。
而這種類型的系統我們通常定義為復雜系統: 由大量單元互相作用組成的系統, 由於集體行為的非線性(總體不等於個體之和), 而形成具備無數層級的復雜組織。或者稱為涌現性。
復雜科學即研究復雜系統的一套聯系不同尺度現象的數學方法。在人類試圖理解那些和自身生存最相關的東西時,而經典物理學的還原論(把整體拆成部分)思維的卻不適用。物理預測的核心方法是動力學方法, 即人們由實驗出發抽象出引起運動改變的原因, 把這些原因量化為變數,用微分方程來描述, 從而取得對整個未來的精確解,如麥克斯韋方程組可以預測從光波的速度到磁線圈轉動發電任何的電磁學現象。而你卻無法通過了解市場上每個人的特性就很好的預測整個市場走勢。
復雜系統難以預測的原理可以從以下幾方面理解:
1, 高維詛咒: 構成現實生活的系統往往被大量未知變數決定, 比如生物由無數的細胞組成。 基因,是由無數獨立的單元組成的, 市場, 由無數的交易者組成, 這些用物理的描述方法來預測, 就是極高維度空間的運動問題。維度,首先使得再簡單的方程形式都十分復雜難解。
此處補充維度的科學定義: 維度是一個系統里可以獨立變化的變數個數, 一個有非常多變數的系統,如復雜網路,假如每個變數不是互相獨立,也可以是低維系統。 比如一個軍營里的方陣,即使人數眾多, 也會因為大家都做著一模一樣的動作,而只有一個獨立變數,成為一維系統。
2, 非線性詛咒:高維度系統的維度之間具有復雜的相互作用,導致我們不能把系統分解為單一維度然後做加法的方法研究。 高維加上非線性我們將得到對初級極為敏感的混沌系統。

非線性的一個重要推論是組織的產生, 因為非線性,1+1可以大於2或小於2, 為組織的產生提供了理論基礎。
3, 反饋詛咒: 復雜系統中反饋無處不在, 即使是一個簡單的一維系統, 反饋也可以使得系統的特性很豐富, 最典型的反饋是某種記憶效應, 使得系統產生復雜的路徑依賴, 此刻你的現實與歷史深刻關聯,而關聯方法導致復雜的模式產生。
反身性是一種由預測產生的特殊反饋, 當你預測股市的價格, 會引起你的交易策略變化從而影響你的預測, 是為反身性。
4, 隨機詛咒: 復雜系統往往含有不包含確定規律的隨機雜訊,加上這些雜訊, 系統的行為更加難預測, 而很多時候, 我們也無法區分一個系統里發現的模式是雜訊導致還是由於元件之間的相互作用。
這四大詛咒是這些系統難以理解和預測的原因, 而這個時候, 復雜系統和機器學習的方法論可以作為一種非常有力的手段幫我們從復雜性中挖掘模式。
第一種方法叫模型驅動(Model approch), 即想辦法找到事物變化的原因, 用一種降維的思路列出微分方程, 即從非常繁復的要素中化簡出最重要的一個或者兩個, 從而化繁瑣為簡單,不管三七二十一先抓住主要矛盾。其中的範例便是非線性動力學。
註: 此處我們有兩個基本假設讓非線性動力學得到簡化,一個是只討論連續變數,另一個是不考慮系統內的隨機性(無雜訊項)。
1, 如果一個系統可以化簡到一維, 那麼你只需要研究其內部存在的反饋性質並描述它即可。 負反饋導致穩定定點產生, 正反饋導致不穩定性。 很多事物多可以抽象為一維系統,包括簡單環境下的人口增長問題。
2, 如果一個系統可以化簡到二維, 那麼你需要研究兩個維度間的相互作用,最終可以互為負反饋而穩定下來,互為正反饋而爆發,或者產生此消彼長的周期軌道。 比如戀愛中的男女是個二維系統, 互為負反饋就回到普通朋友, 互為正反饋在愛欲中爆發-比如羅密歐與朱麗葉, 此消彼長那是玩捉迷藏的周期游戲。
3, 如果一個系統是三維的, 則混沌可能產生。 混沌即對初值極為敏感的運動體系。 你一旦偏離既定軌道一點, 即幾乎無法回去。
4, 如果一個系統大於三維, 那麼你需要用一個復雜網路描述它的運動, 這個時候我們可以得到我們復雜系統的主角- collective phenomena & emergence。 復雜網路的性質主要取決於單體間相互作用的方式, 以及系統與外界交換能量的方法, 這兩者又息息相關。 最終我們得到涌現。

復雜網路的動力學往往混沌難以預測,對於高維混沌系統, 第一個方法也只能給出對事物定性的描述, 而我們可以祭出我們的第二種方法: 先不管數據背後錯綜復雜的動因,而是直接以數據驅動我們的預測。
這其中的哲學內涵即貝葉斯分析框架: 即先不預測, 而是列出所有可能的結果及根據以往知識和經驗每種結果發生的可能性(先驗概率),之後不停吸收新觀測數據, 調整每種可能結果的概率大小(後驗概率),將想得到的結果概率最大化(MAP)最終做出決策。
如果你把貝葉斯分析的框架自動化, 讓電腦完成, 你就得到機器學習的最基本框架。
機器學習如果可以進入一個問題中, 往往要具備三個條件:
1, 系統中可能存在模式
2, 這種模式不是一般解析手段可以猜測到的。
3, 數據可以獲取。
如果三點有一點不符,都很難運用機器學習。
機器學習的一個核心任務即模式識別, 也可以看出它和剛才講的復雜系統提到的模式的關系。我們講復雜系統難以通過其成分的分析對整體進行預測,然而由於復雜系統通常存在模式, 我們通常可以模式識別來對系統進行歸類, 並預測各種可能的未來結果。比如一個投行女因為工作壓力過大而自殺了, 那麼在她之前的活動行為數據(比如點擊手機的某些app的頻率)里是否可能存在某種模式? 這種模式是否可以判定她之後的行為類型? 並且這個過程可否通過歷史數據由計算機學習?如果都可以,這就是一個機器學習問題。
剛才講的幾大詛咒, 高維, 非線性, 復雜反饋,隨機性也稱為機器學習需要核心面對的幾大困難, 由此得到一系列機器學習的核心演算法。

機器學習在現實生活中被用於非常多的方面, 最常見的如商務洞察(分類,聚類, 推薦演算法), 智能語音語義服務(時間序列處理,循環網路), 各種自動鑒別系統如人臉識別,虹膜識別 ,癌症檢測(深度卷積網路), 阿爾法狗,機器人控制(深度強化學習演算法)。 而由方法論分, 又可以分成有監督學習, 無監督學習, 和強化學習。

在八月份的巡洋艦科技的《機器學習vs復雜系統特訓課》中,我著重講了幾種機器學習的基本方法:
1. 貝葉斯決策的基本思想:
你要讓機器做決策, 一個基本的思路是從統計之前數據挖掘已有的模式(pattern)入手, 來掌握新的數據中蘊含的信息。 這個pattern在有監督學習的例子里, 就是把某種數據結構和假設結論關聯起來的過程,我們通常用條件概率描述。 那麼讓機器做決策, 就是通過不停的通過新數據來調整這個數據結構(特徵)與假設結果對應的條件概率。通常我們要把我們預先對某領域的知識作為預設(prior),它是一個假設結果在數據收集前的概率密度函數,然後通過收集數據我們得到調整後的假設結果的概率密度函數, 被稱為後驗概率(posterior),最終的目標是機器得到的概率密度函數與真實情況最匹配, 即 Maximum a posterior(MAP), 這是機器學習的最終目標。
2, 樸素貝葉斯分類器到貝葉斯網路:
分類,是決策的基礎,商業中要根據收集客戶的消費特徵將客戶分類從而精準營銷。 金融中你要根據一些交易行為的基本特徵將交易者做分類。 從貝葉斯分析的基本思路出發我們可以迅速得到幾種分類器。
首當其沖的樸素貝葉斯分類器,它是機器學習一個特別質朴而深刻的模型:當你要根據多個特徵而非一個特徵對數據進行分類的時候,我們可以假設這些特徵相互獨立(或者你先假設相互獨立),然後利用條件概率乘法法則得到每一個分類的概率, 然後選擇概率最大的那個作為機器的判定。
圖: 樸素貝葉斯分類器的基本框架, c是類別, A是特徵。
如果你要根據做出分類的特徵不是互相獨立,而是互相具有復雜關聯,這也是大部分時候我們面臨問題的真相, 我們需要更復雜的工具即貝葉斯網路。 比如你對某些病例的判定, 咳嗽, 發燒, 喉嚨腫痛都可以看做扁條體發炎的癥候, 而這些癥候有些又互為因果, 此時貝葉斯網路是做出此類判定的最好方法。構建一個貝葉斯網路的關鍵是建立圖模型 , 我們需要把所有特徵間的因果聯系用箭頭連在一起, 最後計算各個分類的概率。

圖:貝葉斯網路對MetaStatic Cancer的診斷,此處的特徵具有復雜因果聯系
貝葉斯分析結合一些更強的假設,可以讓我們得到一些經常使用的通用分類器, 如邏輯斯提回歸模型,這里我們用到了物理里的熵最大假設得到玻爾茲曼分布, 因此之前簡單貝葉斯的各個特徵成立概率的乘積就可以轉化為指數特徵的加權平均。 這是我們日常最常用的分類器之一。 更加神奇的是, 這個東西形式上同單層神經網路。

圖: logistic函數,數學形式通玻爾茲曼分布, 物理里熵最大模型的體現
3, 貝葉斯時間序列分析之隱馬模型:
貝葉斯時間序列分析被用於挖掘存儲於時間中的模式,時間序列值得是一組隨時間變化的隨機變數,比如玩牌的時候你對手先後撒出的牌即構成一個時間序列。 時間序列模式的預設setting即馬爾科夫鏈, 之前動力學模式里講到反饋導致復雜歷史路徑依賴,當這種依賴的最簡單模式是下一刻可能出現的狀態只與此刻的狀態有關而與歷史無關, 這時候我們得到馬爾科夫鏈。
馬爾科夫鏈雖然是貝葉斯時間序列分析的基準模型,然而現實生活中遇到的時間序列問題, 通常不能歸於馬爾科夫鏈,卻可以間接的與馬爾科夫鏈關聯起來,這就是隱馬過程,所謂含有隱變數的馬爾科夫過程。

圖: 隱馬過程示意

語音識別就是一類特別能利用隱馬過程的應用, 在這里語音可以看做一組可觀測的時間序列, 而背後的文字是與之關聯的馬爾科夫鏈, 我們需要從可觀測的量, 按照一定的概率分布反推不可觀測的量, 並用馬爾科夫鏈的觀點對其建模, 從而解決從語音到文字的反推過程。 當今的語音識別則用到下面緊接講的深度學習模型。
4, 深度學習
剛剛講的分類問題, 只能根據我們已知的簡單特徵對事物進行分類, 但假設我們手裡的數據連需要提取的特徵都不知道, 我們如何能夠對事物進行分類呢? 比如你要從照片識別人名, 你都不知道選哪個特徵和一個人關聯起來。 沒關系, 此時我們還有一個辦法, 就是讓機器自發學習特徵, 因此祭出深度學習大法。通常在這類問題里, 特徵本身構成一個復雜網路,下級的特徵比較好確定, 而最高層的特徵, 是由底層特徵的組合確定的, 連我們人類自己都不能抽象出它們。
深度學習即數據內涵的模式(特徵)本身具備上述的多層級結構時候,我們的機器學習方法。 從以毒攻毒的角度看, 此時我們的機器學習機器也需要具有類似的多級結構,這就是大名鼎鼎的多層卷積神經網路。深度學習最大的優勢是具有更高級的對「結構」進行自動挖掘的能力,比如它不需要我們給出所有的特徵,而是自發去尋找最合適對數據集進行描述的特徵。 一個復雜模式-比如「人臉」 事實上可以看做一個簡單模式的層級疊加, 從人臉上的輪廓紋理這種底層模式, 到眼睛鼻子這樣的中級模式, 直到一個獨特個體這樣最高級的復雜模式, 你只有能夠識別底層模式,才有可能找到中級模式, 而找到中級模式才方便找到高級模式, 我們是不能從像素里一步到達這種復雜模式的。 而是需要學習這種從簡單模式到復雜模式的結構, 多層網路的結構應運而生。
圖: 從具體特徵到抽象特徵逐級深入的多級神經網路
6, RNN和神經圖靈機
如果時間序列數據里的模式也包含復雜的多層級結構, 這里和我之前說的復雜系統往往由於反饋導致復雜的時間依賴是一致的, 那麼要挖掘這種系統里的模式, 我們通常的工具就是超級前衛的循環神經網路RNN,這種工具對處理高維具有復雜反饋的系統有神效, 因為它本身就是一個高維具有復雜時間反饋的動力學系統。
圖: 循環神經網路, 過去的信息可以通過循環存儲在神經元之間
當一個復雜時間序列的問題裡面, 每個時間點的信息都可以對未來以任何方式產生復雜影響, 那麼處理這種復雜性的一個辦法就是用循環神經網路,讓它自發學習這種復雜結構。 比如一個城市裡的交通流, 或者人與人之間的對話。
神經圖靈機是在多層卷積神經網路或遞歸網路基礎上加上一個較長期的記憶單元, 從而達到處理需要更復雜時間關聯的任務, 比如對話機器人。 而神經圖靈機最厲害的地方在於他可以通過機器學習傳統的梯度下降法反向破譯一個程序, 比如你寫了一個python程序, 你用很多不同的輸入得到很多對應的輸出, 你可以把它給神經圖靈機訓練, 最終本來對程序絲毫無所知的神經圖靈機居然可以如同學會了這個程序。

❻ 如何用Tensorflow實現RNN

class TextLoader():
def __init__(self, data_dir, batch_size, seq_length, encoding='utf-8'):
self.data_dir = data_dir
self.batch_size = batch_size
self.seq_length = seq_length
self.encoding = encoding
#第一次運行程序時只有input.txt一個文件,剩下兩個文件是運行之後產生的
input_file = os.path.join(data_dir, "input.txt")
vocab_file = os.path.join(data_dir, "vocab.pkl")
tensor_file = os.path.join(data_dir, "data.npy")
#如果是第一次執行則調用preprocess函數,否則調用load_preprocessed函數。
if not (os.path.exists(vocab_file) and os.path.exists(tensor_file)):
print("reading text file")
self.preprocess(input_file, vocab_file, tensor_file)
else:
print("loading preprocessed files")
self.load_preprocessed(vocab_file, tensor_file)
self.create_batches()
self.reset_batch_pointer()

def preprocess(self, input_file, vocab_file, tensor_file):
with codecs.open(input_file, "r", encoding=self.encoding) as f:
data = f.read()
#使用Counter函數對輸入數據進行統計。counter保存data中每個字元出現的次數
counter = collections.Counter(data)
#對counter進行排序,出現次數最多的排在前面
count_pairs = sorted(counter.items(), key=lambda x: -x[1])
#將data中出現的所有字元保存,這里有65個,所以voacb_size=65
self.chars, _ = zip(*count_pairs)
self.vocab_size = len(self.chars)
#按照字元出現次數多少順序將chars保存,vocab中存儲的是char和順序,這樣方便將data轉化為索引
self.vocab = dict(zip(self.chars, range(len(self.chars))))
with open(vocab_file, 'wb') as f:
#保存chars
cPickle.mp(self.chars, f)
#將data中每個字元轉化為索引下標。
self.tensor = np.array(list(map(self.vocab.get, data)))
np.save(tensor_file, self.tensor)

def load_preprocessed(self, vocab_file, tensor_file):
#如果是第二次運行,則可以直接讀取之前保存的chars和tensor
with open(vocab_file, 'rb') as f:
self.chars = cPickle.load(f)
self.vocab_size = len(self.chars)
self.vocab = dict(zip(self.chars, range(len(self.chars))))
self.tensor = np.load(tensor_file)
self.num_batches = int(self.tensor.size / (self.batch_size *
self.seq_length))

def create_batches(self):
#首先將數據按batch_size切割,然後每個batch_size在按照seq_length進行切割
self.num_batches = int(self.tensor.size / (self.batch_size *
self.seq_length))

if self.num_batches == 0:
assert False, "Not enough data. Make seq_length and batch_size small."

self.tensor = self.tensor[:self.num_batches * self.batch_size * self.seq_length]
xdata = self.tensor
#構造target,這里使用上一個詞預測下一個詞,所以直接將x向後一個字元即可
ydata = np.(self.tensor)
ydata[:-1] = xdata[1:]
ydata[-1] = xdata[0]
#將數據進行切分,這里我們假設數據總長度為10000,batch_size為100, seq_length為10.
# 所以num_batches=10,所以,xdata在reshape之後變成[100, 100],然後在第二個維度上切成10份,
# 所以最終得到[100, 10, 10]的數據
self.x_batches = np.split(xdata.reshape(self.batch_size, -1),
self.num_batches, 1)
self.y_batches = np.split(ydata.reshape(self.batch_size, -1),
self.num_batches, 1)

def next_batch(self):
x, y = self.x_batches[self.pointer], self.y_batches[self.pointer]
self.pointer += 1
return x, y

def reset_batch_pointer(self):
self.pointer = 0

❼ 只有一層隱藏層的CNN(RNN)算是深度學習嗎

都可以,這個現在沒有特別明晰的界限和定義,不必過分關心.
個人覺得用層數來界定深還是淺有點low, 深度學習與傳統機器學習的最大區別是在於它的彈性,它的層數和結構可以非常方便的的延伸和拓展.