Python演算法交易(Python for Algorithmic Trading: From Idea to Cloud Deployment,Yves Hilpisch)
Hiplisch的書好幾本都是關於用Python來處理金融相關問題的,有些是關於金融模型,另一些是衍生性商品的.而這一本"Python演算法交易"應該是其中單純將焦點聚集在金融交易上的,用最簡單的方式來說,這一本的內容是來協助有興趣者自行開發自動化演算交易系統而寫的.
開發個人的自動化交易系統,也俗稱程式交易,已經不是新穎的東西,很多人都在做,市面上也有已經成套軟體專門提供給需要者使用,如Multicharts,TradeStation,WeathLab,或是MT等等,因此實際上一般人並沒有必要特地去學Python寫自己的交易系統,那樣太麻煩,畢竟MC,TS等都寫好了除了交易邏輯程式碼以外的東西,以如產生繪圖,圖表,產生回測報告,連接下單機,自動功能等等.一些想要學Python來開發交易系統的人必須先評估自我的需要,其實多數人是沒必要這樣做的,特別是如果你的交易系統就是傳統均線穿越,指標,動量交易,均值回歸等方式,那麼你只要買市面上已有的軟體即可,因為那樣只要隨軟體的需要學習它內建的程式語言即可,這些程式語言通常使以C#,或.Pascal或VBS轉變的Script語言為主,因為這些程式語言的功能與範圍被設計成控制在一定範圍與目標內,所以並不複雜,除錯簡單,有明確簡單的手冊能一目了然,且能快速上手,加上它已經幫使用者開發的功能,其實對程式交易者而言是能被半功倍的好物,並不需要對其排斥.
即使是用演算法來替代傳統的指標做為程式交易的內在邏輯,以上所述的市售軟體一樣能夠達到功能上的要求.畢竟所謂的演算法沒有限定或獨特的定義範圍,也不存在普遍的意義,在某種程度上,它指的就是以特定形式的演算法為基礎,針對特定的金融投資工具進行交易,而所謂的演算法指的就是以特定順序進行一整套數學上,技術上的操作,以達到特定的目標,所以像簡單的迴歸,方程計算,那些阮堤還是夠用的,只是稍嫌麻煩,但與自行開發要還要設計旁支的許多東西相比,還是買現成的最快.而現在的問題是演算法被引進金融交易的東西越來越多,加上資訊領域中的機器學習與深度學習的發展在電腦運行功能的突破下有了大進展,所以使用以處理大數據為主體功能的軟體來發展新的自動化交易系統必然會有新的進展.這本"Python演算法交易"便是以此為目標將自行開發時需要理解或使用到的部分逐章解釋並以範圍說明.
這書分成幾部分,首先它針對處理關於系統必須使用的數據型態與來源做處理,這些內容在其他的Python書上應該都有,主要是針對Numpy,Pandas的數據型態與List,Matrix資料處理的對應,並對資料的來源,如是來自外部串流,其他單位提供的資料如何連接,轉換成CSV檔,與建立資料庫進行說明,這些內容只要根據書上這些範圍裡的程式碼鍵入執行過一次,應該就能完全理解了.這幅息完畢之後,作者直接引進了向量回測,並後續以常見的均線穿越,指標追擊,與均值回歸為例做交易系統,個寫下它們的程式碼,並以這各自的系統為主,寫出每個系統的迴測類別.為為每個範例的程式碼都獨立存在,讀者在參照它的邏輯開發出自己的需求的同時,也能夠直接就在自己的系統上Import它們來使用,其實還有投機偷懶的效果.最重要的運用機器學習與深度學習打造程式交易邏輯與回測系統的部分,書上列出了簡單的迴歸,羅吉式迴歸(logistic regression),複回歸還有分類(classification)問題並嘗試以Sklearn,Tensorflow,Keras等深度學習套件來開發預測系統,這部分內容雖不多,但已經足夠提供一個學習的開口,讓初次接觸者知道運用深度學習機器學習在交易上是怎麼一回事.最後作者引入了Oanda,FXSM等現存的交易商提供的看盤下單軟體,嘗試用Python引入這些存在的模組進行下單程式碼的設計,最終與回測系統共同組合成自己開發的自動交易系統.就架構來說已經很完備,但是個別主題的內容太少,有時甚至簡略,想要照本書程式碼一個個案例執行者還要留心有部分的外界連接已經與書中不同,必須自行改動才能讓程式碼執行完全,可能會引起一些無法操作的問題,但整體而言這本書對於有心開發自動交易者算是提供了一個還不錯的概念與架構的書籍,只是不夠詳盡,讀者必須自行研展腦補..
從閱讀與實際執行本書上的範例程式,我以為有幾個可以有效運用的範圍可以做為有用的延伸,首先是這是本奠基於Python的架構,大數據與其延伸的機器學習與深度學習套件是它必然的重心,我們正可以運用此做為改善過往傳統程式交易方面的缺憾,首先我們以第七章的一個TickSever的程式為例:.
import zmq import math import time import random context = zmq.Context() socket = context.socket(zmq.PUB) #socket.bind('tcp://0.0.0.0:5555')(for linux) scoket.bind('tcp://127.0.0.1:5555') #(for windows) class InstrumentPrice(object): def __init__(self): self.symbol = 'SYMBOL' self.t = time.time() self.value = 100. self.sigma = 0.4 self.r = 0.01 def simulate_value(self): ''' Generates a new, random stock price. t = time.time() dt = (t - self.t) / (252 * 8 * 60 * 60) dt *= 500 self.t = t self.value *= math.exp((self.r - 0.5 * self.sigma ** 2) * dt + self.sigma * math.sqrt(dt) * random.gauss(0, 1)) return self.value ip = InstrumentPrice() while True: msg = '{} {:.2f}'.format(ip.symbol, ip.simulate_value()) print(msg) socket.send_string(msg) time.sleep(random.random() * 2)
這段程式碼很短,主要的功能是將金融商品價格採取模擬布朗運動的尤拉公式的方式來產生隨機的價格資料,程式根據隨機選取的間隔時間,可能是微秒,或幾秒鐘,再根據公式產生成交的tick價格資料,並且將此tcik資料以socket的方式傳播出去.做為對應的socket接收方程式,另有一個TickClietn程式.透過這兩個程式傳播與接收關係就形成模擬一個簡單的交易所搓合交易的server,與客戶端接收交易資訊的電腦間的關係.讀者如果只是單純將這段程式碼複製執行,可能就錯過了它的更大用途,特別是對於期指當沖者來說.要知道這是模擬一個tick資料伺服器,只要不中斷,它能持續不斷的一直生出成交價格,這特性正適合提供線上演算法的需要,畢竟傳統的程式交易系統需要測試時都是採取離線算法,用歷史資料去測試,基本上沒有即時的線上資料可以使用,即使採取真的即時價格資訊做模擬交易,它的可執行次數也是有限的,所以這個TickServer程式是一非常好的工具.以台期指為例,我們可以在此程式碼加上模擬起訖時間限制,即設定從早上的8:45到下午13:45,形成一個交易日的所有成交價格tick與它的成交時間.這樣就有了一個能夠供做測試的模擬日內成交資料,因為有了所有的tick自然可以根據時間的分隔自自動的歸類出1分鐘線,5分鐘線,乃至小時線,所以不論你的資料時間結構需求時怎樣的,tickserver模擬出的資料都能提供使用,而設計者也能以此隨時產生的模擬資料進行線上運算交易系統測試,而不是只用歷史資料.而既然能夠模擬出某一天的tick資料,我們就能模擬產生1000個,甚至100000個交易日的不同的日內tick資料,產生不同的日內資料,這樣就能以大數據的型態來做當沖系統測試.畢竟一年只有約240~250個交易日,30年的實際日資料不過約7500個交易日而已,TickServer模擬資料能夠突破這個限制,也許能有1萬個交易日資料提供測試,而結合了Python在串流函式上的支援,比起那些市售軟體彈性相對大,能夠結合的資源與做法就更多了,這是一個相對有利的發展,而本書在最終章的自動交易系統上也引用了以Oanda為範例來說明,如何發展出一個完全以雲端執行的字交易系統,就是將演算法交易系統放到遠端的伺服器中自動執行,然後透過日記達到記錄與監控的功能,實施真正的自動化交易,這部分內容雖然不多,卻是整本書希望讀者實作後最終能達成的目標.
至於最終是否要採用Python發展出自己的交易系統,還是得依需求範圍的設定來決定,畢竟市售的軟體早已能滿足一般交易策略的需求,而使用Python是因為它能與機器學習深度學習套件連結,加上強大的數學,科學運算套件,若你的系統沒有要用到這些,那麼自然不需要多一舉放棄別人已經幫你設計好的輕便簡單的MC,WB,MT,TS等現成軟體,重複無用之功.至於那些交易邏輯與系統可能會涉及到使用這些套件,依個人的判斷,大概是牽涉的系統使用的規則用清楚,明顯,能明確定義的越不需要重複發展,使用現成軟體即可.而交易邏輯比較模寧兩可或說難以絕對規則界定的,模糊的則使用這些套件的機率會高些,這裡的模糊得意思用中文表達較不精確,應該是指Fuzzy這個意思,而這個詞很早就被引入了資訊領域,應該才是使用這工具的原因,亦即必須有真的將模糊系統,其實是複雜度高過去無法量化的交易系統才考慮使用這項工具,而不是純粹為追逐流行而使用.
使用本書時會遇到許多問題,主要都是基於軟體套件發展快速變化的版本問題,致使許多書中的程式碼並不依定能完全按照設想的狀態成功執行,會產生許多錯誤訊息,在使用tensorflow,keras,Oanda,FXCM都遭遇過這樣的狀態,這只能透過google去網上找尋碰到相同問題的人測試出的結果來改變套件的版本,這是用python常遇的問題.所幸作者已經書裡的程式碼都公開在網上,不必真的逐字鍵入,省了麻煩,唯一要留心的是他是在linux下作業,要搬到windows上用Anaconda中的Syider使用有部分是使用者自己知道要改寫的,這就是個人經驗了.除這這些使用上的問題外,個人認為這本對於想自行開發交易系統者還是值得買來一讀的,儘管它尚不夠詳細完備,但已夠讓人折騰許久了.以上.
留言列表