iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 21
1
Microsoft Azure

Python X 金融分析 X Azure系列 第 21

【Day21】技術分析#2:均線下單策略

畫均線後,就要進行簡單的策略分析,用均線進行線性回測。
可參考文章:利用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()

印出來後,可以看到線密密麻麻的,但依稀可以看出來每個線的平滑程度不一樣。
https://ithelp.ithome.com.tw/upload/images/20200929/20103826NulUhxTsx0.png

策略比較

製作出現後,接下來排列處組合,找出過去比大盤還要會賺錢的策略。
這邊的買方式都是假設前一天的收盤價,就是隔天的開盤價((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')

https://ithelp.ithome.com.tw/upload/images/20200929/20103826CEhIJNeT7H.png

看圖可知,輸給大盤,不合格。

策略二

20日均線比60日均線還要高時,買進台積電。

# 買入訊號
signal = (c_20 > c_60)

# 回測並跟大盤比較
(c.shift(-1) / c)[signal].cumprod().plot(color='red')
(c.shift(-1) / c).cumprod().plot(color='blue')

https://ithelp.ithome.com.tw/upload/images/20200929/20103826ryNJe0BJPI.png

看圖可知,輸給大盤,不合格。
但是比較靠近了

策略三

60日均線比20日均線還要高時,買進台積電。

# 買入訊號
signal = (c_60 > c_20)

# 回測並跟大盤比較
(c.shift(-1) / c)[signal].cumprod().plot(color='red')
(c.shift(-1) / c).cumprod().plot(color='blue')

https://ithelp.ithome.com.tw/upload/images/20200929/201038267cfsGEZA02.png

看圖可知,輸給大盤,不合格。
而且被打趴在地上....

策略四

收盤價比60日均線還要高時,買進台積電。

# 買入訊號
signal = (c > c_60)

# 回測並跟大盤比較
(c.shift(-1) / c)[signal].cumprod().plot(color='red')
(c.shift(-1) / c).cumprod().plot(color='blue')

https://ithelp.ithome.com.tw/upload/images/20200930/20103826ntReGAcem1.png

看圖可知,輸給大盤,不合格。
一樣趴在地上...稍微可以抬起頭...

策略五

收盤價比5日均線還要高時,買進台積電。

# 買入訊號
signal = (c > c_5)

# 回測並跟大盤比較
(c.shift(-1) / c)[signal].cumprod().plot(color='red')
(c.shift(-1) / c).cumprod().plot(color='blue')

https://ithelp.ithome.com.tw/upload/images/20200930/20103826DAEkWWqq9c.png

看圖可知,輸給大盤,不合格。
這個更慘...連頭都埋在地底下@@

策略六

5日均線比收盤價還要高時,買進台積電。

# 買入訊號
signal = (c < c_5)

# 回測並跟大盤比較
(c.shift(-1) / c)[signal].cumprod().plot(color='red')
(c.shift(-1) / c).cumprod().plot(color='blue')

https://ithelp.ithome.com.tw/upload/images/20200930/201038265kZ1TrC96Q.png

喔喔喔!終於紅色線比藍色還要高,看來這個策略在過去中效果不錯喔!
看來就是要逢低佈局,以近期台積電來說,真的是要這樣做

觀看增長率狀況

這時我們可以看一下,我們策略六的部位狀況,以及增長率的詳細資料,來理解我們策略是如何進行:

pandas.DataFrame({'c':c, 'c_5':c_5, '增長率':c.shift(-1)/c, 'signal':signal})

後記

這樣就是簡單的策略以及回測,有沒有很清楚呢!


上一篇
【Day20】技術分析:移動平均線(MA)
下一篇
【Day22】移動平均線:雜談-遇到問題
系列文
Python X 金融分析 X Azure31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言