技術分析是基於價格而做出的分析,其內在原理是市場買賣雙方力量及歷史會重複的基礎下做出的概率性分析。近年來,基於概率論、統計學、逼近論等學科發展起來的機器學習(machine learning)體現了其在資料分析上的便利性與有效性,其研究動機是為了讓電腦系統具有人的學習能力以便實現人工智慧,目前廣泛應用於各個領域。本文便是將機器學習應用在證券技術分析領域,通過機器學習演算法讓電腦學習到證券歷史價格資料裡的規律,進而預測出交易訊號,實現自動化的演算法交易。

與計量分析相比,機器學習不需要事先假定具體的分析模型,機器學習模型會根據給出的訓練資料自我調整的調整模型參數,使得訓練出的參數是對訓練資料內含規律的最佳描述。其優點是擺脫了分析人員對分析模型認識的局限性(如不同的計量回歸分析模型的選擇);其缺點則是無法解釋輸入變數對輸出變數的影響。但是在股票分析預測中,特別是股票交易中,我們更關注的是預測的準確性。這也正是本文將機器學習方法應用在演算法交易中的原因。

睿富者)(期刊)機器學習投資策略短文l-機器學習在演算法交易中的應用  — 技術分析-01

使用監督式機器學習的架構來分析股票資料,主要考慮的有三個方面問題,一是輸入資料選擇與處理,二是輸出資料(目標值)的選擇與處理,第三則是模型的選擇。

一、機器學習的輸入資料

本文主要考慮了技術分析所涉及到的兩個重要分支,一是技術指標,二是股票型態。

技術指標
技術指標是對某一特定期限長度的歷史資料(包括開盤價,最高價,最低價,收盤價,成交量)通過某種演算法計算而得到的指標值。演算法的不同,指標值呈現的意義也有所不同。有人將這些技術指標簡單分爲順勢型指標和逆勢型指標,也有人進一步細分,將其分爲趨勢類、震盪類、成交量類以及人氣類。以下通過 EMA, MACD, RSI, OBV 對技術指標進行說明。

EMA (Exponential Moving Average, 指數移動平均)

指數移動平均是以指數式遞減加權的移動平均。各數值的加權影響力隨時間而指數式遞減,越近期的數據加權影響力越重,但較舊的數據也給予一定的加權值。

  • 設時間t的實際數值為Yt,而時間t的EMA則為St;時間t-1的EMA則為St-1
  • 計算時間t≥2是方程式為:    St= α*Yt +(1-α)*St-1
  • 在技術分析中,不同的市場對常用天數(n值)有不同的需求,例如:某些市場普遍的n值為10日、40日、200日;有些則是5日、10日、20日、60日、120日、240日,視乎分析時期長短而定。投資者冀從移動平均線的圖表中分辨出支持位或阻力位。

MACD(Moving Average Convergence / Divergence) 指標計算及原理

  • 差離值(DIF值):利用收盤價的指數移動平均值(12日/26日)計算出差離值。公式:DIF= EMA(close,12)–EMA(close,26)
  • 訊號線(DEM值,又稱MACD值):計算出DIF後,會再畫一條(訊號線),通常是DIF的9日指數移動平均值。公式:DEM= EMA(DIF,9)
  • 直條圖或棒形圖(histogram/bar graph):接著,將DIF有與DEM的差畫成(直條圖)(MACD bar/OSC)公式:OSC = DIF- DEM

睿富者)(期刊)機器學習投資策略短文l-機器學習在演算法交易中的應用  — 技術分析-02

MACD指標主要是通過EMA、DIF和DEA(或叫MACD、DEM)這三值之間關係的研判,DIF和DEA連接起來的移動平均線的研判以及DIF減去 DEM值而繪製成的柱狀圖(BAR)的研判等來分析判斷行情,是預測股價中短期趨勢的主要的股市技術分析指標。其中,DIF是核心,DEA是輔助。DIF是快速平滑移動平均線(EMA1)和慢速平滑移動平均線(EMA2)的差。BAR柱狀圖在股市技術軟體上是用紅柱和綠柱的收縮來研判行情。

  • 差離值(DIF)形成「快線」,訊號線(DEM)形成「慢線」,當差離值(DIF)從下而上穿過訊號線(DEM),為買進訊號;相反若從上而下穿越,為賣出訊號。
  • 棒形圖會根據正負值分佈在零軸(X軸)的上下。棒形圖在零軸上方時表示走勢較強,反之則是走勢較弱。
  • 差離值由下而上穿過零軸代表市場氣氛利好股價,相反由上而下則代表利淡股價。差離值與訊號線均在零軸上方時,被稱為多頭市場,反之,則被稱為空頭市場。
  • 當股價創新低,但MACD並沒有相應創新低(牛市背離),視為利好(利多)訊息,股價跌勢或將完結。相反,若股價創新高,但MACD並沒有相應創新高(熊市背離),視為利淡(利空)訊息。更多MACD在交易中的應用讀者可參考 MOVING AVERAGE CONVERGENCE-DIVERGENCE (MACD) 

RSI (Relative Strength Index) 指標計算及原理

  • 設每天向上的變動為U,向下變動為D。
  • 在價格上升的日子:U = 當日收市價 – 昨日收市價;D = 0
  • 在價格下跌的日子:U = 0;D = 昨日收市價 – 當日收市價
  • 所謂相對強度,即U平均值及D平均值的比例:RS= EMA(U,n)/EMA(D,n)
  • 相對強弱指標計算公式為:RSI= EMA(U,n)/[EMA(D,n) +EMA(U,n)]*100%

睿富者)(期刊)機器學習投資策略短文l-機器學習在演算法交易中的應用  — 技術分析-03

  • 某證券的RSI升至70時,代表該證券已被超買(Overbought),投資者應考慮出售該證券。相反,當證券RSI跌至30時,代表證券被超賣(Oversold),投資者應購入該證券。
  • 當RSI指標與盤勢發生背離時,則代表盤勢即將反轉,若股價在創新高時,RSI沒有跟著創新高,則為轉弱訊號,下跌即將開始;若股價在創新低時,RSI沒有跟著創新低,則為轉強訊號,上漲即將開始。
  • 結合不同天期指標判斷:短天期指標向上穿越長天期指標為黃金交叉,買進;短天期指標向下穿越長天期指標時為死亡交叉,賣出。

OBV(On Balance Volume) 指標計算及原理

  • 以日為計算週期為例,其計算公式為: 當日OBV=本日值+前一日的OBV值。
  • 如果本日收盤價或指數高於前一日收盤價或指數,本日值則為正;如果本日的收盤價或指數低於前一日的收盤價,本日值則為負值;如果本日值與前一日的收盤價或指數持平,本日值則不於計算,然後計算累積成交量。這裡的成交量是指成交股票的手數。

能量潮理論成立的依據重要是:

  1. 投資者對股價的評論越不一致,成交量越大;反之,成交量就小。因此,可用成交量來判斷市場的人氣和多空雙方的力量。
  2. 重力原理(the Law of Gravity)。上升的物體遲早會下跌,而物體上升所需的能量比下跌時多。涉及到股市則可解釋為:一方面股價遲早會下跌;另一方面,股價上升時所需的能量大,因此股價的上升特別是上升初期必須有較大的成交量相配合;股價下跌時則不必耗費很大的能量,因此成交量不一定放大,甚至有萎縮趨勢。
  3. 慣性原則(Principle of inertia)。動則恒動、靜則恒靜。只有那些被投資者或主力相中的熱門股會在很大一段時間內成交量和股價的波動都比較大,而無人問津的冷門股,則會在一段時間內,成交量和股價波幅都比較小。

股票型態
我們參照了 歷史不斷重演-型態學 一文中提及的型態,通過圖像辨識的方法對股票時間序列資料進行處理,進而作為機器學習的輸入。

二、機器學習的輸出資料

在機器學習輸出資料的選擇上,由於本文策略邏輯是基於股票的趨勢交易,因此所考慮到是先將股票時間序列進行趨勢分析,進而將趨勢資訊轉化成為以風險為基準的交易訊號。通過計量模型,我們可以把股票價格序列進行趨勢分析。趨勢分析範例如下:

睿富者)(期刊)機器學習投資策略短文l-機器學習在演算法交易中的應用  — 技術分析-04

接著我們計算每一段趨勢的夏普值(Sharpe ratio)作為對應的風險交易訊號。

三、機器學習模型的選擇

大量文獻研究表明支援向量回歸(support vector regression),類神經網路(artificial neural network)相較於其他機器學習方法在處理股票資料上有較強泛化能力及較高的預測準確性。支援向量回歸是支援向量機(support vector machine)的一種變形,它屬於非線性回歸(nonlinear regression)的一種方法,藉由增列資料的特徵(feature),建構一個或多個高維度的超平面來分類資料點。類神經網路屬於一種平行計算系統,它由許多神經元(artificial neurons)或節點(nodes)組成。概念上,類神經網路是模仿人腦的神經元網路,建立以下模型:每個神經元代表一種特定的輸入/輸出函數,以其它神經元或外部環境取得輸入資料,通過運算程式處理後,輸出其結果到其它神經元或外界。

本文選擇機器學習模型為支援向量回歸及類神經網路。通過這兩種機器學習演算法對目標歷史資料進行學習,分別構建技術指標與交易訊號、股票型態與交易訊號之間的量化聯繫,這種量化聯繫可用來預測交易訊號。

根據上述的演算法,我們分別構建了中低頻交易策略與中高頻交易策略。在中低頻資料上,對大陸、臺灣、韓國、及美國四個不同市場的日資料進行了測試。發現以技術指標作為訓練模型的輸入資料時,在大陸和臺灣市場上有可觀的收益;以型態評分資料作為訓練模型輸入資料時,在大陸和韓國市場上有可觀收益。至於在日內5分鐘的中高頻資料上,對大陸股指期貨,及主要商品期貨產品進行了測試,發現在波動較高的期貨產品中有較好的回測績效。

以下列舉對三個大陸市場的實證分析,並考慮交易成本,各圖中黑色曲線表示對標的資產以 buy and hold 策略交易的回測績效,紅色曲線表示機器學習產生交易策略的回測績效。至於相對應的表內則顯示機器學習所產生交易策略的統計量。

睿富者)(期刊)機器學習投資策略短文l-機器學習在演算法交易中的應用  — 技術分析-05

想法:

  1. 30分鐘短衝訓練
    1. 以5分鐘為一單位,假定為出手後半小時後就平倉
    2. 訓練資料可以是過去300分鐘的走勢、籌碼等資料數據
    3. 訓練區間為一個月,都只做多,若賺錢>30點或賠>30點就進入學習
    4. 若出現賺>30點的特徵就做多,反之就做空
  2. 當日高低點訓練
    1. 以15分鐘的資料作為訓練輸入
    2. 蒐集過去三個月來的低點與高點出現後的前10分鐘與後5分鐘資料來訓練
    3. 當目前走勢符合低點特徵就做多,反之就做空

人類培養操盤手的方式:

  1. 先養成正確的資金控管習慣
    1. 出手一口試單,作對加碼,做錯減碼
    2. 大賺時一直加碼,若發現不對全部出光

隨著資料科學(Data Science)技術的興起,人工智慧(Artificial Intelligence)機器學習(Machine Learning) 成為近幾年來電腦科學界十分熱門的研究領域,如今在實體和線上的學習機器學習的資源有很多,本文整理了一些好用學習資源希望幫助初學者能更容易使用 Python 入門機器學習的領域中,從零開始學習機器學習。若是對於資料科學不熟悉的讀者可以先參考適用於初學者的資料科學影片 ,讓自己對於資料科學有初步的認識。

什麼是機器學習(Machine Learning)?

機器學習是一種資料科學的技術,協助電腦從現有的資料學習,以便預測未來的行為、結果和趨勢。根據學習的方式又可以分為需要解答的監督式學習(Supervised learning)非監督式學習(Unsupervised learning)增強學習(Reinforcement learning)(還有一種混合式的半監督式學習)等子類別。機器學習技術可以應用的範圍十分廣泛,總的來說機器學習可以解決以下幾種問題:

  1. 分類問題:這是 A 類 或 B 類嗎?
  2. 異常值判斷:這很奇怪嗎?
  3. 預測性分析:有多少?
  4. 分群問題:這是如何組織的?
  5. 增強學習協助決策:我接下來該怎麼辦?

當我們蒐集到相關、精確、連貫、足夠資料就可以挑選合適的演算法進行模型的的建置。

為什麼選擇 Python?

在資料科學和機器學習領域最重要的兩大程式語言就是 Python 和 R,Python 簡潔易學、應用範圍廣(不限於數據分析)且學習曲線平緩,適合作為第一個入門的程式語言,透過 pandas、SciPy/NumPy、sckikit-learn、matplotlib 和 statsmodels 可以進行數據分析的工作,適合工程任務和需要和網路應用程式整合的專案。至於 R 由於是統計學家開發的程式語言,則是擅長於統計分析、圖表繪製,常用於學術研究領域,建議也要有一定程度的掌握。一般情況下 Python 和 R 並非互斥,而是互補,許多資料工程師、科學家往往是在 Python 和 R 兩個語言中轉換,小量模型驗證、統計分析和圖表繪製使用 R,當要撰寫演算法和資料庫、網路服務互動等情況時在移轉到 Python。為了降低學習成本,我們先使用 Python 進行介紹。

若對於 Python 和 R 比較,這邊有兩篇文章可以參考 数据科学界华山论剑:R与Python巅峰对决Which is better for data analysis: R or Python?

如何開始入門機器學習?

事實上,資料科學是個跨領域學門,在學習如何使用 Python 進行機器學習過程中通常必須掌握以下知識:

  • 機器學習演算法
  • Python 程式語言和資料分析函式庫
  • 線性代數/統計學等相關學門
  • 專業領域的領域知識(Domain Knowledge)

為了掌握以上三大領域知識(我們先把焦點放在機器學習核心技法,暫時忽略資料科學中對於領域知識的掌握),具體來說我們可以有以下步驟可以參考:

  1. 掌握基礎 Python 程式語言知識

    線上學習資源:

  2. 了解基礎數學/統計學和機器學習基礎知識
  3. 知道如何使用 Python 科學計算函式庫和套件

    推薦安裝 Anaconda,支援跨平台多種版本 Python,預設將數據分析、科學計算的套件裝好,自帶 spyder 編輯器、Jupyter Notebook(IPython Notebook),可以提供一個網頁版介面,讓使用者可以透過瀏覽器進行 Julia、Python 或 R 程式的開發與維護。

  4. 使用 scikit-learn 學習 Python 機器學習應用
  5. 運用 Python 實作機器學習演算法
    • 感知器
    • 決策樹
    • 線性迴歸
    • k-means 分群
  6. 實作進階機器學習演算法
    • SVM
    • KNN
    • Random Forests
    • 降低維度
    • 驗證模型
  7. 了解深度學習(Deep Learning)在 Python 的實作和應用

總結

以上整理了一些機器學習網路學習資源,若你累積一些小小經驗後,不妨挑戰一下 Kaggle 測試一下自己的實力並累積更多數據分析的經驗。

延伸閱讀

  1. 7 Steps to Mastering Machine Learning With Python
  2. 人人都可成為資料科學大師!一整年的網路自學清單就在這了
  3. Analytics Vidhya
  4. 台灣資料科學年會
  5. 「2016 台灣資料科學愛好者年會」精彩資料總整理(持續更新中)
  6. 大數據會消失,資料科學不會!你該知道的資料科學第一堂課
  7. 如何選擇 Microsoft Azure Machine Learning 的演算法
  8. Microsoft Azure Machine Learning 機器學習服務文件
  9. Kdnuggets
  10. Bigdatafinance
  11. Using Python and R together: 3 main approaches
  12. 机器学习最佳入门学习资源
  13. 机器学习(Machine Learning)&深度学习(Deep Learning)资料(Chapter 1)

策略精神:

  1. 因為Delta非線性的特性,當Delta從0.3 -> 0.6 移動時,價格會加速噴出
  2. 而0.3 -> 0與0.6 -> 1的價格變動都不大
  3. 進場條件:
    1. Delta突破0.3站買方,買的時候一次買2個單位,同時反向尋找Delta>0.6的,賣一個單位
  4. 出場條件:
    1. 若手上的單是買方,當Delta >0.6時賣出 (因最好賺的一段賺到了,流失時間價值的機率>獲利機率)
    2. 若手上的單是賣方,當Delta <0.3時平倉 (因最好賺的一段賺到了,賣方風險>流失時間價值的機率)
  5. 特性:
    1. 按照建倉原則的特性,會發現手上的部位會有多數的價外買方,以及少數的價內賣方

根據先前的研究結論:

假設上周結算價為中關,+200為上關,-200為下關,開倉建的單叫基本單,之後建的單叫加碼單

開倉時的基本單建倉做法:

  1. A單:上下關雙Sell(約20~30)
  2. B單: 中關雙Buy(約150)
  3. C單: 400點外雙買(約<3) 防止黑天鵝與偷保證金
  4. SC權利金需>BC,SP權利金需>BP

建倉之後,行情開始移動,以下為基本單的情境分析:

  1. 上漲直到上關:
    1. 此時基本單中,觀察 SC+BC 與 SP+BP 哪一組賺錢,平掉賺錢的部分
      1. 理論上剛開倉就到上關,BC+SC應會賠錢,SP+BP會賺錢
      2. 快結算才到上關,BC+SC與SP+BP應該都會賺錢
    2. 接著建立加碼單,採用逆勢建單(此做法是賭收斂)
      1. 建立中關BP與下關SP,SP權利金需>BP
      2. 若之後還是持續噴出,因為SP權利金>BP,所以就可穩收
    3. 若基本單中的SC+BC賠錢,基本則是BC續抱,SC停損,一路往上移單,直到賺錢為止
  2. 下跌直到下關:(略)與上漲相反
  3. 無大波動直到結算:不動作,兩邊雙收

 

關於移單補充說明:

  1. SC停損,一路往上移單,直到賺錢為止
    1. 例如SC9000了5口在30被軋到60,此時權利金由150->300
    2. 移單的做法就是停損SC9000,但SC9100(假設9100是30點那就sell 300/30=10口)
    3. 理論上被軋到價平的時候就一定要移,馬上移,如果遇到跳空還是得移
    4. 因為有建C單,當噴超過400點以上時,

 

若到下周結算前,有機會建立加碼單,以下為加碼單的情境分析:

系統質量SQN (System Quality Number) 系統品質指標(Tharp)
SQN= Squareroot(N) * Average (of the N Profit&Loss) / Std dev (of the N Profit&Loss).
SQN = 交易次數開根號 * 平均每筆損益 / 每筆損益的標準差
SQN公式有什麼意義呢?
1. 期望獲利越高,SQN值越大。(線性成長)
2. 標準差越小,SQN值越大。(倒數關係)
3. 交易次數(N)越多,SQN值越大。(開根號後線性)
以上第1點與第2點皆很合理:
第1點期望獲利越高,本來就該給這系統比較高的分數。
第2點標準差越小,代表交易產生的風險越小,SQN分數自然就越高。
第3點可能讀者比較難理解:
交易次數(N)越多,代表樣本數越多。換句話說,期望獲利與標準差這兩個值得可信度也越高。
自然,可信度越高,代表估的越準確,SQN分數自然就高。
你或許會想,那我就多弄幾次交易,拉高SQN分數。
所以為什麼N要開根號,交易10次和100次的開根號,多交易了90次,SQN分數會差到10倍;
但是交易100次和190次的開根號,一樣多交易90次,SQN分數只差了1.37倍。
當你使用SQN時,分數要到多高才叫做好的交易策略,Tharp給了下面的標準去判斷:
當交易次數N太少,SQN也會相對低。Tharp給了以下的建議:
1. 如果你這策略的交易次數只有十次(N=10),則此策略的SQN至少要大於3.5。
2. 如果你這策略的交易次數只有二十次(N=20),則此策略的SQN至少要大於3.0。
3. 如果你這策略的交易次數只有三十次(N=30),則此策略的SQN至少要大於2.5。
當你使用SQN時,分數要到多高才叫做好的交易策略,Tharp給了下面的標準去判斷:
使用SQN判斷你的交易系統好壞
SQN 系統品質
<1.00 很爛(Probably very hard to trade)
<1.01-2.00 一般般(Average System)
<2.01-3.00 還不錯(Good System)
<3.01-5.00 很棒!(Excellent System)
<5.01-7.00 太牛逼了!(Superb System)
<7.00< 這就是聖杯(Holy Grall System)
當交易次數N太少,SQN也會相對低。Tharp給了以下的建議:
1. 如果你這策略的交易次數只有十次(N=10),則此策略的SQN至少要大於3.5。
2. 如果你這策略的交易次數只有二十次(N=20),則此策略的SQN至少要大於3.0。
3. 如果你這策略的交易次數只有三十次(N=30),則此策略的SQN至少要大於2.5。
3. 如果你這策略的交易次數只有三十次(N=30),則此策略的SQN至少要大於2.5。
贏家方程式_凱利公式
在機率論中,凱利公式(英語:Kelly formula),也稱凱利方程式,是一個用以使特定賭局中,擁 有正期望值之重複行為長期增長率最大化的公式,由約翰·拉里·凱利於1956年在《貝爾系統技術 期刊》中發表,可用以計算出每次遊戲中應投注的資金比例。
除可將長期增長率最大化外,此方程式不允許在任何賭局中,有失去全部現有資金的可能,因此 有不存在破產疑慮的優點。
方程式假設貨幣與賭局可無窮分割,而只要資金足夠多,在實際應用上不成問題。凱利方程式Kelly’s Formula,K=W- (1-W)/R; 舉例來說,若某個賭局,獲勝的機率為50%,獲勝 時能得到賭金的1.1倍,輸時則損失賭金,則W=50%,利潤對損失的比率R=1.1/1=1.1,則每次的 賭注應該下所有賭金的 K = 0.5 – (1-0.5)/1.1 = 4.5%,只要連續參加賭局,且機率不變,則可以獲得 最大的報酬率。
K值就是最適單筆資金投入比例。
凱利公式原本是為了協助規劃電子比特流量設計,後來被引用於賭二十一點上去,麻煩就出在一 個簡單的事實,二十一點並非商品交易。
用於金融市場交易時,應該要注意的事項: 賭二十一點時,你可能會輸的賭本只限於所放進去 的籌碼,而可能會贏的利潤,也只限於賭注籌碼的範圍。
但商品交易輸贏程度是沒得準的,會造成資產或輸贏有很大的震幅。凱利贏家方程式簡單說明一件事:就是一個交易者能否成為長期的贏家,或是一個交易策略系統 能否經得起市場的考驗,
重點在於:1.平均獲勝機率 2.平均的贏虧值比例 3.資金配置規劃
槓桿倍數
槓桿倍數=(標的資產總值)或(期貨合約報價 × 每點約值) / 期貨原始保證金
槓桿倍數={(標的資產總值)或(期貨合約報價 × 每點約值)/(選擇權之權利金報價 × 每點約值) } × |delta| (買方)
槓桿倍數={(標的資產總值)或(期貨合約報價 × 每點約值)/(選擇權之應計收之原始保證金) } × |delta| (賣方)
(註 : 選擇權每點50元,故可以小台期貨的合約值換算;或是以大台、現貨為分子,分母再乘以四口)
相關係數B
兩個交易商品之間的價格相關程度
正相關適合收斂型價差型策略,負相關適合發散型價差型策略。
兩項商品之間,有共同標的連結者,為直接相關型。兩項商品之間,僅是某些性質相同,造成長 期走勢相近者,為間接相關型。
波動值與波動率
什麼是波動值呢?就是價格變動的標準差(Standard Deviation)。 波動值是一檔投資工具可能的變動程度。波動值越大,這種投資工具未來價格變動的程度越大 (風險就愈大)。
VOL年化波動率 定義為對象資產的年回報率的對數值的標準差。
一般的時間長度為T(年)的一段時間內的波動率 則定義為:
因此,如果一種資產(如股票)在長度為P的一段時間內,日均的對數回報率的標準差
為 ,那麼年化波動性為
在美國,通常認為 (因為美國每年有252個交易日)。 因此如果某資產的 ,那麼就可以算出年化波動率為 當然也可依上式算出月波動率等: 時,
VAR風險值
VaR風險值係以一金額數字來表達該投資組合在特定的持有期間內,某一機率百分比 下,最大的可能損失金額為多少。
假設投資組合的市場價值為 ,投資組合的報酬波動度為σ且信賴水準為α下,則當 持有該投資組合的期間為t時,VaR風險值如下式所列:
其中,為信賴水準。
例如:
參數α=5時,若VAR=20000;代表依據歷史回測DATA顯示,次一筆交易出現損失超過20000 的機率大約為5%; 反之即有95%的機率,次筆交易的損失不會超過20000。
最大連續虧損 (maximum draw-down) 最大連續虧損定義: 在資產價值總額 (fund value) / 資金曲線 (equity curve) 中最大的頂底之間 的差距。意即最壞時連續輸掉了多少。
MDD可以藉此衡量資金配置能否承受策略歷史資料中的最大風險金額。Delta值的概念 Delta值:當標的現貨資產價格變動1基本單位時,連結該標的之期貨、選擇權或衍生性商品的 價格會變動多少單位。
Delta值(δ),又稱對沖值:是衡量標的資產價格變動時,期權價格的變化幅度。
用公式表示:Delta=期權價格變化/現貨價格變化 故 Delta 可用於評估試算以期貨、選擇權做避險時的交易單位與避險比例。其值介於-1與1之間
正值為正相關,表示A商品漲,B商品就會跟著漲。
負值為負相關,表示A商品漲,B商品反而會走跌。
風險的衡量指標
通常高報酬必然伴隨著高風險。投資人比較績效時不應忽略了風險因素。風險高低該如何衡 量呢?
貝他係數(Beta)、波動值(Volatility)、夏普指標(Sharpe ratio)是常用的評估方式, 前兩種數值越大,代表風險越高;夏普指數越大,則代表風險承擔得越值得。
貝他s係數是用來衡量單一股票或者基金與參考指標間的相對變化關係。舉例來說,某檔基 金的貝他係數是1,就是指這檔基金淨值變動的比例等於大盤變動的比例,當大盤上漲10% 時,這檔基金會上漲10%;反之,當大盤下跌10%時,這檔基金也會下跌10%。
貝他係數s越大,代表基金淨值變動相對於大盤越大。再舉一個例子來說,某檔基金的貝他 係數是1.5,就是指這檔基金淨值變動的比例是大盤變動的比例1.5倍,當大盤上漲10%時, 這檔基金會上漲15%;反之,當大盤下跌10%時,這檔基金會下跌15%。也就是說,基金淨 值的變動幅度非常大,而變動幅度越大的基金,就是風險越高的基金。
相反的,貝他s係數低於1的基金,代表淨值變動的程度比大盤還小,淨值是穩定而緩慢的 跟隨大盤變動,代表基金操作較為保守穩定。
什麼是波動值呢?學過統計的朋友可能對他另外一個名詞更熟悉一些,就是價格變動的標準 差(Standard Deviation)。
波動值是一檔投資工具可能的變動程度。波動值越大,這種投資 工具未來價格變動的程度越大。
至於夏普指標則是一個經過風險調整後之績效指標。夏普指標代表投資人每多承擔一分風 險,可以拿到幾分的超額報酬;若為正值,
代表基金報酬率高過波動風險;若為負值,代表 基金操作風險大過於報酬率。夏普指標越高的基金,代表承擔每一分風險,可得利潤愈高。

 (注:本文译自一篇博客,作者行文较随意,我尽量按原意翻译,但作者所介绍的知识还是非常好的,包括例子的选择、理论的介绍都很到位,由浅入深,源文地址

  近些年来,人工智能领域又活跃起来,除了传统了学术圈外,Google、Microsoft、facebook等工业界优秀企业也纷纷成立相关研究团队,并取得了很多令人瞩目的成果。这要归功于社交网络用户产生的大量数据,这些数据大都是原始数据,需要被进一步分析处理;还要归功于廉价而又强大的计算资源的出现,比如GPGPU的快速发展。

除去这些因素,AI尤其是机器学习领域出现的一股新潮流很大程度上推动了这次复兴——深度学习。本文中我将介绍深度学习背后的关键概念及算法,从最简单的元素开始并以此为基础进行下一步构建。

(本文作者也是Java deep learning library的作者,可以从此处获得,本文中的例子就是使用这个库实现的。如果你喜欢,可以在Github上给个星~。用法介绍也可以从此处获得)

机器学习基础

如果你不太熟悉相关知识,通常的机器学习过程如下:

1、机器学习算法需要输入少量标记好的样本,比如10张小狗的照片,其中1张标记为1(意为狗)其它的标记为0(意为不是狗)——本文主要使用监督式、二叉分类。

2、这些算法“学习”怎么样正确将狗的图片分类,然后再输入一个新的图片时,可以期望算法输出正确的图片标记(如输入一张小狗图片,输出1;否则输出0)。

这通常是难以置信的:你的数据可能是模糊的,标记也可能出错;或者你的数据是手写字母的图片,用其实际表示的字母来标记它。

感知机

感知机是最早的监督式训练算法,是神经网络构建的基础。

假如平面中存在 个点,并被分别标记为“0”和“1”。此时加入一个新的点,如果我们想知道这个点的标记是什么(和之前提到的小狗图片的辨别同理),我们要怎么做呢?

一种很简单的方法是查找离这个点最近的点是什么,然后返回和这个点一样的标记。而一种稍微“智能”的办法则是去找出平面上的一条线来将不同标记的数据点分开,并用这条线作为“分类器”来区分新数据点的标记。

线性分类器

在本例中,每一个输入数据都可以表示为一个向量 x = (x_1, x_2) ,而我们的函数则是要实现“如果线以下,输出0;线以上,输出1”。

用数学方法表示,定义一个表示权重的向量 w 和一个垂直偏移量 b。然后,我们将输入、权重和偏移结合可以得到如下传递函数:

映射变换函数

  这个传递函数的结果将被输入到一个激活函数中以产生标记。在上面的例子中,我们的激活函数是一个门限截止函数(即大于某个阈值后输出1):

                     

训练

感知机的训练包括多训练样本的输入及计算每个样本的输出。在每一次计算以后,权重 w 都要调整以最小化输出误差,这个误差由输入样本的标记值与实际计算得出值的差得出。还有其它的误差计算方法,如均方差等,但基本的原则是一样的。

缺陷

这种简单的感知机有一个明显缺陷:只能学习线性可分函数。这个缺陷重要吗?比如 XOR,这么简单的函数,都不能被线性分类器分类(如下图所示,分隔两类点失败):

为了解决这个问题,我们要使用一种多层感知机,也就是——前馈神经网络:事实上,我们将要组合一群这样的感知机来创建出一个更强大的学习机器。

前馈神经网络

神经网络实际上就是将大量之前讲到的感知机进行组合,用不同的方法进行连接并作用在不同的激活函数上。

前馈神经网络示意图

我们简单介绍下前向神经网络,其具有以下属性:

  • 一个输入层,一个输出层,一个或多个隐含层。上图所示的神经网络中有一个三神经元的输入层、一个四神经元的隐含层、一个二神经元的输出层。
  • 每一个神经元都是一个上文提到的感知机。
  • 输入层的神经元作为隐含层的输入,同时隐含层的神经元也是输出层神经元的输入。
  • 每条建立在神经元之间的连接都有一个权重 w (与感知机中提到的权重类似)。
  • 在 t 层的每个神经元通常与前一层( t – 1层)中的每个神经元都有连接(但你可以通过将这条连接的权重设为0来断开这条连接)。
  • 为了处理输入数据,将输入向量赋到输入层中。在上例中,这个网络可以计算一个3维输入向量(由于只有3个输入层神经元)。假如输入向量是 [7, 1, 2],你将第一个输入神经元输入7,中间的输入1,第三个输入2。这些值将被传播到隐含层,通过加权传递函数传给每一个隐含层神经元(这就是前向传播),隐含层神经元再计算输出(激活函数)。
  • 输出层和隐含层一样进行计算,输出层的计算结果就是整个神经网络的输出。

超线性

如果每一个感知机都只能使用一个线性激活函数会怎么样?整个网络的最终输出也仍然是将输入数据通过一些线性函数计算过一遍,只是用一些在网络中收集的不同权值调整了一下。换名话说,再多线性函数的组合还是线性函数。如果我们限定只能使用线性激活函数的话,前馈神经网络其实比一个感知机强大不到哪里去,无论网络有多少层。

正是这个原因,大多数神经网络都是使用的非线性激活函数,如对数函数、双曲正切函数、阶跃函数、整流函数等。不用这些非线性函数的神经网络只能学习输入数据的线性组合。

训练

大多数常见的应用在多层感知机的监督式训练的算法都是反向传播算法。基本的流程如下:

1、将训练样本通过神经网络进行前向传播计算。

2、计算输出误差,常用均方差:

其中 t 是目标值, y 是实际的神经网络计算输出。其它的误差计算方法也可以,但MSE(均方差)通常是一种较好的选择。

3、网络误差通过随机梯度下降的方法来最小化。

梯度下降很常用,但在神经网络中,输入参数是一个训练误差的曲线。每个权重的最佳值应该是误差曲线中的全局最小值(上图中的 global minimum)。在训练过程中,权重以非常小的步幅改变(在每个样本或每小组样本训练完成后)以找到全局最小值,但这可不容易,训练通常会结束在局部最小值上(上图中的local minima)。如例子中的,如果当前权重值为0.6,那么要向0.4方向移动。

这个图表示的是最简单的情况,误差只依赖于单个参数。但是,网络误差依赖于每一个网络权重,误差函数非常、非常复杂。

好消息是反向传播算法提供了一种通过利用输出误差来修正两个神经元之间权重的方法。关系本身十分复杂,但对于一个给定结点的权重修正按如下方法(简单):

其中 E 是输出误差, w_i 是输入 i 的权重。

实质上这么做的目的是利用权重 i 来修正梯度的方向。关键的地方在于误差的导数的使用,这可不一定好计算:你怎么样能给一个大型网络中随机一个结点中的随机一个权重求导数呢?

答案是:通过反向传播。误差的首次计算很简单(只要对预期值和实际值做差即可),然后通过一种巧妙的方法反向传回网络,让我们有效的在训练过程中修正权重并(期望)达到一个最小值。

隐含层

隐含层十分有趣。根据普适逼近原理,一个具有有限数目神经元的隐含层可以被训练成可逼近任意随机函数。换句话说,一层隐含层就强大到可以学习任何函数了。这说明我们在多隐含层(如深度网络)的实践中可以得到更好的结果。

隐含层存储了训练数据的内在抽象表示,和人类大脑(简化的类比)保存有对真实世界的抽象一样。接下来,我们将用各种方法来搞一下这个隐含层。

一个网络的例子

可以看一下这个通过 testMLPSigmoidBP 方法用Java实现的简单(4-2-3)前馈神经网络,它将 IRIS 数据集进行了分类。这个数据集中包含了三类鸢尾属植物,特征包括花萼长度,花瓣长度等等。每一类提供50个样本给这个神经网络训练。特征被赋给输入神经元,每一个输出神经元代表一类数据集(“1/0/0” 表示这个植物是Setosa,“0/1/0”表示 Versicolour,而“0/0/1”表示 Virginica)。分类的错误率是2/150(即每分类150个,错2个)。

大规模网络中的难题

神经网络中可以有多个隐含层:这样,在更高的隐含层里可以对其之前的隐含层构建新的抽象。而且像之前也提到的,这样可以更好的学习大规模网络。增加隐含层的层数通常会导致两个问题:

1、梯度消失:随着我们添加越来越多的隐含层,反向传播传递给较低层的信息会越来越少。实际上,由于信息向前反馈,不同层次间的梯度开始消失,对网络中权重的影响也会变小。

2、过度拟合:也许这是机器学习的核心难题。简要来说,过度拟合指的是对训练数据有着过于好的识别效果,这时导至模型非常复杂。这样的结果会导致对训练数据有非常好的识别较果,而对真实样本的识别效果非常差。

下面我们来看看一些深度学习的算法是如何面对这些难题的。

自编码器

  大多数的机器学习入门课程都会让你放弃前馈神经网络。但是实际上这里面大有可为——请接着看。

自编码器就是一个典型的前馈神经网络,它的目标就是学习一种对数据集的压缩且分布式的表示方法(编码思想)。

从概念上讲,神经网络的目的是要训练去“重新建立”输入数据,好像输入和目标输出数据是一样的。换句话说:你正在让神经网络的输出与输入是同一样东西,只是经过了压缩。这还是不好理解,先来看一个例子。

压缩输入数据:灰度图像

这里有一个由28×28像素的灰度图像组成的训练集,且每一个像素的值都作为一个输入层神经元的输入(这时输入层就会有784个神经元)。输出层神经元要有相同的数目(784),且每一个输出神经元的输出值和输入图像的对应像素灰度值相同。

在这样的算法架构背后,神经网络学习到的实际上并不是一个训练数据到标记的“映射”,而是去学习数据本身的内在结构和特征(也正是因为这,隐含层也被称作特征探测器(feature detector))。通常隐含层中的神经元数目要比输入/输入层的少,这是为了使神经网络只去学习最重要的特征并实现特征的降维。

我们想在中间层用很少的结点去在概念层上学习数据、产生一个紧致的表示方法。

流行感冒

为了更好的描述自编码器,再看一个应用。

这次我们使用一个简单的数据集,其中包括一些感冒的症状。如果感兴趣,这个例子的源码发布在这里

数据结构如下:

    • 输入数据一共六个二进制位
    • 前三位是病的证状。例如,1 0 0 0 0 0 代表病人发烧;0 1 0 0 0 0 代表咳嗽;1 1 0 0 0 0 代表即咳嗽又发烧等等。
    • 后三位表示抵抗能力,如果一个病人有这个,代表他/她不太可能患此病。例如,0 0 0 1 0 0 代表病人接种过流感疫苗。一个可能的组合是:0 1 0 1 0 0 ,这代表着一个接种过流感疫苗的咳嗽病人,等等。

当一个病人同时拥用前三位中的两位时,我们认为他生病了;如果至少拥用后三位中的两位,那么他是健康的,如:

    • 111000, 101000, 110000, 011000, 011100 = 生病
    • 000111, 001110, 000101, 000011, 000110 = 健康

我们来训练一个自编码器(使用反向传播),六个输入、六个输出神经元,而只有两个隐含神经元。

在经过几百次迭代以后,我们发现,每当一个“生病”的样本输入时,两个隐含层神经元中的一个(对于生病的样本总是这个)总是显示出更高的激活值。而如果输入一个“健康”样本时,另一个隐含层则会显示更高的激活值。

再看学习

本质上来说,这两个隐含神经元从数据集中学习到了流感症状的一种紧致表示方法。为了检验它是不是真的实现了学习,我们再看下过度拟合的问题。通过训练我们的神经网络学习到的是一个紧致的简单的,而不是一个高度复杂且对数据集过度拟合的表示方法。

某种程度上来讲,与其说在找一种简单的表示方法,我们更是在尝试从“感觉”上去学习数据。

受限波尔兹曼机

下一步来看下受限波尔兹曼机(Restricted Boltzmann machines RBM),一种可以在输入数据集上学习概率分布的生成随机神经网络。

RBM由隐含层、可见层、偏置层组成。和前馈神经网络不同,可见层和隐含层之间的连接是无方向性(值可以从可见层->隐含层或隐含层->可见层任意传输)且全连接的(每一个当前层的神经元与下一层的每个神经元都有连接——如果允许任意层的任意神经元连接到任意层去,我们就得到了一个波尔兹曼机(非受限的))。

标准的RBM中,隐含和可见层的神经元都是二态的(即神经元的激活值只能是服从伯努力分布的0或1),不过也存在其它非线性的变种。

虽然学者们已经研究RBM很长时间了,最近出现的对比差异无监督训练算法使这个领域复兴。

对比差异

单步对比差异算法原理:

1、正向过程:

    • 输入样本 v 输入至输入层中。
    • v 通过一种与前馈网络相似的方法传播到隐含层中,隐含层的激活值为 h

2、反向过程:

    • 将 h 传回可见层得到 v’ (可见层和隐含层的连接是无方向的,可以这样传)。
    • 再将 v’ 传到隐含层中,得到 h’

3、权重更新:

其中 a 是学习速率, vv’hh’ 和 都是向量。

算法的思想就是在正向过程中影响了网络的内部对于真实数据的表示。同时,反向过程中尝试通过这个被影响过的表示方法重建数据。主要目的是可以使生成的数据与原数据尽可能相似,这个差异影响了权重更新。

换句话说,这样的网络具有了感知对输入数据表示的程度的能力,而且尝试通过这个感知能力重建数据。如果重建出来的数据与原数据差异很大,那么进行调整并再次重建。

再看流行感冒的例子

为了说明对比差异,我们使用与上例相同的流感症状的数据集。测试网络是一个包含6个可见层神经元、2个隐含层神经元的RBM。我们用对比差异的方法对网络进行训练,将症状 v 赋到可见层中。在测试中,这些症状值被重新传到可见层;然后再被传到隐含层。隐含层的神经元表示健康/生病的状态,与自编码器相似。

在进行过几百次迭代后,我们得到了与自编码器相同的结果:输入一个生病样本,其中一个隐含层神经元具有更高激活值;输入健康的样本,则另一个神经元更兴奋。

例子的代码在这里

深度网络

到现在为止,我们已经学习了隐含层中强大的特征探测器——自编码器和RBM,但现在还没有办法有效的去利用这些功能。实际上,上面所用到的这些数据集都是特定的。而我们要找到一些方法来间接的使用这些探测出的特征。

好消息是,已经发现这些结构可以通过栈式叠加来实现深度网络。这些网络可以通过贪心法的思想训练,每次训练一层,以克服之前提到在反向传播中梯度消失及过度拟合的问题。

这样的算法架构十分强大,可以产生很好的结果。如Google著名的“猫”识别,在实验中通过使用特定的深度自编码器,在无标记的图片库中学习到人和猫脸的识别。

下面我们将更深入。

栈式自编码器

和名字一样,这种网络由多个栈式结合的自编码器组成。

 

自编码器的隐含层 t 会作为 t + 1 层的输入层。第一个输入层就是整个网络的输入层。利用贪心法训练每一层的步骤如下:

1、通过反向传播的方法利用所有数据对第一层的自编码器进行训练(t=1,上图中的红色连接部分)。

2、训练第二层的自编码器 t=2 (绿色连接部分)。由于 t=2 的输入层是 t=1 的隐含层,我们已经不再关心 t=1 的输入层,可以从整个网络中移除。整个训练开始于将输入样本数据赋到 t=1 的输入层,通过前向传播至 t = 2 的输出层。下面t = 2的权重(输入->隐含和隐含->输出)使用反向传播的方法进行更新。t = 2的层和 t=1 的层一样,都要通过所有样本的训练。

3、对所有层重复步骤1-2(即移除前面自编码器的输出层,用另一个自编码器替代,再用反向传播进行训练)。

4、步骤1-3被称为预训练,这将网络里的权重值初始化至一个合适的位置。但是通过这个训练并没有得到一个输入数据到输出标记的映射。例如,一个网络的目标是被训练用来识别手写数字,经过这样的训练后还不能将最后的特征探测器的输出(即隐含层中最后的自编码器)对应到图片的标记上去。这样,一个通常的办法是在网络的最后一层(即蓝色连接部分)后面再加一个或多个全连接层。整个网络可以被看作是一个多层的感知机,并使用反向传播的方法进行训练(这步也被称为微调)。

栈式自编码器,提供了一种有效的预训练方法来初始化网络的权重,这样你得到了一个可以用来训练的复杂、多层的感知机。

深度信度网络

和自编码器一样,我也可以将波尔兹曼机进行栈式叠加来构建深度信度网络(DBN)。

 

在本例中,隐含层 RBM 可以看作是 RBM t+1 的可见层。第一个RBM的输入层即是整个网络的输入层,层间贪心式的预训练的工作模式如下:

1. 通过对比差异法对所有训练样本训练第一个RBM t=1

2. 训练第二个RBM t=1。由于 t=2 的可见层是 t=1 的隐含层,训练开始于将数据赋至 t=1 的可见层,通过前向传播的方法传至 t=1 的隐含层。然后作为 t=2 的对比差异训练的初始数据。

3. 对所有层重复前面的过程。

4. 和栈式自编码器一样,通过预训练后,网络可以通过连接到一个或多个层间全连接的 RBM 隐含层进行扩展。这构成了一个可以通过反向传僠进行微调的多层感知机。

本过程和栈式自编码器很相似,只是用RBM将自编码器进行替换,并用对比差异算法将反向传播进行替换。

  (注: 例中的源码可以从 此处获得.)

卷积网络

这个是本文最后一个软件架构——卷积网络,一类特殊的对图像识别非常有效的前馈网络。

在我们深入看实际的卷积网络之臆,我们先定义一个图像滤波器,或者称为一个赋有相关权重的方阵。一个滤波器可以应用到整个图片上,通常可以应用多个滤波器。比如,你可以应用四个6×6的滤波器在一张图片上。然后,输出中坐标(1,1)的像素值就是输入图像左上角一个6×6区域的加权和,其它像素也是如此。

有了上面的基础,我们来介绍定义出卷积网络的属性:

  • 卷积层  对输入数据应用若干滤波器。比如图像的第一卷积层使用4个6×6滤波器。对图像应用一个滤波器之后的得到的结果被称为特征图谱(feature map, FM),特征图谱的数目和滤波器的数目相等。如果前驱层也是一个卷积层,那么滤波器应用在FM上,相当于输入一个FM,输出另外一个FM。从直觉上来讲,如果将一个权重分布到整个图像上后,那么这个特征就和位置无关了,同时多个滤波器可以分别探测出不同的特征。
  • 下采样层 缩减输入数据的规模。例如输入一个32×32的图像,并且通过一个2×2的下采样,那么可以得到一个16×16的输出图像,这意味着原图像上的四个像素合并成为输出图像中的一个像素。实现下采样的方法有很多种,最常见的是最大值合并、平均值合并以及随机合并。
  • 最后一个下采样层(或卷积层)通常连接到一个或多个全连层,全连层的输出就是最终的输出。
  • 训练过程通过改进的反向传播实现,将下采样层作为考虑的因素并基于所有值来更新卷积滤波器的权重。

可以在这看几个应用在 MNIST 数据集上的卷积网络的例子,在这还有一个用JavaScript实现的一个可视的类似网络。

实现

目前为止,我们已经学会了常见神经网络中最主要的元素了,但是我只写了很少的在实现过程中所遇到的挑战。

概括来讲,我的目标是实现一个深度学习的库,即一个基于神经网络且满足如下条件的框架:

    • 一个可以表示多种模型的通用架构(比如所有上文提到的神经网络中的元素)
    • 可以使用多种训练算法(反向传播,对比差异等等)。
    • 体面的性能

为了满足这些要求,我在软件的设计中使用了分层的思想。

结构

我们从如下的基础部分开始:

    • NeuralNetworkImpl 是所有神经网络模型实现的基类。
    • 每个网络都包含有一个 layer 的集合。
    • 每一层中有一个 connections 的链表, connection 指的是两个层之间的连接,将整个网络构成一个有向无环图。

这个结构对于经典的反馈网络、RBM 及更复杂的如 ImageNet 都已经足够灵活。

这个结构也允许一个 layer 成为多个网络的元素。比如,在 Deep Belief Network(深度信度网络)中的layer也可以用在其 RBM 中。

另外,通过这个架构可以将DBN的预训练阶段显示为一个栈式RBM的列表,微调阶段显示为一个前馈网络,这些都非常直观而且程序实现的很好。

数据流

下个部分介绍网络中的数据流,一个两步过程:

  1. 定义出层间的序列。例如,为了得到一个多层感知机的结果,输入数据被赋到输入层(因此,这也是首先被计算的层),然后再将数据通过不同的方法流向输出层。为了在反向传播中更新权重,输出的误差通过广度优先的方法从输出层传回每一层。这部分通过 LayerOrderStrategy 进行实现,应用到了网络图结构的优势,使用了不同的图遍历方法。其中一些样例包含了 广度优先策略 和 定位到一个指定的层。层的序列实际上由层间的连接进行决定,所以策略部分都是返回一个连接的有序列表。
  2. 计算激活值。每一层都有一个关联的 ConnectionCalculator,包含有连接的列表(从上一步得来)和输入值(从其它层得到)并计算得到结果的激活值。例如,在一个简单的S形前馈网络中,隐含层的  ConnectionCalculator 接受输入层和偏置层的值(分别为输入值和一个值全为1的数组)和神经元之间的权重值(如果是全连接层,权重值实际上以一个矩阵的形式存储在一个 FullyConnected 结构中,计算加权和,然后将结果传给S函数。ConnectionCalculator 中实现了一些转移函数(如加权求和、卷积)和激活函数(如对应多层感知机的对数函数和双曲正切函数,对应RBM的二态函数)。其中的大部分都可以通过 Aparapi 在GPU上进行计算,可以利用迷你批次训练。

通过 Aparapi 进行 GPU 计算

像我之前提到的,神经网络在近些年复兴的一个重要原因是其训练的方法可以高度并行化,允许我们通过GPGPU高效的加速训练。本文中,我选择 Aparapi 库来进行GPU的支持。

Aparapi 在连接计算上强加了一些重要的限制:

  • 只允许使用原始数据类型的一维数组(变量)。
  • 在GPU上运行的程序只能调用 Aparapi Kernel 类本身的成员函数。

这样,大部分的数据(权重、输入和输出数据)都要保存在 Matrix 实例里面,其内部是一个一维浮点数组。所有Aparapi 连接计算都是使用 AparapiWeightedSum (应用在全连接层和加权求和函数上)、 AparapiSubsampling2D (应用在下采样层)或 AparapiConv2D (应用在卷积层)。这些限制可以通过 Heterogeneous System Architecture 里介绍的内容解决一些。而且Aparapi 允许相同的代码运行在CPU和GPU上。

训练

training 的模块实现了多种训练算法。这个模块依赖于上文提到的两个模块。比如,BackPropagationTrainer (所有的训练算法都以 Trainer 为基类)在前馈阶段使用前馈层计算,在误差传播和权重更新时使用特殊的广度优先层计算。

我最新的工作是在Java8环境下开发,其它一些更新的功能可以在这个branch 下获得,这部分的工作很快会merge到主干上。

结论

本文的目标是提供一个深度学习算法领域的一个简明介绍,由最基本的组成元素开始(感知机)并逐渐深入到多种当前流行且有效的架构上,比如受限波尔兹曼机。

神经网络的思想已经出现了很长时间,但是今天,你如果身处机器学习领域而不知道深度学习或其它相关知识是不应该的。不应该过度宣传,但不可否认随着GPGPU提供的计算能力、包括Geoffrey Hinton, Yoshua Bengio, Yann LeCun and Andrew Ng在内的研究学者们提出的高效算法,这个领域已经表现出了很大的希望。现在正是最佳的时间深入这些方面的学习。

附录:相关资源

如果你想更深入的学习,下面的这些资源在我的工作当中都起过重要的作用:

在听到人们谈论机器学习的时候,你是不是对它的涵义只有几个模糊的认识呢?你是不是已经厌倦了在和同事交谈时只能一直点头?让我们改变一下吧!

本指南的读者对象是所有对机器学习有求知欲但却不知道如何开头的朋友。我猜很多人已经读过了“机器学习”的维基百科词条,倍感挫折,以为没人能给出一个高层次的解释。本文就是你们想要的东西。

本文目标在于平易近人,这意味着文中有大量的概括。但是谁在乎这些呢?只要能让读者对于ML更感兴趣,任务也就完成了。

何为机器学习?

机器学习这个概念认为,对于待解问题,你无需编写任何专门的程序代码,遗传算法(generic algorithms)能够在数据集上为你得出有趣的答案。对于遗传算法,不用编码,而是将数据输入,它将在数据之上建立起它自己的逻辑。

举个例子,有一类算法称为分类算法,它可以将数据划分为不同的组别。一个用来识别手写数字的分类算法,不用修改一行代码,就可以用来将电子邮件分为垃圾邮件和普通邮件。算法没变,但是输入的训练数据变了,因此它得出了不同的分类逻辑。

机器学习算法是个黑盒,可以重用来解决很多不同的分类问题。

“机器学习”是一个涵盖性术语,覆盖了大量类似的遗传算法。

 

两类机器学习算法

你可以认为机器学习算法分为两大类:监督式学习(Supervised Learning)监督式学习(Unsupervised Learning)。两者区别很简单,但却非常重要。

监督式学习

假设你是一名房产经纪,生意越做越大,因此你雇了一批实习生来帮你。但是问题来了——你可以看一眼房子就知道它到底值多少钱,实习生没有经验,不知道如何估价。

为了帮助你的实习生(也许是为了解放你自己去度个假),你决定写个小软件,可以根据房屋大小、地段以及类似房屋的成交价等因素来评估你所在地区房屋的价值。

你把3个月来城里每笔房屋交易都写了下来,每一单你都记录了一长串的细节——卧室数量、房屋大小、地段等等。但最重要的是,你写下了最终的成交价:

这是我们的“训练数据”。

我们要利用这些训练数据来编写一个程序来估算该地区其他房屋的价值:

这就称为监督式学习。你已经知道每一栋房屋的售价,换句话说,你知道问题的答案,并可以反向找出解题的逻辑。

为了编写软件,你将包含每一套房产的训练数据输入你的机器学习算法。算法尝试找出应该使用何种运算来得出价格数字。

这就像是算术练习题,算式中的运算符号都被擦去了: 

天哪!一个阴险的学生将老师答案上的算术符号全擦去了。

看了这些题,你能明白这些测验里面是什么样的数学问题吗?你知道,你应该对算式左边的数字“做些什么”以得出算式右边的答案。

在监督式学习中,你是让计算机为你算出数字间的关系。而一旦你知道了解决这类特定问题所需要的数学方法后,你就可以解答同类的其它问题了。

非监督式学习

 

让我们回到开头那个房地产经纪的例子。要是你不知道每栋房子的售价怎么办?即使你所知道的只是房屋的大小、位置等信息,你也可以搞出很酷的花样。这就是所谓的非监督式学习

 
即使你不是想去预测未知的数据(如价格),你也可以运用机器学习完成一些有意思的事。

这就有点像有人给你一张纸,上面列出了很多数字,然后对你说:“我不知道这些数字有什么意义,也许你能从中找出规律或是能将它们分类,或是其它什么-祝你好运!”

你该怎么处理这些数据呢?首先,你可以用个算法自动地从数据中划分出不同的细分市场。也许你会发现大学附近的买房者喜欢户型小但卧室多的房子,而郊区的买房者偏好三卧室的大户型。这些信息可以直接帮助你的营销。

你还可以作件很酷的事,自动找出房价的离群数据,即与其它数据迥异的值。这些鹤立鸡群的房产也许是高楼大厦,而你可以将最优秀的推销员集中在这些地区,因为他们的佣金更高。

本文余下部分我们主要讨论监督式学习,但这并不是因为非监督式学习用处不大或是索然无味。实际上,随着算法改良,不用将数据和正确答案联系在一起,因此非监督式学习正变得越来越重要。

老学究请看:还有很多其它种类的机器学习算法。但初学时这样理解不错了。

 

太酷了,但是评估房价真能被看作“学习”吗?

作为人类的一员,你的大脑可以应付绝大多数情况,并且没有任何明确指令也能够学习如何处理这些情况。如果你做房产经纪时间很长,你对于房产的合适定价、它的最佳营销方式以及哪些客户会感兴趣等等都会有一种本能般的“感觉”。强人工智能(Strong AI)研究的目标就是要能够用计算机复制这种能力。

但是目前的机器学习算法还没有那么好——它们只能专注于非常特定的、有限的问题。也许在这种情况下,“学习”更贴切的定义是“在少量范例数据的基础上找出一个等式来解决特定的问题”。

不幸的是,“机器在少量范例数据的基础上找出一个等式来解决特定的问题”这个名字太烂了。所以最后我们用“机器学习”取而代之。

当然,要是你是在50年之后来读这篇文章,那时我们已经得出了强人工智能算法,而本文看起来就像个老古董。未来的人类,你还是别读了,叫你的机器仆人给你做份三明治吧。

让我们写代码吧!

前面例子中评估房价的程序,你打算怎么写呢?往下看之前,先思考一下吧。

如果你对机器学习一无所知,很有可能你会尝试写出一些基本规则来评估房价,如下:

假如你像这样瞎忙几个小时,也许会取得一点成效,但是你的程序永不会完美,而且当价格变化时很难维护。

如果能让计算机找出实现上述函数功能的办法,这样岂不更好?只要返回的房价数字正确,谁会在乎函数具体干了些什么呢?

考虑这个问题的一种角度是将房价看做一碗美味的汤,而汤中成分就是卧室数、面积和地段。如果你能算出每种成分对最终的价格有多大影响,也许就能得到各种成分混合起来形成最终价格的具体比例。

这样可以将你最初的程序(全是疯狂的if else语句)简化成类似如下的样子:

请注意那些用粗体标注的神奇数字——.841231951398213, 1231.1231231,2.3242341421, 201.23432095。它们称为权重。如果我们能找出对每栋房子都适用的完美权重,我们的函数就能预测所有的房价!

找出最佳权重的一种笨办法如下所示:

步骤1:

首先,将每个权重都设为1.0:

步骤2:

将每栋房产带入你的函数运算,检验估算值与正确价格的偏离程度:

运用你的程序预测房屋价格。

 

例如:上表中第一套房产实际成交价为25万美元,你的函数估价为17.8万,这一套房产你就差了7.2万。

再将你的数据集中的每套房产估价偏离值平方后求和。假设数据集中有500套房产交易,估价偏离值平方求和总计为86,123,373美元。这就反映了你的函数现在的“正确”程度。

现在,将总计值除以500,得到每套房产的估价偏离平均值。将这个平均误差值称为你函数的代价

如果你能调整权重使得这个代价变为0,你的函数就完美了。它意味着,根据输入的数据,你的程序对每一笔房产交易的估价都是分毫不差。而这就是我们的目标——尝试不同的权重值以使代价尽可能的低。

步骤3:

不断重复步骤2,尝试所有可能的权重值组合。哪一个组合使得代价最接近于0,它就是你要使用的,你只要找到了这样的组合,问题就得到了解决!

思想扰动时间

这太简单了,对吧?想一想刚才你做了些什么。你取得了一些数据,将它们输入至三个通用的简单步骤中,最后你得到了一个可以对你所在区域的房屋进行估价的函数。房价网,要当心咯!
但是下面的事实可能会扰乱你的思想:

1.过去40年来,很多领域(如语言学/翻译学)的研究表明,这种通用的“搅动数据汤”(我编造的词)式的学习算法已经胜过了需要利用真人明确规则的方法。机器学习的“笨”办法最终打败了人类专家。

2.你最后写出的函数真是笨,它甚至不知道什么是“面积”和“卧室数”。它知道的只是搅动,改变数字来得到正确的答案。

3.很可能你都不知道为何一组特殊的权重值能起效。所以你只是写出了一个你实际上并不理解却能证明的函数。
4.试想一下,你的程序里没有类似“面积”和“卧室数”这样的参数,而是接受了一组数字。假设每个数字代表了你车顶安装的摄像头捕捉的画面中的一个像素,再将预测的输出不称为“价格”而是叫做“方向盘转动度数”,这样你就得到了一个程序可以自动操纵你的汽车了!

太疯狂了,对吧?

 

步骤3中的“尝试每个数字”怎么回事?

好吧,当然你不可能尝试所有可能的权重值来找到效果最好的组合。那可真要花很长时间,因为要尝试的数字可能无穷无尽。
为避免这种情况,数学家们找到了很多聪明的办法来快速找到优秀的权重值,而不需要尝试过多。下面是其中一种:
首先,写出一个简单的等式表示前述步骤2:

这是你的代价函数

接着,让我们将这同一个等式用机器学习的数学术语(现在你可以忽略它们)进行重写:

 
θ表示当前的权重值。 J(θ) 意为“当前权重值对应的代价”。

这个等式表示我们的估价程序在当前权重值下偏离程度的大小。
如果将所有赋给卧室数和面积的可能权重值以图形形式显示,我们会得到类似下图的图表:

代价函数的图形像一支碗。纵轴表示代价。

图中蓝色的最低点就是代价最低的地方——即我们的程序偏离最小。最高点意味着偏离最大。所以,如果我们能找到一组权重值带领我们到达图中的最低点,我们就找到了答案!

因此,我们只需要调整权重值使我们在图上能向着最低点“走下坡路”。如果对于权重的细小调节能一直使我们保持向最低点移动,那么最终我们不用尝试太多权重值就能到达那里。

如果你还记得一点微积分的话,你也许记得如果你对一个函数求导,结果会告诉你函数在任一点的斜率。换句话说,对于图上给定一点,它告诉我们那条路是下坡路。我们可以利用这一点朝底部进发。

所以,如果我们对代价函数关于每一个权重求偏导,那么我们就可以从每一个权重中减去该值。这样可以让我们更加接近山底。一直这样做,最终我们将到达底部,得到权重的最优值。(读不懂?不用担心,接着往下读)。

这种找出最佳权重的办法被称为批量梯度下降,上面是对它的高度概括。如果想搞懂细节,不要害怕,继续深入下去吧。

当你使用机器学习算法库来解决实际问题,所有这些都已经为你准备好了。但明白一些具体细节总是有用的。

 

还有什么你随便就略过了?

上面我描述的三步算法被称为多元线性回归。你估算等式是在求一条能够拟合所有房价数据点的直线。然后,你再根据房价在你的直线上可能出现的位置用这个等式来估算从未见过的房屋的价格。这个想法威力强大,可以用它来解决“实际”问题。

但是,我为你展示的这种方法可能在简单的情况下有效,它不会在所有情况下都有用。原因之一是因为房价不会一直那么简单地跟随一条连续直线。

但是,幸运的是,有很多办法来处理这种情况。对于非线性数据,很多其他类型的机器学习算法可以处理(如神经网络或有核向量机)。还有很多方法运用线性回归更灵活,想到了用更复杂的线条来拟合。在所有的情况中,寻找最优权重值这一基本思路依然适用。

还有,我忽略了过拟合的概念。很容易碰上这样一组权重值,它们对于你原始数据集中的房价都能完美预测,但对于原始数据集之外的任何新房屋都预测不准。这种情况的解决之道也有不少(如正则化以及使用交叉验证数据集)。学会如何处理这一问题对于顺利应用机器学习至关重要。

换言之,基本概念非常简单,要想运用机器学习得到有用的结果还需要一些技巧和经验。但是,这是每个开发者都能学会的技巧。

 

机器学习法力无边吗?

一旦你开始明白机器学习技术很容易应用于解决貌似很困难的问题(如手写识别),你心中会有一种感觉,只要有足够的数据,你就能够用机器学习解决任何问题。只需要将数据输入进去,就能看到计算机变戏法一样找出拟合数据的等式。

但是很重要的一点你要记住,机器学习只能对用你占有的数据实际可解的问题才适用。

例如,如果你建立了一个模型来根据每套房屋内盆栽数量来预测房价,它就永远不会成功。房屋内盆栽数量和房价之间没有任何的关系。所以,无论它怎么去尝试,计算机也推导不出两者之间的关系。

你只能对实际存在的关系建模。

怎样深入学习机器学习

我认为,当前机器学习的最大问题是它主要活跃于学术界和商业研究组织中。对于圈外想要有个大体了解而不是想成为专家的人们,简单易懂的学习资料不多。但是这一情况每一天都在改善。

吴恩达教授(Andrew Ng)在Coursera上的机器学习免费课程非常不错。我强烈建议由此入门。任何拥有计算机科学学位、还能记住一点点数学的人应该都能理解。

另外,你还可以下载安装SciKit-Learn,用它来试验成千上万的机器学习算法。它是一个python框架,对于所有的标准算法都有“黑盒”版本。

作者:董可人
链接:https://www.zhihu.com/question/23667442/answer/28965906
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

对题目中提到的“冰山算法”,我刚好有一些了解,可以给大家讲讲。很多人对“量化交易”的理解实在太过片面,基本上把它等同于生钱工具,我不赞同这种观点。交易首先是交易本身,有它自身的经济学意义,忽略这一点而单纯把它看成使钱增值的数字游戏,很容易就会迷失本心。

我也不认为算法本身有什么稀奇,再好的算法也是死的,真正的核心价值一定是掌握和使用算法的人。实际上我讲的东西也都是公开的信息,但是即便了解了技术细节,能真正做好的人也寥寥无几。

希望这个回答可以让你对量化和高频交易有一个更清醒的认识。

~~~~~~~~~~~~~~~~~~

首先我相信不少人概念里的高频交易还是这个样子的:

但对高频交易来说,这种信息是非常粗糙的。所以这里先要对不熟悉背景的同学介绍一下什么叫做Order Book。现在主流的交易所一般都使用Order Book进行交易,交易所在内部的Order Book上记录所有买家和卖家的报价,比如像这样:

Bid表示买家,Offer表示卖家,这张报价单表示买卖双方发出的所有报价单(Limit Order)。这张表才是高频交易最关心的信息。任意时刻,买家的出价总是低于卖家(比如这里的98对101)。所以报价虽然一直在变化,但是只有报价是不会有任何成交的。

什么时候会产生交易呢?有两种情况,第一是任一方发出市价单(Market Order),比如一个买家发出一张单量为10的市价单,就可以买到卖方在101价格上挂的10份,这个交易成功之后,Order Book会变成这样:

第二是发出一个价格等于对方最优报价的限价单,也会产生和上述情况相同的结果。

需要强调的是,虽然真正的Order Book只存在于交易所内部,所有交易都在交易所内完成,但是交易所会把每笔报价和市价单都转发给所有人,所以所有的买家和卖家都可以自己维护一个同样的数据结构,相当于交易所Order Book的镜像。通过跟踪分析自己手里这份的镜像变化,来制定交易策略,是高频交易算法的核心思想。

~~~~~~~~~~~~~~~~~~

基础知识介绍完毕,下面为了方便大家理解,我采用一种更形象的方式来表示Order Book:

这张图对应文章开始时的那个Order Book,应该可以明白地看出,横轴表示价格,纵轴表示订单量,绿色表示买家,红四表示卖家。这样做的目的是为了引出本篇讨论的主题:冰山订单。

通过上述基本分析大家可以看出,交易所内的交易数据是完全公开的,市场上任意时刻,有谁想要买/卖多少,所有人一目了然,没有任何秘密。这样做本身是有经济学意义的,因为只有展示出买卖的需求,才会吸引潜在的商家来交易,所以在市场上一定程度的公开自己的需求是必要的。但这样同时带来一个严重的后果,一旦有某个人想要大量买/卖,他所发出的巨额限价单会直接展示给所有人。比如一个买家挂出巨额买单后,Order Book会像这样:

这对他非常不利,因为所有人都会利用这个信息来跟他做对。大家会判断,现在市场上存在大量的买压,于是会出现一大批为了赚钱而冲进来的人抢购,价格会快速上升,这样原来这个人可以在98这个价位买到的东西,很快就变得要在更高的价位上才能买到。这种情况,那些后来的人做的就是Front running,而原来的那个人则面对逆向选择风险

为了解决这个问题,交易所提供了一种针对性的工具,就是所谓的冰山订单(Iceberg Order)。这种订单可以很大,但只有一小部分是公开出来的,大部分则隐藏起来,除了交易所和发单者本人谁也看不到,真的像一座“冰山”一样。比如像这样:

灰色的部分就是冰山订单隐藏的部分。这样,只有当有对应隐藏量的交易发生时,交易所才会通知其他人,就避免了别人利用显示订单的信息来做Front running

凡事有一利必有一弊。冰山订单虽然保护了发单者的利益,但是对于其他市场参与者来说却又变成了一种不公平的规则。那些有真实的交易需求的参与者,会因为对局势的误判而损失惨重。所以接下来的问题就变成,如何发现市场上的冰山订单?

首先有一种最简单的方法。有的时候,冰山订单是挂在最优买价和卖价之间(spread),像这样:

对于这种情况,有一个非常简单的探测方法,即发一个最小额度的限价单在spread里,紧跟着取消这个订单。比如这个例子中,发出一个卖价为99的限价单然后取消。因为这个价格本身对不上显式的买价(98),如果没有冰山单的存在,一定不会成交。但有冰山单的情况下,一旦交易所收到这个卖单,会立刻成交冰山单中对应的量,而之后的取消指令就无效了。这样,以一种微小的成本,就可以发现市场中隐藏着的订单。事实上,的确有人会做这种事情,频繁的发单然后取消,在最优价差之间形成一种高频扰动,用来探测隐藏单。

为了应对这种扰动探测,大家一般都不会直接挂单在spread里。而是会像之前那样和普通的限价单挂在一起,这样发生交易之后,你就很难推测消耗掉的究竟是正常的限价单,还是冰山订单。那么应该怎么做呢?

首先有一个直接的思路。冰山订单的存在,一定程度上反映了挂单人对市场情况的解读,认为有必要使用冰山订单而做出的判断。需要强调的是,使用冰山订单并不是没有代价的,因为你隐藏了真实的需求,在屏蔽掉潜在的攻击者的同时,也屏蔽掉了真正的交易者!而且会使得成交时间显著增加--因为没人知道你想买/卖这么多,你只能慢慢等待对手盘的出现。所以当有人下决定发出冰山订单的时候,也会有对市场情况的考虑,只有合适的时机才会做这种选择。

什么是合适的时机?有一些数据应该是相关的,比如买卖价差spread,买单量对卖单量的比值等。对这些数据,你可以在历史数据上做回归分析,建立起他们和冰山订单之间的线性/非线性模型。通过历史数据训练出来的这个模型,就可以作为你在实时交易时使用的冰山订单探测器。这是 On the Dark Side of the Market: Identifying and Analyzing Hidden Order Placements 这篇论文使用的方法。

基本模型可以定义为:F(spread,bidSize/offerSize,……) = Probability(Iceberg)

如果你想玩高深的,还可以在此基础上做HMM,SVM,神经网络之类的高级模型,但基本思路是一致的:通过盘口分析计算存在冰山订单的概率。

~~~~~~~~~~~~~~~~~~

上面说的这个方法,看起来很高级,实际效果如何呢?我想大家也看出来了,这种建模不是很精确。作为事后分析手段用来说明什么情况下可能会出现冰山订单还不错,但是作为实时交易的探测器就不是很放心。因为使用的信息太模糊了,而且说到底建模的对象只是一种相关性,没有什么保证冰山订单的发送者一定是按照这个逻辑出牌的。

所以接下来介绍的,才是真正具有高频玩家神采的方法,来自 Prediction of Hidden Liquidity in the Limit Order Book of GLOBEX Futures 这篇论文。

~~~~~~~~~~~~~~~~~~

高频世界里,有一条永恒的建模准则值得铭记:先看数据再建模。如果你看了上面的介绍就开始天马行空的思考数学模型,那基本上是死路一条。我见过很多年轻人,特别有热情,一上来就开始做数学定义,然后推导偏微分方程,数学公式写满一摞纸,最后一接触数据才发现模型根本行不通,这是非常遗憾的。

而看了数据的人会怎么样呢?他很可能会发现,对于冰山订单的处理,交易所的规则是非常值得寻味的。有的交易所是这样做的:一个冰山订单包含两个参数,V表示订单总量,p表示公开显示的量。比如V=100,p=10的冰山单,实际上隐藏的量是90。如果有针对这个订单的交易发生,比如交易量10,交易所会顺序发出三条信息:

  1. 成交10
  2. Order Book的Top bid size -10
  3. 新Bid +10

这三条信息一定会连续出现,并且第三条和第一条的时差dt很小。这样做的原因是尽管冰山订单存在隐藏量,但是每次的交易只能对显示出的量(p)发生,p被消耗掉以后,才会从剩余的隐藏量中翻新出一分新的p量。这样,每个人从交易所收到的信息仍然可以在逻辑上正确的更新Order Book,就好像冰山订单并不存在一样。

因此,一旦在数据中观察到这个规律,我们就可以非常有把握的判定市场中存在冰山订单,并且连p的值都可以确定!接下来的关键问题是,如何确定V的值,即判断这个冰山订单的剩余存量有多少?

这个问题从本质上说没法精确求解,因为V和p都是由下单人自己决定的,可以是任意值。但可以从两点考虑:第一,两个值都是整数;第二,人类不是完美的随机数生成器,下决定会遵循一定规律。

从这两点出发,可以对V和p建立概率模型,即计算一个给定的(V,p)值组合出现的概率是多少?这里不去深入探讨数学分析,感兴趣的朋友可以自己去看原文。简单说,可以在历史数据上通过kernel estimation技术来估算他们的概率密度函数的形状。顺带一提,如果你亲手编写过这种估算程序,就会理解我为什么在“要想成为一名优秀的 Quant 需要什么样的编程水平?”这个答案中如此强调编程的重要性。在数据上估算出来的概率密度函数可能会是这样的:

这样,当你在实时数据中观测到一个p的值时,就可以得出对应的V值的条件概率密度函数,即上图的一个切面,比如(p = 8):

接下来显然就很容易计算V最可能是什么值了。这条函数曲线还有一个重要的作用是帮助你动态评估剩余存量,比如当你观察到已经有5份p被消耗掉,即可推出V>=40,由上图即可推出新的V值和剩余存量(V-5p)。

综上,算法的核心在于,通过在实时数据中监测短时间内连续出现的三条相关记录判断冰山订单的存在,而对冰山订单的量化则通过由历史数据训练出的概率模型来完成。

相信你也会看出,这种算法并不是什么作弊神器。它只是利用市场上的公开数据所做的一种推测。而且这个推测也仅仅是基于概率的,更多的应该是作为一种参考。它对做市商这种流动性提供者很有意义,可以使他们避免因为对局势的误判而遭受损失。但如果你想用它来作为一种攻击手段,觉得自己能发现隐藏大单而去Front run,那实在是很不明智的选择。

最后,这种算法也只是针对特定的交易所。其他的交易所也许不会采用同样的冰山订单处理方式。所以真正有价值的是这种从实际数据出发的建模思路,具体的算法并不值钱。

~~~~~~~~~~~~~~~~~~

这个小算法给你展示了高频交易领域的“冰山一角”。它看起来也许不算很复杂,但是我却很喜欢。因为它清晰地展示了什么叫做先有思路,再有量化。因为有“冰山订单”这样一个从经济学基本的供需关系出发的真实需求,通过分析实际数据找到一丝线索,最后通过数学模型刻画出定量的策略,这才是漂亮的策略研发。

如果违背这个原则,一上来就去搬各种高级的模型去套数据,指望模型自动给你生成交易信号,这在我看来无异于痴人说梦。遗憾的是,这个梦的确太过诱人,而这个世界也从来不缺少莽夫。

且行且珍惜。

  1. Machine learning research
    1. 先用程式抓取每日高低點
    2. 先低後高時當天做多,先高後低時當天做空
    3. 進場或出場點固定都是在高低點出現後的第6分鐘
    4. 訓練資料為 高點出現前的10分鐘,出現後的5分鐘也就是 Sample[0~14] 中"10″的位置
    5. 用各種不同的指標做訓練,一隻策略最多只能參考3個指標
    6. Trainning Data= Sample[0~2,0~14] 取每周2,4的買點與賣點各2組資料,用來回測1,3,5的買賣點
  2. 影線K棒逆勢策略
    1. 統計過去K棒長-影線長 當成模擬損益 (影線>K棒時當天順勢策略虧損機率高)
    2. 歸納出(影線>K棒)與(K棒>影線)這種狀況時的特徵
    3. 當天若研判 (影線>K棒) 但 (影線<K棒) 時,進場逆勢單
    4. 當天若研判 (K棒>影線) 但 (影線<K棒) 時,進場順勢單