你以為AlphaGo只是下圍棋厲害?不,它還能用來優化金融交易策略引數

weixin_34127717發表於2019-03-18

提取阿爾法狗中的靈感

還記得2016年3月9日-3月15日在韓國首爾上演的圍棋界終極挑戰嗎?在總計五輪的人與機器的對決,人類一方的代表——世界圍棋冠軍李世石很不幸完敗於機器一方的代表——美國Google公司旗下DeepMind團隊開發的圍棋人工智慧程式AlphaGo(“阿爾法狗”),這個結果引起了人工智慧領域巨大的轟動,也引發了人們對阿爾法狗核心技術的深入研究。

這場終極對決可謂是意義深遠,AlphaGo的勝利意味著人們對人工智慧的探索已經到達了一個新的階段。早期傳統的棋類軟體一般採用暴力窮舉法,也就是把棋盤上所有可能局面一一列舉出來建立搜尋樹,並遍歷搜尋樹從中篩選最優勢的走法。不過這隻能適用於解決效率低,規模小的問題。由於圍棋是一種複雜且深奧的遊戲,一方面圍棋的每一步可能性非常多,另一方面落子選擇在某種程度上依靠棋手經驗積累,因此在瞬息萬變的局面下,計算機很難分辨當下棋局的優勢方和弱勢方。可見攻克圍棋一直被認為是人工智慧領域中的一個巨大挑戰。

AlphaGo則採用了深度神經網路、監督/強化學習、蒙特卡洛樹搜尋這三個“利器”的結合完美解決了以上這些問題。下面簡單瞭解下這三個“利器”,看下是哪件“利器”解決了搜尋棋局樣本空間巨大這個問題。

關於深度神經網路,AlphaGo包含策略網路和估值網路。策略網路主要是用來生成落子策略,它會根據棋盤當前的狀態,搜尋出最符合人類高手的幾種可行的下法位置。但是策略網路只知道這步棋是否跟人類下的一樣,並不知道這步棋到底下得好不好,這時候需要估值網路為各個可行的下法評估出一個“勝率”,策略網路結合“勝率”最終確定落子的策略。

關於監督/強化學習,AlphaGo背後是一群傑出的電腦科學家,在初始階段,科學家利用神經網路演算法將大量棋類專家的比賽資料輸入給AlphaGo,使它學習人類棋手的下法,形成自己獨特的判斷方式。之後,在不計其數的自我模擬對弈,以及每一次與人類棋手對弈中,總結並生成自己的“經驗”,實現自我提高。

關於蒙特卡洛樹搜尋,在從根結點開始選擇要搜尋的分支子結點時,每一次決策都會同時產生多個可能性,AlphaGo對這些可能結果進行模擬運算,根據估值網路反饋的勝率作出最優決策,通過不斷的推演使得遊戲局勢向預測的最優點移動,直到模擬遊戲勝利。

\"image\"

對於解決如何在搜尋樣本空間巨大的情況下搜尋出更好的節點,蒙特卡洛樹搜尋法MCTS(Monte Carlo Tree Search)起到了至關重要的作用。單從字面意思上蒙特卡洛樹搜尋法可理解為在樹搜尋方法上融入蒙特卡洛法,將隨機模擬的思想應對於大量不確定樣本的情況下。通過不斷的模擬得到大部分節點的估值,然後下次模擬的時候根據估值有針對地選擇值得利用和值得探索的節點繼續模擬,在搜尋空間巨大並且計算能力有限的情況下,這種啟發式搜尋能更集中地、更大概率找到一些更好的節點。那麼隨機模擬的蒙特卡洛演算法又是如何實現的呢?

深入瞭解蒙特卡洛思想

蒙特卡洛(Monte Carlo)法確切地說是一類隨機模擬演算法的統稱,提出者是大名鼎鼎的計算機之父馮·諾伊曼,因為在賭博中體現了許多隨機模擬的演算法,所以他借用馳名世界的賭城—摩納哥的蒙特卡洛來命名這種方法。

此處以網路上普遍採用的例子加以擴充套件來解釋下蒙特卡洛法的思想。

假如籃子裡有1000個蘋果,讓你每次閉著眼睛拿1個,挑出最大的。於是你閉著眼睛隨機拿了一個,然後再隨機拿一個與第一個比,留下大的,再隨機拿一個,與前次留下的比較,又可以留下大的……你每拿一次,留下的蘋果至少是當前最大的,迴圈往復這樣,拿的次數越多,挑出最大蘋果的可能性也就越大,但除非你把1000個蘋果都挑一遍,否則你無法肯定最終挑出來的就是最大的一個。

這麼看來蒙特卡洛法的理論支撐其實是統計概率理論中的伯努利分佈。以拋硬幣為例,每次拋硬幣只有正面朝上或反面朝上兩種可能的結果,由於伯努利分佈的特點是每次取樣是相互獨立的,那麼前5次拋硬幣對於第6次拋硬幣的結果沒有任何影響。當拋硬幣次數的增加到一定次數時會發現正面和反面出現的概率會無限的接近於50%。

挑蘋果也是一樣的,每次挑出最大的蘋果的概率是1/1000(此處概率僅為說明觀點,實際上第一次的概率為1/1000,第二次開始為1/999),由於每次挑選是一個獨立的事件,在獨立事件中1/1000這個概率是始終保持不變的。當挑蘋果次數的增加到一定次數時會發現實際挑出最大的蘋果的次數會遵循1/1000這個概率。

也就是說,蒙特卡洛法取樣越多,越能找到最佳的解決辦法,但只是儘量找最好的,不保證一定是最好的。在這種情況下如果要求必須找出最優解,也就是最大的蘋果,那還不如採用暴力窮舉法逐個比較所有的蘋果的大小來的直接,但是如果用這種方法尋找一個連續區間[-2,2]上某個函式的極值時肯定是行不通的,此時更合理的是用蒙特卡羅法在有限取樣內,給出一個近似的最優解。我們通過以下計算函式極值的實驗瞭解下蒙特卡洛法的應用。

實驗原理:

極值是“極大值” 和 “極小值”的統稱。如果一個函式在某點的一個鄰域內處處都有確定的值,當函式在該點的值大於或等於在該點附近任何其他點的函式值,則稱函式在該點的值為函式的“極大值”;當函式在該點的值小於或等於在該點附近任何其他點的函式值,則稱函式在該點的值為函式的“極小值”。此處在區間[-2,2]上隨機生成一個數,求出其對應的y,找出其中最大值可認為是函式在[-2,2]上的極大值。

實驗步驟:

(1)設函式y=f(x)=200*sin(x)e-0.05x
(2)隨即取點(X),使得-2 \u0026lt;=X\u0026lt;=2,即點在區間[-2,2]內
(3)通過公式 f(x)\u0026gt; f(x)max判斷當前點的值是否是最大值
(4)每次更新最大值和對應的點。
(5)執行結果發現極大值185.1204262706596, 極大值點為1.5144491499169481

例程如下:

def cal_extremum_mc(n = 1000000):    y_max = 0.0    x_min, x_max = -2.0, 2.0    y = lambda x:200*np.sin(x)*np.exp(-0.05*x)#匿名函式    for i in range(0, n+1):        x0 = random.uniform(x_min, x_max)        if y(x0) \u0026gt; y_max:            y_max = y(x0)            x_max = x0    return y_max, x_max

以上例子也稱為基於蒙特卡洛的投點法,由此得出的值並不是一個精確值,而是一個近似值。當投點的數量越來越大時,這個近似值也越接近真實值。

金融交易策略的引數優化

科學家們花費大量心血研究AlphaGo並不是為了炫耀在圍棋領域能夠戰勝人類,而是想將它的核心技術推廣到各種領域幫助人類解決問題。反觀金融領域,在金融市場中又何嘗不是充滿了隨機性和不確定性,那麼蒙特卡洛法如何應用到金融領域在不確定的市場中尋求近似確定性的方向呢?
在傳統的主觀型交易中,那些技術面分析的交易者習慣於圍繞盤面各種成熟指標的動態來制定交易策略,比如MACD、KDJ、均線指標等等。其實所有的技術指標都是依據股票收盤價、開盤價、最高價、最低價、成交量等原始的交易資料通過某種演算法計算而來的。以最常用的移動平均線來說,10日均線即“之前10個交易日”收盤價的加權平均價,所謂的移動就是將新一個交易日的收盤價加入公式中,同時剔除最早一個交易日的收盤價,不斷右移計算輸出當日對應的SMA值,然後將它們連線起來構成均線。

\"image\"

\"image\"

大家是否注意到,在大多數的股票行情軟體中預設的均線引數普遍是5日、10日、20日、30日、60日、120日……而非6日、7日、21日之類,在各種介紹炒股祕籍的書中也清一色的告訴讀者參照這些預設的引數制定炒股策略。但是這些預設值真的就是最優化的引數值了嗎?好像並不見得,那麼讓我們開始尋找最優化的引數。

此處我們將一個簡單的單均線突破策略應用於浙大網新上進行回測。單均線突破的交易策略為:若昨日收盤價高出過去N日移動平均線則今天開盤即買入股票;若昨日收盤價低於過去N日移動平均線,那麼今天開盤賣出股票。我們用暴力窮舉法遍歷了20至60日均線之間的所有均線引數,發現資金收益最高時所對應的移動平均線的最優引數是58日,而並非通用的60日。

\"image\"

近幾年來金融量化交易發展愈來愈火爆,藉助計算機的強大效能,運用資料建模、統計學分析、程式設計等工具制定交易策略已經成為金融交易市場的一個大的發展趨勢。因此相對於傳統的主觀型交易,策略引數的最優化過程在量化交易中變得更便捷。那麼在制定策略過程中如何選擇策略的最優化引數呢?

顯然,暴力窮舉法只能適應於上述小規模遍歷20至60日均線之間的引數,而對於稍複雜一些的策略模型,如雙均線突破策略就需要兩組引數樣本空間兩兩排列組合。雙均線突破策略為:當短期均線穿過長期均線,同時往上時認為上升趨勢成立,作為買入訊號;當短期均線穿過長期均線,同時往下時認為下跌趨勢成立,作為賣出訊號。如果短期均線引數樣本範圍為 [10,50],長期均線引數樣本範圍為 [50,90],那麼需要遍歷的引數組合就有1600組,再疊加其他指標的引數種類後樣品空間會變得非常巨大。

再從金融市場和量化交易策略模型本身來看,市場在變化,資訊在變化,過去並不代表未來,用歷史資料作量化策略的回測檢驗是把過去的經驗作為一種參考指南,通過對過去的解讀發掘出蘊藏盈利機會的重複性模式。這就像在正式高考前學校都會定期組織模擬考來評估下自己的能力,顯然最終的高考題目不會和模擬考一摸一樣,但在模擬考發揮的水平正常情況下和高考發揮的水平相差不會太大。 可見我們並不需要一成不變的固定引數值,而是持續不斷的更新接近於最優的策略引數值。

因此蒙特卡洛法成為了引數最優化的首選方案。以下例程為分別在短期均線和長期均線的樣本空間中隨機生成均線引數的方法,而後可將取樣的組合引數代入策略中進行回測分析。

例程如下:

def cal_moveavg_mc(n = 500):    avg1_min, avg1_max = 10, 50    avg2_min, avg2_max = 50, 90    ma_list = []    for i in range(0, n+1):        avg1 = int(random.uniform(avg1_min, avg1_max))        avg2 = int(random.uniform(avg2_min, avg2_max))        ma_list.append([avg1,avg2])    #此處新增回測取樣引數    return ma_list

總結

本文簡要介紹了AlphaGo的三個“利器”,以及解決搜尋棋局樣本空間巨大這個問題所採用的蒙特卡洛樹搜尋法,進一步從中提取蒙特卡洛法應用於量化交易的策略引數優化中。量化交易的本質是管理勝算的概率,而蒙特卡洛法的隨機過程同樣是以概率的形式求取近似的解,筆者認為在充滿不確定性的金融市場中,將蒙特卡洛法應用於量化交易的策略引數最優化過程,能夠在引數樣本空間巨大的情況下擇優選出策略引數,值得在業界進行推廣。

作者介紹

元宵大師,Python高階工程師,公眾號《元宵大師帶你用Python量化交易》作者,致力於推動人工智慧在金融量化交易領域中的應用。

相關文章