策略
收益多少就靠策略好坏了,策略又是建立在各种指标之上。有个叫TA-Lib的库是专门用于金融数据分析的,提供很多常用指标和K线模式识别。
import talib
close_p = stock_zh_a_daily_hfq_df.close.values
#MAType: 0=SMA, 1=EMA, 2=WMA, 3=DEMA, 4=TEMA, 5=TRIMA, 6=KAMA, 7=MAMA, 8=T3
ma = talib.MA(close_p, timeperiod=3, matype=0)
print([round(i,2) for i in ma])
图片
策略的结果就是返回这一周期的数据是否满足条件,如果满足,就执行买卖操作。具体策略编写在回测系统里一并说,现在就了解它的作用。回测系统
首先它需要对数据进行切片,一般是日K线,用for循环遍历历史数据,然后分析每天的数据是否满足策略。这里还有个窗口概念,比如分析当日数据时,还需要前5日的数据,那么每次循环的窗口是[i-5,i]。当满足买卖条件时,按指定的仓位或数量算出剩余资金,并记录盈亏数,如有其它评价指标需要某些数据,就在此设置。此外还有手续费、滑点等仿真参数设置。
def Sar(df,ma,sar,cash):
ma = df['close'].rolling(window=ma).mean()
#sar = mySAR(df,s/100,m/100)
status = md = lastc = shou = count = win = 0
cash0 = cash
m1 = np.empty(len(df))
m2 = np.empty(len(df))
m1[:] = m2[:] = np.nan
for k in range(len(df)):
if ma[k]>=sar[k] and ma[k-1]<sar[k-1] \
and status==0 and np.isnan(m2[k-1]):
lastc = df.close[k]
shou = int(cash0/lastc/100)
buy = df.close[k]*shou*100
status = 1
cash0 -= buy*1.007
count += 1
m1[k] = df.low[k]
print('买入:%s'%cash0)
if (ma[k]<=sar[k] and ma[k-1]>sar[k-1] or k==len(df)-1) and status==1:
sell = df.close[k]*shou*100
status = 0
cash0 += sell
chajia = df.close[k]-lastc
lastmd = round((chajia)/lastc*100,2)
if lastmd < md:
md = lastmd
if chajia > 0:
win +=1
m2[k] = df.high[k]
print('卖出:%s'%cash0)
if count == 0:
sl = 0
else:
sl = round(win/count*100,2)
lrl = round((cash0-cash)/cash*100,2)
print('利润率:%s%%'%lrl)
print('最大回撤:%s%%'%md)
print('胜率:%s%%'%sl)
return m1,m2
图片
请原谅我的英文拼音混用。另外策略直接写在回测函数里了,规范来说应该单拿出来作为一个函数,我这里是为了单独一个策略写的回测。这个简单回测里也没有加仓减仓的操作,只是一次性买入卖出。
网友评论