Beispiel #1
0
def Run(codes, task_id=0):
    from pypublish import publish
    pl = publish.Publish()
    df_year = stock.THS().df_year
    df_jll = stock.THS().df_jll
    #myredis.delKeys(myredis.enum.KEY_HISDAT_NO_FUQUAN)
    for code in codes:
        df = df_year[df_year['code'] == code]
        df_hisdat = stock.getHisdatDfRedis(code)
        history_syl = calc_history_syl(df, df_hisdat, 'year')
        ui.DrawTs(pl, history_syl, title=stock.GetCodeName(code).decode('utf8'))
        df = df_jll[df_jll['code'] == code]
        history_syl = calc_history_syl(df, df_hisdat, period='quarter')
        ui.DrawTs(pl, history_syl, title=stock.GetCodeName(code).decode('utf8'))
Beispiel #2
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)    
Beispiel #3
0
    def _Report(self, policy, start_day, end_day):
        policy._getAccount().Report(end_day, True)
        #绘制图形
        if hasattr(policy, 'Report'):
            policy.Report()
        #end_day = help.MyDate.s_Dec(end_day, 1)
        #bars = stock.CreateFenshiPd(self.code, start_day, end_day)
        if self.mode == 0:
            bars = self.dict_fenshi[self.codes[0]]
            if len(bars) == 0:
                return
            bars = bars.resample('1min').mean()
            bars['c'] = bars['p']
        else:
            #日线
            bars = self.panel_hisdat[self.codes[0]]
        bars['positions'] = 0
        bars = bars.dropna()
        df = policy._getAccount().ChengJiao()
        df_zhijing = policy._getAccount().ZhiJing()
        init_money = df_zhijing.iloc[0]['资产']
        df_zhijing = df_zhijing[bars.index[0]:]
        df_changwei = policy._getAccount().ChengJiao()
        cols = ['买卖标志', '委托数量']
        df_flag = df_changwei[cols[0]].map(lambda x: x == '证券卖出' and -1 or 1)
        df_changwei[cols[1]] *= df_flag
        changwei = df_changwei[cols[1]].cumsum()
        if self.mode == 1:
            df.index = df.index.map(lambda x: agl.datetime_to_date(x))
        bars.is_copy = False
        for i in range(len(df)):
            index = df.index[i]
            bSell = bool(df.iloc[i]['买卖标志'] == '证券卖出')
            if index in bars.index:
                bars.at[index, 'positions'] = agl.where(bSell, -1, 1)
        #同步资金到bar
        df_zhijing.is_copy = False
        df_zhijing['changwei'] = changwei
        if self.mode == 1:
            df_zhijing.index = df_zhijing.index.map(
                lambda x: agl.datetime_to_date(x))
        bars = bars.join(df_zhijing)
        bars = bars.fillna(method='pad')
        #同步价格的动态总资产
        bars['资产'] = bars['可用'] + bars['changwei'] * bars['c']
        zhican = (bars['资产'] - init_money) / init_money * 100
        zhican = zhican.fillna(0)
        title = '%s %s' % (self.codes[0], stock.GetCodeName(
            self.codes[0]).decode('utf8'))
        ui.TradeResult_Boll(agl.where(policy.pl, policy.pl, pl), bars,  \
                            stock.GuiYiHua(zhican),\
                            stock.GuiYiHua(bars['changwei']),
                            title=title)

        if policy.pl is not None:
            if policy.pl.explicit:
                #有成交才发布
                if len(df) > 0:
                    policy.pl.publish()
Beispiel #4
0
        def Order_At_Boll():
            upper, middle, lower = stock.TDX_BOLL(df_five_hisdat['c'])

            highs, lows, closes = df_five_hisdat['h'], df_five_hisdat[
                'l'], df_five_hisdat['c']

            adx = stock.TDX_ADX(highs, lows, closes)

            self._log('boll : %.2f,%.2f,%.2f' %
                      (upper[-1], middle[-1], lower[-1]))
            boll_w = abs(upper[-1] - lower[-1]) / middle[-1] * 100

            boll_poss = [
                upper[-1],
                (upper[-1] - middle[-1]) / 2 + middle[-1],
                middle[-1],
                (middle[-1] - lower[-1]) / 2 + lower[-1],
                lower[-1],
            ]
            self._log('boll_poss: %.2f, %.2f boll_w=%.2f adx=%.2f' %
                      (boll_poss[0], boll_poss[1], boll_w, adx[-1]))

            user_datas = mydatas[mydatas['symbol'] == code]
            if price > boll_poss[1] * 1.001:
                num = int(user_datas['trade1'])
                if self.order(1, code, price, num):
                    self._log(
                        agl.utf8_to_ascii('一档卖出%s, %.2f, %d' %
                                          (code, price, num)))
            if price > boll_poss[0] * 0.998:
                num = int(user_datas['trade2'])
                if self.order(1, code, price, num):
                    self._log(
                        agl.utf8_to_ascii('二档卖出%s, %.2f, %d' %
                                          (code, price, num)))
            if price < boll_poss[-2] * 0.999:
                num = int(user_datas['trade1'])
                if self.order(0, code, price, num):
                    self._log(
                        agl.utf8_to_ascii('一档买入%s, %.2f, %d' %
                                          (code, price, num)))
            if price < boll_poss[-1] * 1.001:
                num = int(user_datas['trade2'])
                if self.order(0, code, price, num):
                    self._log(
                        agl.utf8_to_ascii('二档买入%s, %.2f, %d' %
                                          (code, price, num)))
            #信号发生时语音播报, 并通知界面回显
            if not self.is_backtesting and (price > boll_poss[1]
                                            or price < boll_poss[-2]):
                codename = stock.GetCodeName(code)
                s = '%s, %.2f' % (codename, price)
                self.data.show(codename)  #通知界面显示
                self.data.speak2(s)  #语音播报
Beispiel #5
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('没有数据')
Beispiel #6
0
def testTradeResult_Boll():
    code = '002074'
    bars = stock.CreateFenshiPd(code, '2017-7-22','2017-8-4')
    if len(bars)>0:
        bars = bars.resample('1min').mean()
    else:
        return
    bars['c'] = bars['p']
    bars = bars.dropna()
    zhijin = pd.Series(index=bars.index)
    zhijin.loc[:] = 1000000
    zhijin[100] = 1010000
    zhijin[200] = 980000

    TradeResult_Boll(pl, bars, zhijin, None, stock.GetCodeName(code).decode('utf8'))
Beispiel #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
        if start_day == '':
            #再次修正为已有数据的20天
            d1 = help.MyDate.s_Dec(d2, -day_num)

        if d1 != d2:
            print d1, d2
            p.Run(d1, d2)
        else:
            print '没有数据'
Beispiel #8
0
 def Report(self):
     import time, dateutil, datetime
     self._ReadData()
     for code, group in self.df_chengjiao.groupby('stock_code'):
         if code in myenum.allow_traded_codes:
             print code, stock.GetCodeName(code)
             df = self.df_chengjiao[self.df_chengjiao['stock_code'] == code]
             df = df.loc[:, ['price', 'num', 'is_sell', 'stock_code', 't']]
             df.columns = ['price', 'num', 'flag', 'code',
                           'd']  #匹配web接口里使用的字段
             print df
             df['d'] = df.index.astype(str)
             df['d'] = df['d'].map(lambda x: str(dateutil.parser.parse(x) + \
                                          datetime.timedelta(minutes=5)))
             myredis.set_obj('backtest_trade', df)
             os.system('start http://localhost/training')
             time.sleep(5)
Beispiel #9
0
    def Run(self):
        """
        """
        #self._log('Strategy_Boll_Pre')

        #以下为交易测试
        code = self.data.get_code()  #当前策略处理的股票
        self.code = code
        if not self.is_backtesting and not self.AllowCode(code):
            return

        df_hisdat = self.data.get_hisdat(code)  #日k线
        df_five_hisdat = self.data.get_hisdat(code, dtype='5min')  #5分钟k线
        df_fenshi = self.data.get_fenshi(code)  #日分时
        if len(df_fenshi) == 0:
            self.data.log(code + u"未取到分时数据")
            return
        account = self._getAccount()  #获取交易账户
        price = float(df_fenshi.tail(1)['p'])  #当前股价
        closes = df_hisdat['c']
        yestoday_close = closes[-2]  #昨日收盘价
        zhangfu = stock.ZhangFu(price, yestoday_close)
        self._log(
            'price=%.2f %s %s' %
            (price, str(df_fenshi.index[-1]), str(df_five_hisdat.iloc[-1])))
        account_mgr = ac.AccountMgr(account, price, code)
        trade_num = ac.ShouShu(account_mgr.init_money() *
                               self.trade_num_use_money_percent / price)
        trade_num = max(100, trade_num)

        # 信号计算
        four = stock.FOUR(closes)
        four = four[-1]
        upper, middle, lower = stock.TDX_BOLL(df_five_hisdat['c'])
        highs, lows, closes = df_five_hisdat['h'], df_five_hisdat[
            'l'], df_five_hisdat['c']
        adx = stock.TDX_ADX(highs, lows, closes)
        self._log('boll : %.2f,%.2f,%.2f' % (upper[-1], middle[-1], lower[-1]))
        boll_w = abs(upper[-1] - lower[-1]) / middle[-1] * 100
        #50个周期内最高值
        is_high = abs(price - max(df_five_hisdat[-1000:]['h'])) / price < 0.005

        boll_poss = [
            upper[-1],
            (upper[-1] - middle[-1]) / 2 + middle[-1],
            middle[-1],
            (middle[-1] - lower[-1]) / 2 + lower[-1],
            lower[-1],
        ]
        self._log('boll_poss: %.2f, %.2f boll_w=%.2f adx=%.2f' %
                  (boll_poss[0], boll_poss[1], boll_w, adx[-1]))

        #上一个成交的价位
        pre_price = account_mgr.last_chengjiao_price()
        pre_pre_price = account_mgr.last_chengjiao_price(index=-2)
        sell_count = account_mgr.queryTradeCount(1)
        buy_count = account_mgr.queryTradeCount(0)
        #买入均价

        adx = adx[-1]
        boll_up_ratio = 0.02
        #信号判断
        num = 0
        if so.assemble(
                price > boll_poss[1],
                price > pre_price * (1 + self.trade_ratio),
                #price > boll_poss[2],
                #price > self.max_buy_price*(1+self.trade_ratio),
                #boll_w > 3.5,
                #adx > 60,
                #sell_count < 2,
                #pr.horizontal(df_five_hisdat),
                0,
        ):
            num = -trade_num
            self.trade_status = self.enum.boll_up_mid
            #if self.order(1, code, price, num):
            #self._log(agl.utf8_to_ascii('一档卖出%s, %.2f, %d'%(code, price, num)))
        if so.assemble(
                price > boll_poss[0],
                price > pre_price * (1 + self.trade_ratio),
                #price > self.max_buy_price*(1+self.trade_ratio),
                #boll_w > 3,
                adx > 60,
                is_high,
                #four > self.trade_four[1],
                #sell_count < 2,
                #self.trade_status == self.enum.nothing,
                #0,
        ):
            num = -trade_num * 3
            self.trade_status = self.enum.boll_up
            #if self.order(1, code, price, num):
            #self._log(agl.utf8_to_ascii('二档卖出%s, %.2f, %d'%(code, price, num)))
        if so.assemble(
                price < boll_poss[-2] * (1 + boll_up_ratio),
                price < pre_price * (1 - self.trade_ratio),
                #price < boll_poss[2],
                #price < self.min_sell_price*(1-0.03),
                #boll_w > 3.5,
                #adx>60,
                #buy_count < 2,
                #pr.horizontal(df_five_hisdat),
                0,
        ):
            num = trade_num
            self.trade_status = self.enum.boll_down_mid
            #if boll_w > 6:
            #num *= self.trade_num_ratio
            #if self.order(0, code, price, num):
            #self._log(agl.utf8_to_ascii('一档买入%s, %.2f, %d'%(code, price, num)))
        if so.assemble(
                price < boll_poss[-1],
                price < pre_price * (1 - self.trade_ratio),
                #price < self.min_sell_price*(1-0.03),
                #boll_w > 3,
                #buy_count < 2,
                #self.trade_status == self.enum.nothing,
                #adx>70,
                #four < self.trade_four[0],
                #0,
        ):
            num = trade_num * 3
            #num = account_mgr.last_chengjiao_num()
            self.trade_status = self.enum.boll_down
            #if self.order(0, code, price, num):
            #self._log(agl.utf8_to_ascii('二档买入%s, %.2f, %d'%(code, price, num)))

        #成本区间
        if so.assemble(
                price < pre_price * (1 - 0.05),
                four < -0.1,
                self.trade_status == self.enum.boll_up,
                0,
        ):
            num = trade_num * self.trade_num_ratio
            self.trade_status = self.enum.nothing
        if so.assemble(
                price > pre_price * (1 + 0.05),
                four > 0.1,
                self.trade_status == self.enum.boll_down,
                0,
        ):
            num = -trade_num * self.trade_num_ratio
            self.trade_status = self.enum.nothing

        #zz顶抛出后回补
        if so.assemble(
                price < pre_price * (1 - 0.02),
                #sell_count >= 2,
                self.trade_status == self.enum.zz_up,
                0,
        ):
            #上次zz卖出的数量
            num = account_mgr.last_chengjiao_num()
            self.trade_status = self.enum.zz_hui_bu
        if so.assemble(
                price > pre_price * (1 + 0.02),
                #sell_count >= 2,
                self.trade_status == self.enum.zz_down,
                0,
        ):
            #上次zz卖出的数量
            num = account_mgr.last_chengjiao_num()
            self.trade_status = self.enum.zz_hui_bu

        #计算分时zz
        zz_sign = 0
        closes = df_five_hisdat['c'][-200:].values
        zz = stock.ZigZag(closes)
        if len(zz) > 2:
            zz_result = stock.analyzeZZ(zz)
            zz_line_ratio = zz_result[1] / zz_result[0]  #线段比率
            #扑捉大涨回头的信号
            if abs(zz_result[0]) > 0.05 and abs(zz_line_ratio) > 0.05 and abs(
                    zz_line_ratio) < 0.2 and abs(zz_result[0]) > 0.04:
                zz_sign = agl.where(zz_result[1] > 0, 1, -1)

        if num != 0:
            bSell = agl.where(num > 0, 0, 1)
            num = abs(num)
            #if bSell:
            #num = self._compensate(num, bSell, code)
            #基本上每天的振幅都在1个点以上
            if abs(stock.ZhangFu(price, yestoday_close)) > 0.01:
                self.order(bSell, code, price, num)

        zz_pre_price = myredis.createRedisVal('policy_basesign_zz_pre_price',
                                              price)
        if so.assemble(
                zz_sign != 0,
                0,
        ):
            #print self.price, getZZPrePrice(self.price),abs(self.price-getZZPrePrice(self.price))/self.price
            num = trade_num * 12
            bSell = agl.where(zz_sign > 0, 0, 1)
            num = self._compensate(num, bSell, code)
            bCanOrder = False
            if so.assemble(
                    bSell,
                    price > zz_pre_price.get() * (1 + 0.03),
                    #price > pre_price*(1+self.trade_ratio),
            ):
                bCanOrder = True
                self.trade_status = self.enum.zz_up
            if so.assemble(
                (not bSell),
                    price < zz_pre_price.get() * (1 - 0.03),
                    #price < pre_price*(1-self.trade_ratio)
            ):
                bCanOrder = True
                self.trade_status = self.enum.zz_down
            if bCanOrder:
                self._getAccount().Order(bSell, code, price, num)
                zz_pre_price.set(price)

        #信号发生时语音播报, 并通知界面回显
        if not self.is_backtesting and (price > boll_poss[1]
                                        or price < boll_poss[-2]):
            codename = stock.GetCodeName(code)
            s = '%s, %.2f' % (codename, price)
            self.data.show(codename)  #通知界面显示
            self.data.speak2(s)  #语音播报

        #tick report
        if self.is_backtesting and self.is_tick_report:
            self._getAccount().TickReport(df_five_hisdat, 'win')
        return
    def ExePolicy(self, code):
        df_source = self._getUserStrategy()
        if len(df_source) == 0:
            return
        d = []
        bHaveCode = False
        for i in range(len(df_source)):
            strategy_code = df_source.irow(i)['code']
            strategy_id = df_source.irow(i)['id']
            try:
                self._checkImport(strategy_code)
                #self._log("run here")
                exec(strategy_code)
                if initialize(None).find(code) >= 0:
                    bHaveCode = True
                    break
            except Exception as e:
                s = str(e)
                d.append({
                    "strategy_id": strategy_id,
                    "title": code,
                    "code": s,
                    "t": datetime.datetime.now()
                })
                #一分钟内同一个策略不能提交
                if (d[-1]["t"] - self.pre_post_runlog[strategy_id]
                    ).total_seconds() > 60:
                    agl.LOG(str(e))
                    basesign.PostRunLog(d)
                    self.pre_post_runlog[strategy_id] = d[-1]['t']
                continue
        if bHaveCode == False:
            return

        live_data = LiveData()
        df_hisdat = live_data.getHisdat(code)
        df_fenshi = live_data.getFenshi(code)
        if len(df_fenshi) == 0:
            return
        #return

        data = {
            "code": code,
            "fenshi": df_fenshi,
            "hisdat": df_hisdat,
            'name': stock.GetCodeName(code),
            'price': float(df_fenshi.tail(1)['p'])
        }

        # 取历史redis分时
        df_fenshi_1min = df_fenshi.resample("1min")
        df_fenshi_1min_pre = fenshi_redis.getOneMinFenshiFromRedis(code)
        if df_fenshi_1min_pre is None:
            agl.LOG("分时历史取值失败" + code)
        else:
            df_fenshi_1min = pd.concat([df_fenshi_1min_pre, df_fenshi_1min])
        df_fenshi_1min = df_fenshi_1min.dropna()
        closes = np.array(df_fenshi_1min['p'])
        data['rsi'] = stock.RSI(closes)[-1]
        # BOLL
        df_fenshi_5min = df_fenshi_1min.resample('5min')
        upper, middle, lower = stock.BOLL(np.array(df_fenshi_5min['p']))
        data['boll_up'] = upper[-1]
        data['boll_mid'] = middle[-1]
        data['boll_down'] = lower[-1]
        # ATR
        atr = stock.ATR(df_fenshi_5min['p'], df_fenshi_5min['p'],
                        df_fenshi_5min['p'])
        data['atr'] = atr[-1]

        #执行用户的代码
        data['msglist'] = []
        for i in range(len(df_source)):
            strategy_code = df_source.irow(i)['code']
            #strategy_code = strategy_code.replace('\n','')
            strategy_id = df_source.irow(i)['id']
            agl.LOG(str(strategy_id))
            data['strategy_id'] = strategy_id
            try:
                self._checkImport(strategy_code)
                exec(strategy_code)
                if initialize(None).find(code) < 0:
                    continue
                sign = handle_data(self, data)
                s = "run sussessful"
                if sign:
                    s += " have sign"
                agl.LOG(s)
            except Exception as e:
                s = str(e)
                #s += '\n'
                s += traceback.format_exc()
            d.append({
                "strategy_id": strategy_id,
                "title": code,
                "code": s,
                "t": datetime.datetime.now()
            })
        #所有用户的策略执行完毕后再提交
        agl.LOG('start post')
        basesign.PostRunLog(d)
        if len(data['msglist']) > 0:
            agl.LOG(data['msglist'])
            basesign.PostMsgList(data['msglist'])
        agl.LOG('end post')
    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)
Beispiel #12
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 '没有数据'