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

提取阿爾法狗中的靈感

還記得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 <=X<=2,即點在區間[-2,2]內
(3)通過公式 f(x)> 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) > 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量化交易》作者,致力於推動人工智能在金融量化交易領域中的應用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章