通過外匯對沖手段穩定獲利的可行性驗證
上一篇博文談了談股票預測方面的問題,這一篇就談談外匯交易吧。
對沖是金融領域的常見操作之一,即利用市場的不對稱性,在不同市場進行方向相反的交易來保證穩定收益。我是在觀看了李永樂老師對足彩對沖的原理講解之後(http://www.iqiyi.com/w_19rz0551xx.html),才有了這個想法。
對於一次足彩的投註來說,僅有兩個投註方向,即看好A隊或看好B隊。如果想通過對沖來獲得穩定的收益,必須根據不同的博彩公司開出的盤口,來計算是否有套利空間。如果在同一家博彩公司同時進行正、反方向的投註,肯定會入不敷出,因此足彩的對沖需要在不同的博彩公司完成方向相反的投註。不同於足彩的投註,外匯交易由於有多種外匯的存在,每一種貨幣都會與其他貨幣產生相應的匯率,理論上在一個有N種貨幣的外匯市場中,存在的匯率應有
種。即每兩種貨幣之間都會產生匯率,且產生正向與反向兩種匯率。例如歐元與美元兩種貨幣,正向匯率是1歐元兌1.1599美元,反向匯率是1美元兌0.8616歐元。
一般來說,直接用兩種貨幣進行對沖,肯定是無法產生收益的,兩種相反方向的匯率相乘必定小於1,如歐元換美元再換歐元,1歐元經過這兩筆操作,得到1.1599*0.8616=0.99936984歐元。那麽,能不能通過第三方貨幣的加入,經過三角循環交易,獲得大於1的收益。為驗證對沖獲利的可能性,我利用python爬蟲,來對匯率進行實時爬取,計算同一時刻人民幣、美元、歐元有沒有循環交易套利的空間。
圖1.三角對沖示意圖
由圖1可以看出,我們需要對兩個方向的交易進行驗證,外圈是人民幣→美元→歐元→人民幣的交易方向,內圈是人民幣→歐元→美元→人民幣的交易方向。為此我們需要獲得6種匯率,即:人民幣兌美元、美元兌人民幣、人民幣兌歐元、歐元兌人民幣、美元兌歐元、歐元兌美元。
這裏通過新浪財經的網站獲取實時匯率,獲取這6種對應匯率的URL
1 self.usdcny_url = ‘http://finance.sina.com.cn/money/forex/hq/USDCNY.shtml‘ 2 self.cnyusd_url = ‘http://finance.sina.com.cn/money/forex/hq/CNYUSD.shtml‘ 3 self.eurcny_url = ‘http://finance.sina.com.cn/money/forex/hq/EURCNY.shtml‘ 4 self.cnyeur_url = ‘http://finance.sina.com.cn/money/forex/hq/CNYEUR.shtml‘ 5 self.usdeur_url = ‘http://finance.sina.com.cn/money/forex/hq/USDEUR.shtml‘ 6 self.eurusd_url = ‘http://finance.sina.com.cn/money/forex/hq/EURUSD.shtml‘
之後對頁面源碼進行觀察,發現其匯率會以文本的形式顯示在<div id=’quoteWrap’>標簽下的<h5>標簽內。又由於網頁是使用ajax技術動態刷新的,需要對動態頁面進行爬取,所以我們選用selenium+phantomJS來對匯率進行爬取。
因為這次僅僅是對三角對沖的獲利可能性進行驗證,因此程序很簡單,分為兩個函數,一個函數負責爬取匯率,另一個函數分兩個方向計算交易獲利情況。當交易後的數值大於1的時候,即判斷有套利空間。
爬取匯率函數:
1 def get_exchange(self): 2 # 使用selenium通過PhantomJS來進行網絡請求 3 tag = 0 4 while(tag==0): 5 driver = webdriver.PhantomJS() 6 try: 7 # C-人民幣 U-美元 E-歐元 8 driver.get(self.usdcny_url) 9 UC = float(BeautifulSoup(driver.page_source,‘html.parser‘).find(‘div‘,id=‘quoteWrap‘).find(‘h5‘).text) 10 driver.get(self.cnyusd_url) 11 CU = float(BeautifulSoup(driver.page_source,‘html.parser‘).find(‘div‘,id=‘quoteWrap‘).find(‘h5‘).text) 12 driver.get(self.eurcny_url) 13 EC = float(BeautifulSoup(driver.page_source,‘html.parser‘).find(‘div‘,id=‘quoteWrap‘).find(‘h5‘).text) 14 driver.get(self.cnyeur_url) 15 CE = float(BeautifulSoup(driver.page_source,‘html.parser‘).find(‘div‘,id=‘quoteWrap‘).find(‘h5‘).text) 16 driver.get(self.usdeur_url) 17 UE = float(BeautifulSoup(driver.page_source,‘html.parser‘).find(‘div‘,id=‘quoteWrap‘).find(‘h5‘).text) 18 driver.get(self.eurusd_url) 19 EU = float(BeautifulSoup(driver.page_source,‘html.parser‘).find(‘div‘,id=‘quoteWrap‘).find(‘h5‘).text) 20 print(u‘匯率獲取完畢 ‘) 21 print(‘美-人:‘,UC,‘ 人-美:‘,CU,‘ 歐-人:‘,EC,‘ 人-歐:‘,CE,‘ 美-歐:‘,UE,‘ 歐-美:‘,EU) 22 tag=1 23 except: 24 print(u‘爬取數據故障,正在重新爬取。‘) 25 time.sleep(5) 26 if tag==1: 27 return {‘uc‘:UC,‘cu‘:CU,‘ec‘:EC,‘ce‘:CE,‘ue‘:UE,‘eu‘:EU}
利潤計算函數:
1 def calc_profit(self,exchange_dic): 2 begin_money = 1000 3 end1 = begin_money*exchange_dic[‘cu‘]*exchange_dic[‘ue‘]*exchange_dic[‘ec‘] 4 end2 = begin_money*exchange_dic[‘ce‘]*exchange_dic[‘eu‘]*exchange_dic[‘uc‘] 5 profit1 = (end1-begin_money)/begin_money 6 profit2 = (end2-begin_money)/begin_money
程序代碼在我的GitHub上有分享。
https://github.com/NosenLiu/exchange_proift
最初的時候,設定每30秒進行一次爬取計算,發現確實是有套利空間的,留下類似下方的記錄。
圖2.套利空間驗證結果記錄
可以看出,存在某些時間段,通過一次三角循環交易可以獲取穩定收益。一次三角對沖的理論收益大約在萬分之一左右。那麽一個交易日中有多少次機會可以對沖呢?為此,我將程序進行修改,設定大約每20秒計算一次,如果有套利空間的話,自動記錄到文件裏面,無法獲得收益則不進行記錄。經過了一個小時的午睡時間。發現日誌文件裏產生了35條類似下圖的記錄。
圖3.一小時內三角對沖結果記錄樣本(部分)
粗略計算,每20秒爬取計算一次的話,一個小時約爬取計算180次,其中有35次擁有套利空間,即大約有20%的時間,可以從外匯市場進行三角對沖套利!! 這可不得了,按一次套利萬分之一的收益來算,一個小時35次對沖交易,可以獲取千分之3.5的收益!每天交易一個小時,一個月交易20天的話,一個月的收益率就有7.2%!!!
當然,上面的推斷都是基於0交易傭金的基礎上的。各個外匯平臺的規定都有所不同,一般來講收傭金的平臺,點差小;不收傭金的平臺點差大,相對來講也就更難以發掘三角對沖的套利空間。
這麽一算,似乎真金白銀就在眼前。抱著早日實現財務自由的夢想,咱說幹就幹,初步的想法是基於某個外匯交易平臺網站,爬取其中的外匯數據,使用selenium 這個Web應用程序測試工具實現自動下單完成交易的功能(畢竟手動交易太慢了,而且匯率稍微變動一點,套利空間就很有可能消失)。
可是當我真正著手開始做的時候,發現問題果然沒那麽簡單。每個外匯平臺都有自己的交易軟件,想要獲取其中的數據並且實現自動交易功能基本沒有可能~~,看起來最有希望的福匯平臺也是基於web的純flash界面,普通爬蟲根本就不好使,而flash內部的信息交互方式我也是完全不了解。感覺一下子就觸碰到知識盲區了,陷入深深的無力感。
圖4.福匯平臺的純flash交易界面
後來也有想過使用抓包軟件之類的來獲取外匯交易平臺的匯率數據。主要存在以下兩方面困難:一是抓包操作的自動化處理難以實現,沒有在網絡上找到現成的抓包+解析工具;二是即使獲取了平臺匯率數據,沒有外匯交易平臺的內部接口,自動化交易功能也難以達成。
當然,有困難並不代表著沒有辦法實現,通過外掛插件或對平臺軟件進行反編譯的方法理論上是可以完成自動交易功能的,這裏也歡迎各位朋友參與討論。
通過外匯對沖手段穩定獲利的可行性驗證