使用 Excel 建立投資回測,不會寫程式也可以做回測(上)
前言:
理論上做回測還是直接寫程式跑最方便,功能也最完整,但陸續發現不少人一聽到要寫程式就果斷放棄,因此寫了這篇用Excel的替代做法。
之後會再寫用python在quantopian平台直接回測的作法,再之後行有餘力的話會寫自己架設在本機上的回測系統。
有興趣的人請訂閱專欄一下~~(反正也不用錢)
當然Excel畢竟功能比較少,同時今天也是為了簡單方便,所以有不少要手動的部分。實際應用上可能會稍嫌不便,但這邊只是提供一種做法,希望用的人可以加以改造成適合自己的方式。
這系列分成上下兩篇,上篇是將股價匯入Excel,下篇是具體回測介面的呈現。
將股價匯入Excel,這邊介紹兩種方式
1. 手動
2. Python (非爬蟲)
沒錯,沒有Excel,看到這邊不要急著離開,原因很簡單,用Excel當然可以爬蟲抓取股價,只不過要是你能力強到能靈活運用VBA,也不需要看這篇教學文了,另外VBA抓股價的教學,Google就有很多,真的需要的人可以自己找。同時,用手動整理資料也不是太困難。
至於python,這邊的作法是引用外國大大寫好的模塊,基本上只要會初階的python就能用了,不用特別學爬蟲。
成品示範
首先先示範一次成品的使用方式,下面再講解實現方式。
這邊使用以程式抓取的作法當範例,手動的方法更簡單,在下面有介紹。
透過程式抓取蘋果(AAPL)、微軟(MSFT)、標普500(SPY)的報價
接著是在Excel實際操作回測的介面。
這邊我根據某種策略選出了一些買入日期,跟設定一年後賣出,可以直接得到報酬率、標準差,當然也可以計算sharpe ratio。最上面的ticker可以更改,這邊的原理是透過excel從剛剛抓下來的報價坐標定位跟計算。具體怎麼寫,會在下篇教學,今天主要是講解把資料匯入的方式。
— — — — — — —
總算可以正式開始了,先介紹 Python 的作法,對python不熟悉的話直接往下滑到手動的部分即可。
程式作法(Python)
所需模塊
pandas用於彙整資料
os用於設定儲存檔案的路徑
openpyxl用於操作excel
openpyxl.utils是一個獨立的包,不直接操作excel,而是提供一些小工具,這邊是引入把dataframe轉成row匯入excel的功能
yahoo_fin是上面提到的模塊,這裡只引用抓股價的功能,實際上功能超多。
準備開始啦~~會從30行開始,是因為前30行我額外寫了一些自己要用的函式,這篇文章的範圍用不到。
31th 引入檔名,這邊需要一個模板excel填入資料,填入之後重新儲存成新的檔案,以免更動到模板excel。模板excel是指已經寫好回測功能,只需把報價資料填入。
32th打開excel,33th取得兩個工作頁,因為要建立收盤價跟調整收盤價。
39th開始抓取,ticker_list就自行設定,記得要加TW,譬如2812.TW
41~49th 設定欄位名稱之後放入dataframe當中。
運行結束後,當然存檔即可。
73th os.path.join會針對各個系統的資料夾分層號作調整,否則Mac跟Window一個是「 /」 一個是「 \」 ,寫死的話有點麻煩。
到這邊是程式抓報價的作法,接著是手動作法。
手動作法
1. 到yahoo-finance搜尋ticker
2. 找到歷史股價
3. 複製貼上到excel
就是這麼簡單,不過當然可能會出現一些問題,慢慢細講。
這邊以台中銀行(2812)為例,點選Historical Data
就會出現開高低收還有交易量的資料,右上角有個download,下載是csv檔,剩下的就打開複製到Excel就好了。
ps:因為我沒要做K線的技術指標回測,所以只拿adj close(調整後收盤價),需要做技術分析回測的朋友可以整個搬到excel。
最好是用複製貼上,不要用Excel打開csv檔,這跟python的一些模塊寫法有關,如果哪天你突然學會python,用在你用後者建好的資料檔,可能會出現花式報錯。
至於這樣做可能的問題,主要出在交易日期,yahoo似乎會自動略掉沒有交易日的日期,像是週末、國定假日、停牌交易日,週末跟國定假日是每檔股票(指台股)都一樣,所以不同股票的價格可以存在一起,但停牌交易日每家公司不同,所以如果有這種情況,公司間的價格跟日期可能對不上,就要另外處理。
此外,yahoo的台股報價資料不是太完整,兩年以前的報價常常有缺,這點就要自己尋找其他資料源了。