Пример #1
0
def batch_divergence_monitor(stocklist=None):
    lasttradetimestr = DP.get_last_trade_time('D')
    if stocklist is None:
        stocklist = ['longtou', 'etf']
    for dataset in stocklist:
        for tradeCycle in ['W', 'D', '60', '30', '15']:
            colNames = [
                'code', 'name', 'cycle', 'period', 'curclose', 'sma', 'ATR',
                'ATRRatio', 'rewardrisk', 'primImpScore', 'tradeImpScore',
                'primdivscore', 'divscore', 'difdeascore', 'macdscore',
                'totalscore'
            ]

            filename = StrategyName + '-' + dataset
            RootDir = os.path.join(os.pardir, 'data', lasttradetimestr)
            DP.mkdir(RootDir)
            filepath = os.path.join(RootDir, filename + '.csv')

            codelist = DI.get_stockcode_list(dataset)

            dfSelected = pd.DataFrame([], columns=colNames)
            dfScreen = codelist[['code', 'name']]
            totalrows = len(dfScreen)
            for i in range(totalrows):
                code = dfScreen.loc[i, 'code']
                code = DP.codeType(code)

                name = dfScreen.loc[i, 'name']

                #if(DI.is_tingpai(code)):
                #    continue

                dfdata = ts.get_k_data(code, ktype=tradeCycle)
                if (len(dfdata) < 120):  #剔除交易时间少于120天的个股
                    continue

                dates = dfdata['date'].values
                closes = dfdata['close'].values
                highs = dfdata['high'].values
                lows = dfdata['low'].values

                macddiclist = ta.cal_macd(dates, closes)
                macd, dif, dea = DP.get_macd_list(macddiclist)

                divStatus = ta.macd_in_bulldivergence_signal(dates, macd)

                divscore = divStatus['div']
                macdscore = divStatus['macd']
                period = divStatus['period']

                if (divscore != 0):

                    print(code, name, tradeCycle, divscore, macdscore, period)
                    absdis, perdis, maprice = ta.curdistosma(closes, 20)
                    curATR = ta.last_atr(dates, closes, highs, lows)

                    ATRWZ = absdis / curATR
                    curClose = closes[-1]
                    ATRRatio = curATR / curClose

                    primCycle = GetPrimaryCycle(tradeCycle)
                    dataprimCycle = ts.get_k_data(code, ktype=primCycle)
                    primCloses = dataprimCycle['close'].values
                    primdates = dataprimCycle['date'].values
                    primlows = dataprimCycle['low'].values

                    primImpScore = FBD.ImpluseScore(primdates, primCloses)
                    tradeImpScore = FBD.ImpluseScore(dates, closes)

                    primmacd = pd.Series(ta.cal_macd(primdates, primCloses))
                    primmacd, primdif, primdea = DP.get_macd_list(primmacd)

                    primdivStatus = ta.macd_in_bulldivergence_signal(
                        primdates, primmacd)

                    primdivscore = primdivStatus['div']

                    if (primdivscore != 0):
                        primdivscore = 1

                    difdeadivscore = 0
                    if (ta.in_loose_bulldivergence(dif, period)):
                        difdeadivscore += 1
                    if (ta.in_loose_bulldivergence(dea, period)):
                        difdeadivscore += 1

                    totalscore = primImpScore + tradeImpScore + primdivscore + divscore + difdeadivscore + macdscore

                    curATR = round(curATR, 2)
                    ATRRatio = round(ATRRatio * 100, 2)

                    ATRWZ = round(ATRWZ, 2)

                    maprice = round(maprice, 2)

                    s = Series([
                        code, name, tradeCycle, period, curClose, maprice,
                        curATR, ATRRatio, ATRWZ, primImpScore, tradeImpScore,
                        primdivscore, divscore, difdeadivscore, macdscore,
                        totalscore
                    ],
                               index=colNames)

                    dfSelected = dfSelected.append(s, ignore_index=True)
            dfSelected = dfSelected.sort_values(by='totalscore',
                                                ascending=False)
            dfSelected = pd.DataFrame(dfSelected.values,
                                      columns=dfSelected.columns)

            if os.path.exists(filepath):
                dfSelected.to_csv(filepath, mode='a', header=None)
            else:
                dfSelected.to_csv(filepath)
def vectorized_falsebreakout_divergence(code='510300',
                                        tradeCycle='D',
                                        recent=5):
    colNames = [
        'code', 'time', 'period', 'curclose', 'sma', 'ATR', 'ATRRatio',
        'rewardratio', 'riskratio', 'targetprice', 'cutshort', 'ATRWZ',
        'rewardrisk', 'primImpScore', 'tradeImpScore', 'valuescore',
        'primdivscore', 'divscore', 'difdeascore', 'macdscore', 'totalscore',
        'targetprice1', 'targetprice2'
    ]

    filename = StrategyName + '-' + code + '-' + tradeCycle
    dfSelected = pd.DataFrame([], columns=colNames)
    RootDir = os.path.join(os.pardir, 'data', 'Vectorized')
    DP.mkdir(RootDir)
    filepath = os.path.join(RootDir, filename + '.xls')

    code = DP.codeType(code)

    dfdata = ts.get_k_data(code, start='2000-01-01',
                           ktype=tradeCycle)  #start = '2016-01-01',
    if (len(dfdata) < 120):  #剔除交易时间少于120天的个股
        print('Not Enough data for decision making.')

    totaldates = dfdata['date'].values
    totalcloses = dfdata['close'].values
    totalhighs = dfdata['high'].values
    totallows = dfdata['low'].values

    macddiclist = ta.cal_macd(totaldates, totalcloses)
    totalmacd, totaldif, totaldea = DP.get_macd_list(macddiclist)
    i = 120

    while i < len(totalcloses):
        closes = totalcloses[:i]
        highs = totalhighs[:i]
        lows = totallows[:i]
        macd = totalmacd[:i]
        dif = totaldif[:i]
        dea = totaldea[:i]

        dates = totaldates[:i]

        if (macd[-1] < macd[-2] or macd[-3] <
                macd[-2]):  #macd[-1]> 0 这个条件由于without right shoulder删除
            i = i + 1
            continue

        divStatus = ta.macd_in_bulldivergence_signal(dates, macd)

        divscore = divStatus['div']
        macdscore = divStatus['macd']
        period = divStatus['period']

        if (divscore != 0 and isPriceNewLow(lows, recent, period, tradeCycle)):
            date = dates[-1]

            absdis, perdis, maprice = ta.curdistosma(closes, 20)
            curATR = ta.last_atr(dates, closes, highs, lows)
            targetprice = maprice + 2 * curATR  #应该是前高更合理

            prelow = min(lows[-recent:])  # 因此此处要求近recent天创period天新低
            cutshort = prelow
            ATRWZ = absdis / curATR
            curClose = closes[-1]
            targetprice2 = curClose + 2 * curATR
            targetprice3 = np.max(closes[-period:])
            ATRRatio = curATR / curClose
            rewardratio = (targetprice - curClose) * 100 / curClose
            riskratio = (curClose - cutshort) * 100 / curClose
            rewardrisk = (targetprice - curClose) / (curClose - cutshort)

            primCycle = GetPrimaryCycle(tradeCycle)
            dataprimCycle = ts.get_k_data(code, ktype=primCycle)
            primCloses = dataprimCycle['close'].values
            primdates = dataprimCycle['date'].values
            primlows = dataprimCycle['low'].values

            primImpScore = ImpluseScore(primdates, primCloses)
            tradeImpScore = ImpluseScore(dates, closes)
            valuescore = value_score(dates, closes)

            primmacd = pd.Series(ta.cal_macd(primdates, primCloses))
            primmacd, primdif, primdea = DP.get_macd_list(primmacd)

            isPrimNewLow = isPriceNewLow(primlows, recent, 30)

            primdivStatus = ta.macd_in_bulldivergence_signal(
                primdates, primmacd)

            primdivscore = primdivStatus['div']

            if (primdivscore != 0 and isPrimNewLow != 0):
                primdivscore = 2
            elif (primdivscore != 0):
                primdivscore = 1

            difdeadivscore = 0
            if (ta.in_loose_bulldivergence(dif, period)):
                difdeadivscore += 1
            if (ta.in_loose_bulldivergence(dea, period)):
                difdeadivscore += 1

            totalscore = primImpScore + tradeImpScore + valuescore + primdivscore + divscore + difdeadivscore + macdscore

            curATR = round(curATR, 2)
            ATRRatio = round(ATRRatio * 100, 2)
            rewardratio = round(rewardratio, 2)
            riskratio = round(riskratio, 2)
            ATRWZ = round(ATRWZ, 2)
            rewardrisk = round(rewardrisk, 2)
            targetprice = round(targetprice, 2)
            maprice = round(maprice, 2)
            s = Series([
                code, date, period, curClose, maprice, curATR, ATRRatio,
                rewardratio, riskratio, targetprice, cutshort, ATRWZ,
                rewardrisk, primImpScore, tradeImpScore, valuescore,
                primdivscore, divscore, difdeadivscore, macdscore, totalscore,
                targetprice2, targetprice3
            ],
                       index=colNames)

            dfSelected = dfSelected.append(s, ignore_index=True)

        i += 1

    #dfSelected = dfSelected.sort_values(by='totalscore',ascending=False)
    dfSelected = pd.DataFrame(dfSelected.values, columns=dfSelected.columns)
    #dfSelected.to_csv(filepath)
    DI.Write_DF_T0_Excel(filepath, dfSelected, 'selected')
    return dfSelected
Пример #3
0
def batch_invaluezone_divergence(dataset='hs300', tradeCycle='D', recent=5):
    lasttradetimestr = DP.get_last_trade_time('D')

    colNames = [
        'code', 'name', 'period', 'curclose', 'sma', 'ATR', 'ATRRatio',
        'rewardrisk', 'primImpScore', 'tradeImpScore', 'primdivscore',
        'divscore', 'difdeascore', 'macdscore', 'totalscore'
    ]

    filename = StrategyName + lasttradetimestr + '-' + dataset + '-' + tradeCycle

    RootDir = os.path.join(os.pardir, 'data', lasttradetimestr)
    DP.mkdir(RootDir)
    filepath = os.path.join(RootDir, filename + '.xls')

    codelist = DI.get_stockcode_list(dataset)

    dfSelected = pd.DataFrame([], columns=colNames)
    dfScreen = codelist[['code', 'name']]
    totalrows = len(dfScreen)

    for i in range(totalrows):
        code = dfScreen.loc[i, 'code']
        code = DP.codeType(code)

        name = dfScreen.loc[i, 'name']
        if (DI.is_tingpai(code)):
            continue

        dfdata = ts.get_k_data(code, ktype=tradeCycle)
        if (len(dfdata) < 120):  #剔除交易时间少于120天的个股
            continue

        dates = dfdata['date'].values
        closes = dfdata['close'].values
        highs = dfdata['high'].values
        lows = dfdata['low'].values
        if (not ta.invaluezone(closes, 10, 20)):
            continue

        macddiclist = ta.cal_macd(dates, closes)
        macd, dif, dea = DP.get_macd_list(macddiclist)

        if (min(macd[-3:]) > 0):
            continue

        divStatus = ta.macd_in_bulldivergence(dates, macd)

        divscore = divStatus['div']
        macdscore = divStatus['macd']
        period = divStatus['period']

        if (divscore != 0):

            print(code, name, divscore, macdscore, period)
            absdis, perdis, maprice = ta.curdistosma(closes, 20)
            curATR = ta.last_atr(dates, closes, highs, lows)

            ATRWZ = absdis / curATR
            curClose = closes[-1]
            ATRRatio = curATR / curClose

            primCycle = GetPrimaryCycle(tradeCycle)
            dataprimCycle = ts.get_k_data(code, ktype=primCycle)
            primCloses = dataprimCycle['close'].values
            primdates = dataprimCycle['date'].values
            primlows = dataprimCycle['low'].values

            primImpScore = FBD.ImpluseScore(primdates, primCloses)
            tradeImpScore = FBD.ImpluseScore(dates, closes)

            primmacd = pd.Series(ta.cal_macd(primdates, primCloses))
            primmacd, primdif, primdea = DP.get_macd_list(primmacd)

            primdivStatus = ta.macd_in_bulldivergence_signal(
                primdates, primmacd)

            primdivscore = primdivStatus['div']

            if (primdivscore != 0):
                primdivscore = 1

            difdeadivscore = 0
            if (ta.in_loose_bulldivergence(dif, period)):
                difdeadivscore += 1
            if (ta.in_loose_bulldivergence(dea, period)):
                difdeadivscore += 1

            totalscore = primImpScore + tradeImpScore + primdivscore + divscore + difdeadivscore + macdscore

            curATR = round(curATR, 2)
            ATRRatio = round(ATRRatio * 100, 2)

            ATRWZ = round(ATRWZ, 2)

            maprice = round(maprice, 2)
            colNames = [
                'code', 'name', 'period', 'curclose', 'sma', 'ATR', 'ATRRatio',
                'ATRWZ', 'primImpScore', 'tradeImpScore', 'primdivscore',
                'divscore', 'difdeascore', 'macdscore', 'totalscore'
            ]
            s = Series([
                code, name, period, curClose, maprice, curATR, ATRRatio, ATRWZ,
                primImpScore, tradeImpScore, primdivscore, divscore,
                difdeadivscore, macdscore, totalscore
            ],
                       index=colNames)

            dfSelected = dfSelected.append(s, ignore_index=True)
    dfSelected = dfSelected.sort_values(by='totalscore', ascending=False)
    dfSelected = pd.DataFrame(dfSelected.values, columns=dfSelected.columns)

    DI.Write_DF_T0_Excel(filepath, dfSelected, 'selected')
def batch_falsebreakout_divergence(dataset='hs300', tradeCycle='D', recent=3):
    lasttradetimestr = DP.get_last_trade_time('D')
    '''
    colNames = ['code', 'time', 'period', 'curclose', 'sma', 'ATR', 'ATRRatio', 'rewardratio',
                'riskratio', 'targetprice', 'cutshort', 'ATRWZ', 'rewardrisk', 'primImpScore',
                'tradeImpScore', 'valuescore', 'primdivscore', 'divscore', 'difdeascore', 'macdscore',
                'totalscore','targetprice1','targetprice2']
    '''
    colNames = [
        'code', 'name', 'time', 'period', 'curclose', 'sma', 'ATR', 'ATRRatio',
        'rewardratio', 'riskratio', 'targetprice', 'cutshort', 'ATRWZ',
        'rewardrisk', 'primImpScore', 'tradeImpScore', 'valuescore',
        'primdivscore', 'divscore', 'difdeascore', 'macdscore', 'totalscore',
        'targetprice2', 'targetprice3'
    ]
    filename = StrategyName + lasttradetimestr + '-' + dataset + '-' + tradeCycle

    RootDir = os.path.join(os.pardir, 'data', lasttradetimestr)
    DP.mkdir(RootDir)
    filepath = os.path.join(RootDir, filename + '.xls')

    codelist = DI.get_stockcode_list(dataset)

    dfSelected = pd.DataFrame([], columns=colNames)
    dfScreen = codelist[['code', 'name']]
    totalrows = len(dfScreen)

    for i in range(totalrows):

        code = dfScreen.loc[i, 'code']
        code = DP.codeType(code)

        name = dfScreen.loc[i, 'name']
        if (DI.is_tingpai(code)):
            continue

        dfdata = ts.get_k_data(code, ktype=tradeCycle)
        if (len(dfdata) < 120):  #剔除交易时间少于120天的个股
            continue
        dates = dfdata['date'].values
        closes = dfdata['close'].values
        highs = dfdata['high'].values
        lows = dfdata['low'].values

        macddiclist = ta.cal_macd(dates, closes)
        macd, dif, dea = DP.get_macd_list(macddiclist)

        if (not (macd[-2] < 0 and macd[-2] < macd[-1]
                 and macd[-2] < macd[-3])):
            continue

        if (code in dfSelected['code'].values):
            continue

        divStatus = ta.macd_in_bulldivergence_signal(dates, macd)

        divscore = divStatus['div']
        macdscore = divStatus['macd']
        period = divStatus['period']

        if (divscore != 0 and isPriceNewLow(lows, recent, period)):

            absdis, perdis, maprice = ta.curdistosma(closes, 20)
            curATR = ta.last_atr(dates, closes, highs, lows)
            targetprice = maprice + 2 * curATR
            prelow = min(lows[-recent:])  #因此此处要求近recent天创period天新低

            ATRWZ = absdis / curATR
            curClose = closes[-1]
            #cutshort = min(prelow, curClose - curATR)
            cutshort = prelow
            ATRRatio = curATR / curClose
            #rewardratio = (targetprice-curClose)*100/curClose
            riskratio = (curClose - cutshort) * 100 / curClose
            #rewardrisk = (targetprice-curClose)/(curClose-cutshort)

            primCycle = GetPrimaryCycle(tradeCycle)
            dataprimCycle = ts.get_k_data(code, ktype=primCycle)
            primCloses = dataprimCycle['close'].values
            primdates = dataprimCycle['date'].values
            primlows = dataprimCycle['low'].values

            primImpScore = ImpluseScore(primdates, primCloses)
            tradeImpScore = ImpluseScore(dates, closes)
            valuescore = value_score(dates, closes)

            primmacd = pd.Series(ta.cal_macd(primdates, primCloses))
            primmacd, primdif, primdea = DP.get_macd_list(primmacd)

            isPrimNewLow = isPriceNewLow(primlows, recent, 30)

            primdivStatus = ta.macd_in_bulldivergence_signal(
                primdates, primmacd)

            primdivscore = primdivStatus['div']

            if (primdivscore != 0 and isPrimNewLow != 0):
                primdivscore = 2
            elif (primdivscore != 0):
                primdivscore = 1

            difdeadivscore = 0
            if (ta.in_loose_bulldivergence(dif, period)):
                difdeadivscore += 1
            if (ta.in_loose_bulldivergence(dea, period)):
                difdeadivscore += 1

            totalscore = primImpScore + tradeImpScore + valuescore + primdivscore + divscore + difdeadivscore + macdscore

            curATR = round(curATR, 4)
            targetprice2 = curClose + 2 * curATR
            targetprice3 = np.max(closes[-period:])

            target = np.min(
                [float(targetprice),
                 float(targetprice2),
                 float(targetprice3)])
            rewardratio = (target - curClose) * 100 / curClose

            rewardrisk = (target - curClose) / (curClose - cutshort)

            ATRRatio = round(ATRRatio * 100, 3)
            rewardratio = round(rewardratio, 3)
            riskratio = round(riskratio, 3)
            ATRWZ = round(ATRWZ, 3)
            rewardrisk = round(rewardrisk, 3)
            targetprice = round(targetprice, 3)
            maprice = round(maprice, 3)
            cutshort = round(cutshort, 3)
            import datetime
            curtime = datetime.datetime.now()

            selectedcolNames = [
                'ATR', 'ATRRatio', 'code', 'name', 'time', 'curclose',
                'cutshort', 'rewardratio', 'riskratio', 'rewardrisk', 'sma',
                'targetprice', 'targetprice2', 'targetprice3'
            ]

            print(curATR, ATRRatio, code, tradeCycle, name, curtime, curClose,
                  cutshort, rewardratio, riskratio, rewardrisk, maprice,
                  targetprice, targetprice2, targetprice3)

            s = Series([
                code, name, curtime, period, curClose, maprice, curATR,
                ATRRatio, rewardratio, riskratio, targetprice, cutshort, ATRWZ,
                rewardrisk, primImpScore, tradeImpScore, valuescore,
                primdivscore, divscore, difdeadivscore, macdscore, totalscore,
                targetprice2, targetprice3
            ],
                       index=colNames)
            dfSelected = dfSelected.append(s, ignore_index=True)
            dfSelected = dfSelected[selectedcolNames]
    dfSelected = dfSelected.sort_values(by='time', ascending=False)
    dfSelected = pd.DataFrame(dfSelected.values, columns=dfSelected.columns)

    if (not os.path.exists(filepath)):
        DI.Write_DF_T0_Excel(filepath, dfSelected, 'selected')
    else:
        dftotal = DI.Get_TrdData_FromExcel(filepath, 'selected')
        dftotal = pd.concat([dftotal, dfSelected])
        DI.Write_DF_T0_Excel(filepath, dftotal, 'selected')