예제 #1
0
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)    
예제 #2
0
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('没有数据')
예제 #3
0
    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)
예제 #4
0
 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
예제 #5
0
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 '没有数据'
예제 #6
0
    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)
예제 #7
0
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 '没有数据'