def test_strategy(codes, strategy_name): import backtest_runner for code in codes: print code, stock.GetCodeName(code) p = backtest_runner.BackTestPolicy(backtest_runner.BackTestPolicy.enum.tick_mode) p.SetStockCodes([code]) backtesting = Backtest() account = backtesting.createAccount(account_type=None, username=None, pwd=None) #p.Regist(Strategy_basesign(backtesting, is_backtesting=True)) strategy = strategy_name(backtesting, is_backtesting=True) strategy.trade_num = 600 p.Regist(strategy) #p.Regist(Strategy_Trade(backtesting, is_backtesting=True)) cur_day = agl.CurDay() d1, d2 = help.MyDate.s_Dec(cur_day, -20),cur_day def getTradeDay(d1, d2, dtype=backtest_runner.BackTestPolicy.enum.hisdat_mode): """确定是交易日 return: (d1, d2)""" if dtype == backtest_runner.BackTestPolicy.enum.hisdat_mode: df = stock.getHisdatDataFrameFromRedis(code, start_day=d1) else: df = stock.getFenshiDfUseRedis(code, d1, d2) d2 = agl.datetime_to_date(df.index[-1]) if agl.DateTimeCmp(d1, agl.datetime_to_date(df.index[0])) <0: d1 = agl.datetime_to_date(df.index[0]) return d1, d2 #for i in range(10): #if d1 in df.index: #return d1,d2 #else: #d1 = help.MyDate.s_Dec(d1, 1) d1,d2 = getTradeDay(d1,d2, backtest_runner.BackTestPolicy.enum.tick_mode) print d1, d2 p.Run(d1, d2)
def test_strategy(codes, strategy_name, cbfn_setparams=None, mode=1, start_day='', end_day='', datasource_mode=stock.DataSources.datafrom.livedata, datasource_fn=None): """strategy_name: str 通过策略名称来构造策略 cbfn_setparams: callback function 回调函数 fn(strategy) 用该函数来重新设置参数 mode : enum/int tick=0/hisdat=1 datasource_mode : 数据源引用地 stock.DataSource.data_mode datasource_fn: 函数, data_mode需要使用自定义 """ import backtest_runner if mode == 0: mode = backtest_runner.BackTestPolicy.enum.tick_mode stock.DataSources.data_mode = datasource_mode stock.datasource_fn = datasource_fn for code in codes: print(code, stock.GetCodeName(code)) p = backtest_runner.BackTestPolicy(mode) p.SetStockCodes([code]) backtesting = Backtest() account = backtesting.createAccount(account_type=None, username=None, pwd=None) #p.Regist(Strategy_basesign(backtesting, is_backtesting=True)) strategy = strategy_name(backtesting, is_backtesting=True, mode=mode) #设置策略参数 if cbfn_setparams is not None: cbfn_setparams(strategy) else: strategy.setParams() print(strategy.getParams()) p.Regist(strategy) #p.Regist(Strategy_Trade(backtesting, is_backtesting=True)) cur_day = agl.CurDay() if end_day == '': end_day = cur_day #if start_day == '': ##再次修正为已有数据的20天 #start_day = help.MyDate.s_Dec(end_day, -day_num) d1, d2 = p.initData(start_day, end_day) if d1 != d2: print(d1, d2) p.Run(d1, d2) else: print('没有数据')
def _test_fenshi_redis(self): """取一个个股的redis, 看下日期""" end_day = agl.CurDay() start_day = help.MyDate.s_Dec(end_day, -15) code = u'600100' #取一个值 df_fenshi = getFiveMinFenshiFromRedis(code) df_fenshi_day = df_fenshi.resample('D').dropna() self.assertEqual(len(df_fenshi_day), 5) d = agl.datetime_to_date(df_fenshi_day.index[-1]) self.assertEqual(stock.getKlineLastDay(), d) df = stock.LiveData().getFiveMinHisdat(code) print(df)
def get_fenshi(self, code): """return: df columns('tpvdb')""" #构造数据区, row*5 row = np.array([-1], dtype=np.int32) a = np.array([0], dtype=np.float64) self.GetFenshi(code,row,a) l = (row[0], 5) a = np.zeros(l[0]*l[1], dtype=np.float64) if row[0] > 0: self.GetFenshi(code, row, a) d = a.reshape(l) df = pd.DataFrame(d[:,0]) df[0] = df[0].map(lambda x: stock.StockTime.s_ToStrTime(int(x), agl.CurDay())) df = pd.DataFrame(d[:,1:], index=pd.DatetimeIndex(df[0]), dtype=float, columns=list('pvdb')) return df
def test_strategy(codes, strategy_name, cbfn_setparams=None, day_num=20, mode=0, start_day='', end_day=''): """strategy_name: str 通过策略名称来构造策略 cbfn_setparams: callback function 回调函数 fn(strategy) 用该函数来重新设置参数 day_num: 当前天或者数据集的最后一天向前推的天数, 同时会修正为数据集有效的第一天 mode : enum/int tick/hisdat """ import backtest_runner if mode == 0: mode = backtest_runner.BackTestPolicy.enum.tick_mode for code in codes: print code, stock.GetCodeName(code) p = backtest_runner.BackTestPolicy(mode) p.SetStockCodes([code]) backtesting = Backtest() account = backtesting.createAccount(account_type=None, username=None, pwd=None) #p.Regist(Strategy_basesign(backtesting, is_backtesting=True)) strategy = strategy_name(backtesting, is_backtesting=True, mode=mode) #设置策略参数 if cbfn_setparams is not None: cbfn_setparams(strategy) else: strategy.setParams() print(strategy.getParams()) p.Regist(strategy) #p.Regist(Strategy_Trade(backtesting, is_backtesting=True)) cur_day = agl.CurDay() if end_day != '': cur_day = end_day d1, d2 = help.MyDate.s_Dec(cur_day, -20), cur_day if start_day != '': d1 = start_day if start_day == '': #再次修正为已有数据的20天 d1 = help.MyDate.s_Dec(d2, -day_num) if d1 != d2: print d1, d2 p.Run(d1, d2) else: print '没有数据'
def ExePolicy(self, code): code = agl.unicode_to_utf8(code) live_data = LiveData() df_hisdat = live_data.getHisdat(code) df_fenshi = live_data.getFenshi(code) df_five_hisdat = live_data.getFiveMinHisdat(code) if agl.IsNone(df_five_hisdat): #print code ,'没有5分钟' return if len(df_fenshi) == 0: return if len(df_five_hisdat) < 30: return price = float(agl.FloatToStr(float(df_fenshi.tail(1)['p']))) yclose = df_hisdat.ix[df_hisdat.index[-1]]['c'] zhangfu = stock.ZhangFu(price, yclose) rsi = stock.RSI(df_five_hisdat['c']) #ui.DrawClosesAndVolumes(pl, df_five_hisdat['c'], rsi) upper, middle, lower = stock.TDX_BOLL(df_five_hisdat['c']) #ui.DrawTs(pl, df_five_hisdat['c'],mid=middle, high=upper, low=lower) highs, lows, closes = df_five_hisdat['h'], df_five_hisdat[ 'l'], df_five_hisdat['c'] #atr = stock.ATR(highs, lows, closes) adx = stock.TDX_ADX(highs, lows, closes) closes = np.array(df_hisdat['c']) if help.MyDate(agl.datetime_to_date(df_hisdat.index[-1])).d < \ help.MyDate(agl.CurDay()).d: closes = agl.array_insert(closes, len(closes), price) four = stock.FOUR(closes) #print code, four[-1] self._dict_four[code] = four[-1] #return #ui.DrawClosesAndVolumes(pl, df_five_hisdat['c'], adx) boll_up = (price - upper[-1]) / upper[-1] boll_mid = (price - middle[-1]) / middle[-1] boll_down = (lower[-1] - price) / lower[-1] boll_width = upper[-1] - lower[-1] if abs(zhangfu) > 0.098 or boll_width < 0.01: return if code == '300033': codename = stock.GetCodeName(code) s = 'rsi = %d %s %s' % (rsi[-1], codename, str(price)) print s if (rsi[-1] > 65 or rsi[-1] < 35) and adx[-1] > 60: codename = stock.GetCodeName(code) s = '%s %s' % (codename, str(price)) sign = False #if code in ['300033','510050']: #sign = True #if adx[-1] > 55: #s += ' ADX=%d'%(adx[-1]) #sign = True if boll_up > -0.003: s += ' 越过布林上轨' #sign = True if abs(boll_mid) < 0.003: s += ' 布林中轨' #sign = True if boll_down > -0.003: s += ' 越过布林下轨' sign = True if four[-1] > 0.1: sign = False #sign = False if sign: #ui.DrawTs(pl, df_five_hisdat['c'],mid=middle, high=upper, low=lower) sInfo = self.calcInfo(code, price, zhangfu) help.myprint(s, sInfo) help.myprint( '[%s,%s] %.3f,%.3f,%.3f,%.2f, four=%.2f, adx=%.2f' % (code, stock.GetCodeName(code), boll_up, boll_mid, boll_down, boll_width, four[-1], adx[-1])) self.NotifyAutoxdShow(code) self.Speak(s)
def test_strategy(codes, strategy_name, cbfn_setparams=None, day_num=20, mode=0, start_day='', end_day=''): """strategy_name: str 通过策略名称来构造策略 cbfn_setparams: callback function 回调函数 fn(strategy) 用该函数来重新设置参数 day_num: 当前天或者数据集的最后一天向前推的天数, 同时会修正为数据集有效的第一天 mode : enum/int tick/hisdat """ import backtest_runner if mode == 0: mode = backtest_runner.BackTestPolicy.enum.tick_mode for code in codes: print code, stock.GetCodeName(code) p = backtest_runner.BackTestPolicy(mode) p.SetStockCodes([code]) backtesting = Backtest() account = backtesting.createAccount(account_type=None, username=None, pwd=None) #p.Regist(Strategy_basesign(backtesting, is_backtesting=True)) strategy = strategy_name(backtesting, is_backtesting=True, mode=mode) #设置策略参数 if cbfn_setparams is not None: cbfn_setparams(strategy) else: strategy.setParams() print(strategy.getParams()) p.Regist(strategy) #p.Regist(Strategy_Trade(backtesting, is_backtesting=True)) cur_day = agl.CurDay() if end_day != '': cur_day = end_day d1, d2 = help.MyDate.s_Dec(cur_day, -20),cur_day if start_day != '': d1 = start_day def getTradeDay(d1, d2, dtype=backtest_runner.BackTestPolicy.enum.hisdat_mode): """确定是交易日 return: (d1, d2)""" try: if dtype == backtest_runner.BackTestPolicy.enum.hisdat_mode: df = stock.getHisdatDataFrameFromRedis(code, d1, d2) else: df = stock.getFenshiDfUseRedis(code, d1,d2) if len(df) == 0: #在指定日期内没有数据,应该是新股或次新股 return d2,d2 d2 = agl.datetime_to_date(df.index[-1]) if agl.DateTimeCmp(d1, agl.datetime_to_date(df.index[0])) <0: d1 = agl.datetime_to_date(df.index[0]) except: pass return d1, d2 #for i in range(10): #if d1 in df.index: #return d1,d2 #else: #d1 = help.MyDate.s_Dec(d1, 1) d1,d2 = getTradeDay(d1,d2, mode) if start_day == '': #再次修正为已有数据的20天 d1 = help.MyDate.s_Dec(d2, -day_num) d1,d2 = getTradeDay(d1,d2, mode) if d1 != d2: print d1, d2 p.Run(d1, d2) else: print '没有数据'