畫均線後,就要進行簡單的策略分析,用均線進行線性回測。
可參考文章:利用pandas輕鬆取得歷史股
本日的程式碼於:Day21_createMAStrategy.ipynb
這個部分就參考前幾天的作業,把台積電的收盤價格收在我們的dataframe
,然後要把收盤價單獨拉出來,不然產生的圖表無法合併。(應該是有TradeDate
的關係)
c = df["ClosePrice"]
因為策略的需要,製作幾個均線,這邊製作出5日均線、20日均線、60日均線。
# 製作均線
c_5 = c.rolling(5, min_periods=1).mean()
c_20 = c.rolling(20, min_periods=1).mean()
c_60 = c.rolling(60, min_periods=1).mean()
# 印出均線圖
c.plot()
c_20.plot()
c_60.plot()
印出來後,可以看到線密密麻麻的,但依稀可以看出來每個線的平滑程度不一樣。
製作出現後,接下來排列處組合,找出過去比大盤還要會賺錢的策略。
這邊的買方式都是假設前一天的收盤價,就是隔天的開盤價((c.shift(-1) / c)
),並且我們也都買得到,所以不會有滑價、買不到的可能性。單純地用收盤價進行購買。
跟大盤比對的方式是使用cumprod()
,這是一種相對應的成長率,詳情可以參考官方文件。藉由與大盤(直接購買相比),可以比較出資產變化結果。
收盤價格超過20日均線,隔天就用前一天收盤價買進。
# 買入訊號
signal = (c > c_20)
# 回測並跟大盤比較
(c.shift(-1) / c)[signal].cumprod().plot(color='red')
(c.shift(-1) / c).cumprod().plot(color='blue')
看圖可知,輸給大盤,不合格。
20日均線比60日均線還要高時,買進台積電。
# 買入訊號
signal = (c_20 > c_60)
# 回測並跟大盤比較
(c.shift(-1) / c)[signal].cumprod().plot(color='red')
(c.shift(-1) / c).cumprod().plot(color='blue')
看圖可知,輸給大盤,不合格。
但是比較靠近了
60日均線比20日均線還要高時,買進台積電。
# 買入訊號
signal = (c_60 > c_20)
# 回測並跟大盤比較
(c.shift(-1) / c)[signal].cumprod().plot(color='red')
(c.shift(-1) / c).cumprod().plot(color='blue')
看圖可知,輸給大盤,不合格。
而且被打趴在地上....
收盤價比60日均線還要高時,買進台積電。
# 買入訊號
signal = (c > c_60)
# 回測並跟大盤比較
(c.shift(-1) / c)[signal].cumprod().plot(color='red')
(c.shift(-1) / c).cumprod().plot(color='blue')
看圖可知,輸給大盤,不合格。
一樣趴在地上...稍微可以抬起頭...
收盤價比5日均線還要高時,買進台積電。
# 買入訊號
signal = (c > c_5)
# 回測並跟大盤比較
(c.shift(-1) / c)[signal].cumprod().plot(color='red')
(c.shift(-1) / c).cumprod().plot(color='blue')
看圖可知,輸給大盤,不合格。
這個更慘...連頭都埋在地底下@@
5日均線比收盤價還要高時,買進台積電。
# 買入訊號
signal = (c < c_5)
# 回測並跟大盤比較
(c.shift(-1) / c)[signal].cumprod().plot(color='red')
(c.shift(-1) / c).cumprod().plot(color='blue')
喔喔喔!終於紅色線比藍色還要高,看來這個策略在過去中效果不錯喔!
看來就是要逢低佈局,以近期台積電來說,真的是要這樣做
這時我們可以看一下,我們策略六的部位狀況,以及增長率的詳細資料,來理解我們策略是如何進行:
pandas.DataFrame({'c':c, 'c_5':c_5, '增長率':c.shift(-1)/c, 'signal':signal})
這樣就是簡單的策略以及回測,有沒有很清楚呢!