简友广场多才多艺

量化 | 基础框架(中)

2021-09-01  本文已影响0人  opcc

策略

收益多少就靠策略好坏了,策略又是建立在各种指标之上。有个叫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
图片

请原谅我的英文拼音混用。另外策略直接写在回测函数里了,规范来说应该单拿出来作为一个函数,我这里是为了单独一个策略写的回测。这个简单回测里也没有加仓减仓的操作,只是一次性买入卖出。

上一篇 下一篇

猜你喜欢

热点阅读