【從零開始建立你的交易策略Part1】—資料與idea
先前我們在『幣市黑手 — 程式交易策略能操弄幣價嗎?』一文中,
提到一個人的交易方式主要分成「主觀交易」與「程式策略交易」,而程式交易最初始的思維,就是設計一種規律的進出場方式,然後用歷史資料回溯測試,看看長期下來這樣的操作有沒有辦法賺錢,等於是在統計基礎下,用夠多的數據來測試一種交易模式的有效性。
回測的部分必須要有點程式背景才能達成,但我們這個系列文章主要是要告訴大家,怎麼把自己的想法化為交易策略,然後要怎麼評估一個策略的優劣、風險所在。
一、程式量化交易的條件
因為程式交易本質上來說,就是收集過去大量的數據,再用一種交易模式下去模擬,看看長期會不會賺錢。
虛擬幣市場真正出現在世人眼前時間很短,而且所謂的基本面、技術面都跟傳統金融市場有所差異,所以目前為止,做虛擬貨幣量化交易的人還不是很多。
能做程式量化交易的市場,主要必須滿足下面三個條件:
- 資料密度夠高
- 幣種流動性夠好
- 經歷過多空循環
資料密度高
什麼叫做資料密度夠高?舉例來說,BTC/USDT這個交易對,我們能夠在幣安用API直接取得從2017/07/01到現在,每一分鐘的開、高、低、收價格,所以總共有超過50萬筆的資料,這種量級的資料就足夠拿來做一般的程式量化策略了。但是如果你選用的是一些小幣的交易對,比如KEY/ETH,這個市場從2018/06/27才開始交易,至今不過3個月,所以大約只有13萬筆的一分鐘資料,這樣就不適合拿來做量化交易。
備註:儘管從幣安取得的資料長度,不如股市動輒十年二十年的資料長度,但虛擬幣市場在更久以前的歷史資料,因為當時還不普及,交易量很小,參考性是有疑問的。
如果你想做的是更高頻的交易策略(如『幣市黑手 — 程式交易策略能操弄幣價嗎?』文中的市場微結構策略),通常交易所沒有辦法用API直接抓取掛單簿跟成交紀錄的所有歷史資料,就必須要自己寫程式去紀錄,越高頻的策略維護成本越高。
幣種流動性好
什麼叫做流動性?就是指想賣賣得掉,想買買得到,所以這時候可以觀察幾種指標。第一個就是掛單簿上買賣單的深度,是否顆數夠多,如同上圖中紅色框框,掛單量都有數千以上美金,就表示在BTC/USDT這個市場,如果你想要買賣幾千美金價值的比特幣,都能在不影響價格太多的情況下成交。
第二個就是觀察買賣價差,也就是上圖中的藍色框框部分,如果這個價差越大,表示市場上大家對價格的共識差越多,流動性就越差。
第三,則是觀察交易量,通常我們會把各個交易對按照24小時成交量排序,如下圖中的紅色框框處,跟美金穩定幣USDT有關的交易對是交易量最大的,所以只要24小時成交量在前10名,都可以做為程式量化交易的標的。
而以ETH及BTC為計價貨幣的交易對,通常就要前5名才算交易量夠大。
總而言之,我們可以從以上三個標準去衡量某個市場適不適合用來做程式量化交易,但是也不是硬性全都要符合,最後還是要依據你所操作的資金量來決定。
經歷過多空循環
從2009年開始到現在2018年(紅色框框處),美國股市呈現大多頭的態勢,所以就算你什麼都不做,只買進一直放著也能賺到大約451%的報酬率,但是量化交易的特質是什麼?就是要在適當的時間進出場,即使在空頭熊市時,最好也能抓到反彈賺到錢,而且牛市時,常常不管怎麼買都會賺錢,等到熊市開始才是考驗交易技巧的時候。
同樣的道理套用到虛擬幣市場也適用,我們的歷史資料最好是要是一段幣價經歷過「多空循環」的期間,而在2018年的現在,比特幣幣價曾在今年1月達到最高點,然後開始熊市持續至今,這就是一段很好的樣本期間,只是你的程式量化策略能在整段時間維持績效往上,那麼就可以算是穩定的。
有些幣種上交易所的時間太短,沒有經歷過多空循環,這樣就不適合作為量化交易的標的。
二、交易想法
當你在市場中打滾一陣子後,應該都有自己在觀察的指標,然後觀察這些指標後,決定你要買哪一個幣種、要在什麼價位進場。
要買哪一個幣種,就是所謂「選市」的問題,交易所的交易對百百種,要選擇什麼幣來買呢?這時候可能就有人想到了:我能不能去偵測交易量突然放大、價格突然跳升的幣種,然後去買進他們呢?這就是一種交易想法(idea),或是我可以在區塊鏈上偵測哪些幣的錢包有大規模的轉帳,如果是大額轉帳進交易所,是不是代表有大戶想倒貨?這也是一種idea。
有了交易想法後,下一步就是將這種想法給量化、程式化。我們拿前述的第一種想法來說,什麼叫做「交易量突然放大、價格突然跳升」?
這邊就必須先定義,舉例來說,所謂交易量放大是不是可以用「當下五分鐘內的平均交易量,比前十分鐘平均的2倍還高」來定義?那麼價格突然跳升,是不是可以用「當前的收盤價比五分鐘前收盤價高3%」來定義?有了清楚的定義後,你就能在過去所收集的資料中找出符合條件的幣種與時間點。
同樣的現象,可以用不同的定義來解釋,像是交易量放大,也可能是「這一分鐘的交易量>前一分鐘的交易量>前兩分鐘的交易量」,因此不同的定義就有可能抓出不同的進場時機點。而每個定義的有效性,就要透過歷史資料的回測來確認。
關於判斷歷史資料的可用性,以及交易idea的生成,我們在系列文【從零開始建立你的交易策略】中第一篇大略解說完畢,而後續我們將會繼續介紹怎麼評估交易策略的績效跟風險,來做更進一步的探討。
歡迎大家繼續關注我們本系列文章!
若喜歡我們文章,可以用「拍手」支持我們一下唷!您給予的拍手,會是我們繼續創作的動力~如果喜歡我們的區塊鏈/金融相關文章,也可以追蹤我們,讓我們有機會為您提供更多內容
資料補充:由於有人詢問要如何從幣安抓取幣價資料
我們提供一段Python程式碼腳本,只要先pip install python-binance,再去幣安的帳號管理內取得你的API key,就能套用進去直接使用囉!
創建幣安API key的教學:
以下是抓取2017/07/01至今的BTC/USDT一分鐘資料的範例程式碼,可以依照自己的需求修改使用,當資料爬完後,會自動生成一個csv檔,可以用EXCEL來打開看看。
""
Created on Tue Oct 23 20:08:38 2018@author: 財金哥&區塊妹
""
import numpy as np
import pandas as pdfrom binance.client import Clientapi_key = '你的幣安API key'
api_secret = '你的幣安secret key'
client = Client(api_key, api_secret)
klines = client.get_historical_klines('BTCUSDT', Client.KLINE_INTERVAL_1MINUTE, '1 Jun, 2017')
whole_df = pd.DataFrame(klines)
whole_df.columns = ['Open_time','open','high','low','close','volume','Close_time', 'Quote asset volume', 'number of trades', 'Taker buy base asset volume', 'Taker buy quote asset volume', 'Ignore']
whole_df = whole_df.drop_duplicates(subset=['Open_time'], keep=False)
whole_df = whole_df.convert_objects(convert_numeric=True)whole_df.to_csv('binance_BTCUSDT_data.csv', encoding='utf-8')