照慣例也是參考別人的
附上聲明與出處
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import talib
df = pd.read_csv(r'd:\0050.tw.csv')
df['Date'] = pd.to_datetime(df['Date'])
df.set_index("Date", inplace=True)
close= df.Close
df['p_change'] = (close[-1] - close)/close
ret=df.p_change/100
# 6日的强度指标、24日的强度指标
df['RSI_6'] = talib.RSI(np.array(close), timeperiod=6)
df['RSI_24'] = talib.RSI(np.array(close), timeperiod=24)
#买卖信号
#6日的超买和超卖
sig1=[]
for i in df.RSI_6:
if i>80:
sig1.append(1)
elif i<20:
sig1.append(-1)
else:
sig1.append(0)
df['sig1']=sig1
df.RSI_6[7]
#交易信号2:黄金交叉与死亡交叉
sig2=pd.Series(0,index=df.index)
lagrsi6=df.RSI_6.shift(1)
lagrsi24=df.RSI_24.shift(1)
for i in range(0,len(lagrsi6)):
if (df.RSI_6[i]>df.RSI_24[i])&(lagrsi6[i]<lagrsi24[i]):
sig2[i]=1
elif (df.RSI_6[i]<df.RSI_24[i])&(lagrsi6[i]>lagrsi24[i]):
sig2[i]=-1
df['sig2']=sig2
#合并交易信号
signal=sig1+sig2
signal[signal>=1]=1
signal[signal<=-1]=-1
signal=signal.dropna()
df['signal']=signal
#买卖信号出现一天后交易
tradSig=signal.shift(1)
ret=df.p_change/100
#求买入交易收益率
ret=ret[tradSig.index]
buy=tradSig[tradSig==1]
buyRet=ret[tradSig==1]*buy
#求卖出交易收益率
sell=tradSig[tradSig==-1]
sellRet=ret[tradSig==-1]*sell
#求出买卖交易合并收益率
tradeRet =ret*tradSig
#收益累计
cumStock=np.cumprod(1+ret)-1
cumTrade=np.cumprod(1+tradeRet)-1
plt.subplot(211)
plt.plot(cumStock)
plt.ylabel('cumStock')
plt.title('cumStock')
plt.subplot(212)
plt.plot(cumTrade)
plt.ylabel('cumTrade')
plt.title('cumTrade')
plt.show()
執行結果 :