姓名:謝童? 學號:16020188008? 轉自微信公眾號? Bigquant
前言
今年來,隨著Alpha GO的閃亮登場,以及最近強化學習在dota2中戰(zhàn)勝職業(yè)戰(zhàn)隊,強化學習越來越受到人們的關注。一直在關注金融領域的我,很自然地會問,那么強化學習應用在股票交易中會怎么樣?
本文旨在揭開強化學習神秘的面紗,針對對這個領域感興趣的讀者普及強化學習的基本概念,以及強化學習在金融交易中的發(fā)展以及方向。
強化學習基本概念
強化理論最開始是心理學的概念,它是過程型激勵理論之一,最早要追溯到美國的心理學家斯金納。斯金納認為人的行為是對其所獲刺激的函數(shù)。如果這種刺激對他有利,則這種行為就會重復出現(xiàn);若對他不利,則這種行為就會減弱直至消失。根據(jù)強化的性質和目的,可以分為正強化和負強化兩大類型。斯金納認為通過獎懲的設計,可以改變?nèi)嘶蛘邉游锏男袨榱晳T。
在強化學習的基本概念和斯金納的差不多,強化學習通過agent與環(huán)境的動作/交互Action,得到與之對應的獎勵或者懲罰,并在這樣的環(huán)境中進行迭代,與環(huán)境的交互意味著agent可以不斷在經(jīng)驗中修正自己的決策,也就是policy。
大致框架如下圖所示:
下面我們來舉一個大家都熟悉的例子,來幫助大家理解強化學習的基本概念:
Pacman大家小時候在街機或者游戲機上可能都玩過,下面我們用強化學習的術語來定義pacman這個problem。
環(huán)境 Environment
在強化學習中,我們通常對環(huán)境的定義是所有于agent進行交互的東西。在我們這個例子里,pacman的環(huán)境包含了機器人agent的游戲世界,比如迷宮的形狀、迷宮的不可穿墻性,也包含了游戲規(guī)則,比如機器人pacman可以吃豆子變無敵、無敵的時間、無敵時候可以吃掉敵人、敵人還可以再生等等。簡單說是可以可以容納agent的一個“容器”,同時它有它自己的世界和規(guī)則。
Agent?
大家可能會認為這個游戲里的Agent當然就只有一個,那就是吃豆人pacman。然而里面的敵人實際上也是agent,只不過pacman是我們關心的而已。
狀態(tài) State
狀態(tài)是指對于agent而言,它對它所認知觀察的環(huán)境進行建模。在這個游戲中,pacman可以觀察到整個迷宮,知道所有的豆子、無敵豆在哪里,也知道敵人具體在哪里,同時還知道自己的具體位置。那么只需要狀態(tài)State的表述能完整表示這些就ok了。
一種選擇是用字典來表示:
坐標很容易理解,它對應的就是我們游戲迷宮中的最小單元,也是pacman行走的最小單元;每個單元上只能有五種可能的狀態(tài),分別是0->什么都沒有、1->普通豆子、2->無敵豆、3->敵人、4->pacman。
當然這只是一種選擇,這種encoding需要人為編碼,而現(xiàn)在的深度強化學習利用CNN直接從原始像素來對state進行表示。
動作 Action
Action是相對于Agent而言的,pacman的動作包括上、下、左、右。原地不動不是這個游戲中的選項,在任意時刻,pacman必須在這四個動作中選擇一個。當然,遇到墻的時候,它看上去原地不動,本質上還是做出了動作。
獎勵 Reward
強化學習的核心在于獎勵的機制,沒有獎勵和懲罰,agent是不知道他做對了沒有,或者做的多好。同時獎勵的設定本身也定義了agent在環(huán)境中的目標。比如在pacman中,我們可以設定agent每走一步都得到-1的懲罰,這個是為了避免它自己轉圈圈自嗨,也為了給它壓力讓它早點結束游戲;被其他的pacman吃掉,游戲就結束了,所以可以給一個更大的懲罰,比如-100;每吃一個豆子+1;每吃一個無敵豆+5;吃了無敵豆后每吃一個敵人+10。好了,這個可以作為我們對于這個游戲的獎懲設定。于是,最開始的那個強化學習概念圖里的元素這里都有了。
交易游戲
實際上,交易本身也是一種游戲。下面來看我如何像pacman一樣,把交易分解為強化學習的五個基本元素。
Environment
宏觀意義上的環(huán)境就是我們的金融交易市場,里面有成千上萬的交易對手、有做市商、有各種可交易的金融標的、以及各種經(jīng)濟、金融的資訊/信息。當然,在強化學習里,尤其是基于工程視角,這里的環(huán)境可以是一個交易回測引擎,也可以是在線交易平臺。
如上圖所示,交易回測引擎首先包含了一個訂單撮合引擎,它用來模擬真實交易指令獲得成交的過程,在這個過程中,可能包含的場景比如要拒絕無效交易訂單,如漲跌停股票不能交易買入;還比如中國股市的T+1機制,T+0的訂單不能被執(zhí)行;還不如限價單、市價單的執(zhí)行機制。然后就是行情回放或者行情模擬,這是核心的一部分,我們的資產(chǎn)標的價格以及相關信息會隨著時間t不斷更新,背后至少會有一個龐大復雜的行情數(shù)據(jù)庫,可能是EOD、分鐘行情、tick行情、order book等,可能還會包含衍生的指數(shù)數(shù)據(jù)、財務數(shù)據(jù)、宏觀經(jīng)濟數(shù)據(jù)等。最后就是賬戶盈虧統(tǒng)計,其中包含對各種交易的計算匯總、頭寸匯總、手續(xù)費計算、賬戶凈值、賬戶現(xiàn)金等。
當然,對于agent,上述所有的規(guī)則并不一定要完全已知,agent不一定要知道交易成本的具體計算公式、交易限制如漲跌停/成交量限制。
State
State是agent對可觀測環(huán)境的建模或者編碼。首先很明顯的就是agent需要知道當前的資產(chǎn)價格,很可能它還需要知道歷史價格。不過大家要記住,不管是監(jiān)督學習還是強化學習,都絕對不能包含仍和未來數(shù)據(jù),在這里的state也是一樣。也可以把一些技術指標、因子等加入state,有些人也會結合監(jiān)督模型,把基于當前state(行情或因子)對股票價格或者其他特征的預測值編碼為state的一部分。同時,state還比如包含至少當前的持倉信息,如每個資產(chǎn)的組合權重。
Action
交易agent的動作建模對接近實際場景的,就是每個時間t,給出一個所有資產(chǎn)的權重向量(包含現(xiàn)金)。根據(jù)這個權重向量,結合當前持倉(包含在當前的state里),就能知道當前還有哪些票需要換倉,換倉量是多少,于是變成了當前的交易指令傳送給回測引擎或者environment。
Agent
我們的交易agent可以理解為就是我們的自動下單機器人,它每個時間只做三件事:分別是觀察、決策和學習。觀察,就是在每個時間點能夠從環(huán)境中獲取到state信息,這幾乎就是它能直接觀察的全部信息了;決策就是在每個時間點決定agent要執(zhí)行的action,比如建/換倉的股票列表以及權重,然后在agent執(zhí)行action的同時,它能馬上得到reward,這是我們agent與環(huán)境交互得到的另一個重要的信息。最后agent能夠根據(jù)得到的信息,來學習、更新它的模型和參數(shù)。
Reward
Reward是能夠讓agent學習的核心,可以類比監(jiān)督學習里的標注Label,監(jiān)督學習里每一個example模型都能知道它做對了沒有,label馬上就能告訴它,然后通過損失函數(shù)讓模型學習。在強化學習里,我們優(yōu)化的是最終目標,比如游戲通關、交易財富凈值最大等,但只有等到一個episode完成了過后,或者一次模型完成后,我們才能確定我們做的好不好,但是如果我們只在“游戲”結束時才對agent進行獎勵和懲罰,很可能讓agent學習得太慢,效果不佳,這就是強化學習里所謂的延遲獎勵。但如果我們能在每一步都對agent進行獎懲,就更容易學習。在我們的交易游戲里,可以在每個時間點上用當時的交易損益來作為reward,也就是我們把交易浮贏/虧作為獎懲機制。這么做的原因,也是因為這樣的reward的設計和最終的組合凈值是在設計上是一致的,每一步step的匯總就是最終的組合凈值(可以考慮資本時間成本)。還有一種設計是在reward里加入風險的因素,不過這種設計我沒嘗試過,研究它的論文也不多,沒有證明這種reward一定具有優(yōu)勢。
強化學習原理
這不是一個旨在介紹強化學習的教程,所以在強化學習方面我們只介紹簡單實用的概念及原理,但背后的理論復雜性和需要了解的遠不止這些。強化學習原理大致我們從上圖說起,強化學習最核心的包含兩部分,那就是狀態(tài)評估evaluation和策略改進improvement。
狀態(tài)評估evaluation
我們之前介紹過,每一個agent都能觀察到當前的狀態(tài)state,但是狀態(tài)有好有壞,比如在牛市我們更容易賺錢(當然,這取決與我們action的設計,如果我們action包含了做空的決策,那么對于交易agent來說,熊市和牛市可能具有一樣的吸引力),我們需要一個機制來判斷狀態(tài)的好壞優(yōu)劣。
于是,我們的第一個重要的公式出現(xiàn)了(我們盡可能在本教程不涉及復雜的數(shù)學):
Gt表示我們從時間t開始的未來累計reward或者說是未來所有reward在時間t的折現(xiàn)價值,與金融里的現(xiàn)值概念類似。但問題是這是一個“未來函數(shù)”,在時間t是不可觀察的,那么我們就只能通過概率期望的方式來估計它。當然,我們更感興趣的是在當前的情景下,我們的前景會怎么樣?(比如,當前我已經(jīng)有幾只股票被重倉套牢,賬戶凈值損失了50%,在我的交易技能不變的情況,一年后,我的賬戶凈值能達到多少呢?)這正是狀態(tài)評估在做的事情,它會對你的交易策略policy進行評估,比如在熊市階段做多頭會導致最終賬戶凈值比較慘,那么它最終會學習到,已防止類似的state發(fā)生(在相同的市場狀態(tài)下,空倉或者持有空頭頭寸就ok了,假設我們的state包含倉位狀態(tài)的編碼)。這里可能有一個概念大家容易搞混,我再啰嗦一下,在熊市的某個時間持有多頭頭寸和在那個時間下多頭頭寸是兩個不同的概念,代表兩個不同的state。前者在時間t已經(jīng)持有了這個倉位了,倉位造成的損益已經(jīng)發(fā)生了,不管你當下是了解倉位還是繼續(xù)持有;后者在時間t并不持有倉位,這個時候你即使下多頭頭寸代表的也是你的行為,即action,不是state,所以這個時候你沒有頭寸,也就沒有損益了,action只會對未來損益產(chǎn)生影響。
第二個重要的公式出現(xiàn)了:
上面的q我們稱之為action-value函數(shù)、或者Q函數(shù),我們常聽到了Q-learning也是基于它。因為在實踐中我們發(fā)現(xiàn),往往評估Q函數(shù)會更加容易和方便,Q函數(shù)指的是,在某個狀態(tài)下,agent執(zhí)行某個行為的好壞評分。舉個例子,當市場頭肩頂?shù)挠壹缫呀?jīng)形成,此時我持有多頭倉位,如果我繼續(xù)持有會怎么樣?了結多頭倉位呢?此時,Q函數(shù)能告訴你那個決策可能更好一些。Q函數(shù)和上面的V函數(shù)唯一的區(qū)別就是多了一個action的條件。
策略改進improvement
當我們得到了V函數(shù)或者Q函數(shù),那么我們就可以得到我們最終的策略policy。那么,在強化學習里,policy到底是什么意思呢?RL一般這么定義policy:π(a|s),即policy是在state條件概率下的action分布。還是舉之前頭肩頂?shù)睦樱偃缥覀兊腶gent已經(jīng)學習到了最優(yōu)policy,它的policy告訴我在那個state下,繼續(xù)持有的概率是30%,了解倉位的概率的70%。在我們假想的例子中,考慮到頭肩頂本身并不可靠,所以最優(yōu)策略也應該考慮到這種不確定性。如果在某個狀態(tài)下不確定性非常小,π(a|s)也是有可能在那個狀態(tài)下某個action收斂到接近1的概率。另外,很多時候,會讓policy由概率分布收斂到值,比如在Q-learning中,我們會有一個argmax操作,另外policy的分布有時候也不是那么容易得到。有時候我們會滿足在每個狀態(tài)下獲得最優(yōu)的決策,即使最優(yōu)決策與次優(yōu)決策非常接近。
GPI
GPI本質上就是就是evaluation與improvement的迭代循壞,每一次迭代,都會讓狀態(tài)評估更準確、policy更接近最優(yōu)策略,在收斂的情況下,V函數(shù)與policy會同時達到最優(yōu)。當然,在實踐中,evaluation與improvement可能會融合在一起。