分享

从零实现”搭积木式实现策略“的回测系统 part V

 AI量化实验室 2023-10-12 发布于北京

前面系列文章,我们把回测系统的主要部件作了详细的说明,这些部件构成了回测引擎的主体。如果把回测引擎比作一台机器,那么数据就是生产原料,而策略就是加工方法。

策略需要对原始数据进行计算,得到各种中间指标,比如均线,MACD,布林带等等。我们基于talib这个指标计算库,提供了相应的指标计算功能,另外还实现了金叉,死叉这种常用的时间序列状态判断。

有了上述这些准备工作,我们通过python eval功能,实现写文本表达式的方式来写策略,大大简化了代码。

比如:收盘价5日均线向上突破收盘价10日均线。

eval('cross_up(ma(close,5),ma(close,10')

有了这种灵活的表达方式,我们很容易就能够实现像海龟策略这种技术形态判断。

technical/indicators.py

如下代码可以看出,直接调用talib可以实现大部分的技术指标计算。

import talibdef rolling_max(se,n):
    max_n = se.rolling(n).max()    
return max_ndef rolling_min(se,n):    min_n = se.rolling(n).min()    
return min_ndef ma(se,n):    ma_n = se.rolling(n).mean()    
return ma_ndef ema(se,n):    ema_n = talib.EMA(se,n)    
return ema_n
def macd(se,fast=12,slow=26,signal=9):    macd_n, macd_sig, macd_hist = talib.MACD(se,fast,slow,signal)    
return macd_n,macd_sig,macd_hist
def rsi(se,n):    rsi_n = talib.RSI(se,n)    
return rsi_ndef obv(se,volume,n):    obv_n = talib.OBV(se, volume)    
return obv_ndef mom(se,n):    mom_n = talib.MOM(se,timeperiod=n)    
return mom_ndef bbands(se,n):    upper, middle, lower = talib.BBANDS(        se.values,        timeperiod=n,        # number of non-biased standard deviations from the mean        nbdevup=2,        nbdevdn=2,        # Moving average type: simple moving average here        matype=0)    return upper,middle,lower

technical/cross.py

cross_up实现了快线金叉慢线;而cross_down实现了快线向下突破慢线。

import numpy as npimport pandas as pd

def cross(fast, slow):    
data = pd.DataFrame(index=fast.index)    
data['signal'] = fast - slow  # data[fast] - data[slow]    
data['signal'] = np.where(data['signal'] > 0, 1, data['signal'])  
 data['signal'] = np.where(data['signal'] < 0, -1, data['signal'])    
 data['signal'] = data['signal'] - data['signal'].shift(1)    
 data['signal'] = np.where(data['signal'] > 0, 1, data['signal'])    
 data['signal'] = np.where(data['signal'] < 0, -1, data['signal'])    return data['signal'] def cross_up(fast, slow):    
 data = pd.DataFrame(index=fast.index)    
 data['signal'] = fast - slow  # data[fast] - data[slow]    
 data['signal'] = np.where(data['signal'] > 0, 1, data['signal'])    
 data['signal'] = np.where(data['signal'] < 0, -1, data['signal'])    
 data['signal'] = data['signal'] - data['signal'].shift(1)  
  data['signal'] = np.where(data['signal'] > 0, 1, 0)    #data['signal'] = np.where(data['signal'] < 0, -1, data['signal'])    return data['signal'] def cross_down(fast, slow):    
  data = pd.DataFrame(index=fast.index)    
  data['signal'] = fast - slow  # data[fast] - data[slow]  
   data['signal'] = np.where(data['signal'] > 0, 1, data['signal'])    
   data['signal'] = np.where(data['signal'] < 0, -1, data['signal'])    
   data['signal'] = data['signal'] - data['signal'].shift(1)    
   data['signal'] = np.where(data['signal'] < 0, -1,0)    return data['signal']

后续我们会对比ailabx与pyalgotrade书写策略的代码做对比,看看ailabx到底有多么简洁!

项目在github上开源,欢迎star。

代码在github上开源ailabx

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约