摘要: 前言:最近特別忙,寫畢業論文,找工作,忙得不亦樂乎。碩士兩年來做的一些工作,導師沒有讓我往畢業論文裡面寫,我感覺到,這兩年的一些經驗以及所思所想,可能沒有辦法寫成正式的文章了,特別可惜。所以我決定開一個知乎專欄,把自己的一些思考拿出來與大家分享。我從來沒有將機器學習應用在量化投資的實戰經驗(其實我神馬實戰經驗也沒有。。),但是讀過相當數量的相關論文。很多論文,如許多網友所噴,“這玩意兒根本不work”。說實話,我也知道這些論文不work。但是“不work”並不代表“沒用”。一篇文章裡,能有一個閃光的思想,對真實投資有一些借鑒價值,我覺得這篇文章就是“有用”的。而所謂的“不work”,是指把這篇文章的方法應用於真實投資,沒法賺錢。這是廢話,能賺錢,我發出來給你看?我始終認為,看出一篇文章“不work”,並不需要什麼水平,而能從這篇“不work”的文章中,找到有用的信息的人,才是真大神。所以我希望大家能以一個欣賞的眼光去看待這個專欄裡的文章(好吧,其實我只是想少挨點兒噴。。)。我將把我在這個問題機器學習(非傳統統計方法如回歸)到底在量化金融裡哪些方面有應用? – Weicong Liu 的回答下的回答,一條條拓展出來,細緻地寫。水平有限,錯誤難免。廢話到此為止,希望我能把這個專欄堅持下去:)......
▲(來源:36大數據)
在這篇文章裡,我想講的,是那些將技術分析和機器學習算法相結合的論文。首先,我會簡要介紹一個最常用的技術分析方法:雙移動平均線法。然後,我將簡要介紹一下相關的論文。本文的重頭戲是,我想跟大家一起,發現這些方法的問題,逐步把這些方法變成一個“看起來還蠻像樣”的投資策略。我首先聲明,這個方法是否work我也不知道,因為我沒有細緻地嘗試。我想展示的,是一個思考問題的思路。
移動平均線法
一、 下圖展示了一個雙移動平均線的例子。
雙移動平均線的用法是: (1)用兩個長度不同的窗口,計算價格數據的移動平均值; (2)當短的移動平均值穿過長移動平均值時,一個買入信號就誕生了。隨著時間的推移,當短的移動平均值小於長的移動平均值時,就產生了一個賣出信號。 這個方法是如此的簡單方便,很多散戶都會或多或少地使用該方法。學術界對這個方法亦有很大的興趣。文獻[1]首先從假設檢驗的角度,去驗證這個方法在實際數據上的盈利能力。而後有很多論文利用這篇文章中提供的方法,在不同的數據集上驗證。他們的結果都表明,長期來看,如果不考慮交易費的話,這個方法貌似還有一點點的盈利能力,但是如果一點考慮交易費,這個能力就基本為0了。
移動平均與機器學習算法
那麼,這樣一個簡單的移動平均的方法,是怎麼被應用在機器學習算法中,進行投資的呢?千萬不要小看研究人員的腦洞(不過這似乎也不需要太大的腦洞)。 讓我們隨手從機器學習的武器庫裡面挑個武器吧。恩,就神經網絡好了,這玩意兒最近很火。要很深嗎?咱們先用個淺的玩玩吧。我們需要給自己設定一個目標,這個目標是,我希望通過歷史數據值,預測第二天的股價漲跌。有了這個目標,我們乾脆把神經網絡當成一個分類器用。在每一天t,我都基於歷史數據,建立一個輸入向量x_t。看,機會來了,我們可以把移動平均線產生的信號,當成這個特徵向量的某個維度。如果移動平均線讓我們在某天持有該股票,那麼我們可以把這個維度設為1;而在其他的天數,我們則把它設為0。 除了移動平均線,股票的技術分析手段中還有好多可以產生類似信號的東西,比如MACD,RSI之類。所以,我們可以利用這些信號,把它們安放在不同的維度,構成我們輸入向量x_t。標籤y_t就容易了,如果t+1天收益率為正,則設為1,否則為0。至此,一個二分類問題的訓練集構建,就搞定了。 這個方法看起來很簡單,也確實沒啥難想的。相關的文獻不少,可以看參考文獻[2, 3, 4]。在那個年代,這些文章都取得了相當的引用量。
二、 問題與改進
顯然,這樣的方法是存在問題的。而且看起來圖樣圖森破,甚至有點兒naive。在這一節,我們將一步一步,把這個方法變的“看起來還蠻像樣”。
趨勢的表示
使用技術分析手段的人,被認為是趨勢跟隨型的投資者(可能有誤。。)。這些論文裡面也聲稱,他們希望通過神經網絡來預測趨勢。但是,趨勢就是明天股票收益的正負嗎?讓我們來看個例子。下圖是我截取的蘋果公司從2009年10月29日,到2011年10月24日的股價。這是一個非常明顯的上升趨勢。但是,在這個趨勢中,日收益率為正的比率是多大?答案是只有55%。所以你看,把第二天股票收益率的正負當成趨勢的表徵,並不靠譜。
那麼,能不能換一個靠譜一點兒的方式來表達趨勢?也就是表達y_t?當然可以。一個簡單的方法是,我們可以把計算t+1,t+2,…,t+N,這些天收益的平均值,觀察其正負,構建新的y_t(正則1,否則置0)。當然,N是一個可以由你設置的量。
更進一步
經過上一步的改進,這個方法好像似乎有點兒像樣了。我們來理一下思路。我們是怎麼來解決這個問題的呢?步驟如下:(1)大喊一聲“我要做趨勢投資者”,(2)找到那些聲稱表徵趨勢的技術指標,構成輸入向量x_t,(3)為這些向量配備一個表徵趨勢正負的y_t,(4)扔進一個神經網絡訓練,(5)利用訓練好的神經網絡預測。
還是有點兒naive,我們甚至都沒用到神馬金融上的概念。在3.1節的結尾,我們說要用t+1,t+2,…,t+N,這些天的收益的平均值,觀其正負,來構建y_t。這似乎比較靠譜了。但是細細一想,假如這些天收益的平均值為0.02,但是標準差達到了0.04,我們這麼做似乎有點兒慌。而如果這些天的收益平均值是0.01,但是標準差只有0.005,似乎這麼做還是靠譜的。這就提醒我們,作為一個趨勢投資者,在動盪裡,我們如浮萍一般無依(當然,動盪則是另外一些交易者發家致富的機會)。我們構建y_t的時候,不能只去想收益的平均值,還要考慮它的波動。
有了這個概念,我們就可以重新思考下y_t的設定。我們將t+1,t+2,…,t+N這些天收益的平均值記為r_t,而標準差記為sigma_t。我們考慮這樣一個量r_t – lambda * sigma_t的正負。這裡,lambda是一個事先設定的常量,它有一個比較好的金融角度的意義:它體現了投資者對風險的厭惡程度。Lambda越大,厭惡性越強。 當然,你可能覺得這個波動率估計的太不准了。不是有個拿諾獎的工作,(G)ARCH,用來估算波動率的嘛。你也許也可以用它替代sigma_t。......
轉貼自: 36大數據
留下你的回應
以訪客張貼回應