股票量化分析(11)——第二個策略(5日移動均線、雙均線、MACD策略)
阿新 • • 發佈:2019-01-27
這裡主要用的是talib這個庫來求股票的指標,就免得造輪子。
移動均線有好幾個策略,不過都是簡單的策略,包括簡單的移動均線策略,雙均線交叉策略,macd線的策略。目前也就覺得macd線簡單好用。
先放一個簡單的策略——移動均線策略。這個策略是由下向上超過均線就買入,相反就賣出,最後會發現這個策略沒什麼卵用,明顯低於股票自身的累計收益,不過方法可以參考一下。
import tushare as ts
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import talib
df=ts.get_hist_data('600848' ,start='2015-01-01',end='2015-12-31')
df=df.sort_index()
df.index=pd.to_datetime(df.index,format='%Y-%m-%d')
#收市股價
close= df.close
#每天的股價變動百分率
ret=df.p_change/100
# 10日的移動均線為目標
df['SMA_10'] = talib.MA(np.array(close), timeperiod=10)
close10=df.SMA_10
#處理訊號
SmaSignal=pd.Series(0,index=close.index)
for i in range(10 ,len(close)):
if all([close[i]>close10[i],close[i-1]<close10[i-1]]):
SmaSignal[i]=1
elif all([close[i]<close10[i],close[i-1]>close10[i-1]]):
SmaSignal[i]=-1
SmaTrade=SmaSignal.shift(1).dropna()
SmaBuy=SmaTrade[SmaTrade==1]
SmaSell=SmaTrade[SmaTrade==-1]
SmaRet=ret*SmaTrade.dropna()
#累積收益表現
#股票累積收益率
cumStock=np.cumprod(1+ret[SmaRet.index[0]:])-1
#策略累積收益率
cumTrade=np.cumprod(1+SmaRet)-1
plt.rcParams['font.sans-serif']=['SimHei']
plt.plot(cumStock,label="cumStock",color='k')
plt.plot(cumTrade,label="cumTrade",color='r',linestyle=':')
plt.title("股票累積收益率與10日平均策略收益率")
plt.legend()
雙均線策略:即5日短線移動平均超過30日長線移動平均即買入,其餘時候空倉。
import tushare as ts
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import talib
df=ts.get_hist_data('600848',start='2015-01-01',end='2015-12-31')
df=df.sort_index()
df.index=pd.to_datetime(df.index,format='%Y-%m-%d')
#收市股價
close= df.close
#每天的股價變動百分率
ret=df.p_change/100
# 5\30日的移動均線為目標
df['SMA_5'] = talib.MA(np.array(close), timeperiod=5)
df['SMA_30'] = talib.MA(np.array(close), timeperiod=30)
close5=df.SMA_5
close30=df.SMA_30
#處理訊號
SmaSignal=pd.Series(0,index=close.index)
for i in range(10,len(close)):
if all([close5[i]>close30[i]]):
SmaSignal[i]=1
SmaTrade=SmaSignal.shift(1).dropna()
SmaRet=ret*SmaTrade.dropna()
#累積收益表現
#股票累積收益率
cumStock=np.cumprod(1+ret[SmaRet.index[0]:])-1
#策略累積收益率
cumTrade=np.cumprod(1+SmaRet)-1
plt.rcParams['font.sans-serif']=['SimHei']
plt.plot(cumStock,label="cumStock",color='k')
plt.plot(cumTrade,label="cumTrade",color='r',linestyle=':')
plt.title("股票累積收益率與雙均線策略收益率")
plt.legend()
結果發現大部分時候雙均線交易策略的收益小於股票本身的累計收益。
下面看看MACD交易策略:即DIFF大於DEA的時候買入,其他時候賣出。
import tushare as ts
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import talib
df=ts.get_hist_data('600848',start='2015-01-01',end='2015-12-31')
df=df.sort_index()
df.index=pd.to_datetime(df.index,format='%Y-%m-%d')
#收市股價
close= df.close
#每天的股價變動百分率
ret=df.p_change/100
# 呼叫talib計算MACD指標
df['DIFF'],df['DEA'],df['MACD'] = talib.MACD(np.array(close),
fastperiod=12, slowperiod=26, signalperiod=9)
diff=df.DIFF
dea=df.DEA
#處理訊號
macdSignal=pd.Series(0,index=close.index)
for i in range(10,len(close)):
#if all([diff[i]>dea[i]>0,diff[i-1]<dea[i-1]]):
if all([diff[i]>dea[i]]):
macdSignal[i]=1
#elif all([diff[i]<dea[i]<0,diff[i-1]>dea[i-1]]):
#macdSignal[i]=-1
macdTrade=macdSignal.shift(1).dropna()
macdRet=ret*macdTrade.dropna()
#累積收益表現
#股票累積收益率
cumStock=np.cumprod(1+ret[macdRet.index[0]:])-1
#策略累積收益率
cumTrade=np.cumprod(1+macdRet)-1
plt.rcParams['font.sans-serif']=['SimHei']
plt.plot(cumStock,label="cumStock",color='k')
plt.plot(cumTrade,label="cumTrade",color='r',linestyle=':')
plt.title("股票累積收益率與macd策略收益率")
plt.legend()
從圖中可以看出,macd策略成功躲避了暴漲暴跌,但最後收益稍微好於雙移動均線,如果能夠繼續優化一下,能夠避免那個波谷階段的暴跌,收益還是很可觀的,這就需要繼續優化策略。所以學習量化分析能夠讓你冷靜的看待自己的交易策略,並不斷優化它。