def smaexit(df,smaperiod,cycle):
    for i in range(len(df)):
        code = DP.codeType(df.loc[i, 'code'])
        curclose = df.loc[i, 'curclose']
        startdate = df.loc[i, 'time']
        tradata = ts.get_k_data(code, ktype=cycle)

        tradata = pd.DataFrame(tradata.values, columns=tradata.columns)

        posindex =list(tradata['date']).index(startdate)
        closes = tradata['close']
        posindex += 1
        while(posindex < len(closes)):
            posclose = tradata.loc[posindex,'close']
            possmaprice = sum(closes[posindex-smaperiod+1:posindex+1])/smaperiod
            if(posclose < possmaprice):
                exitprice = posclose
                exitdate = tradata.loc[posindex, 'date']
                exitreturn = (exitprice - curclose) * 100 / curclose
                break
            posindex += 1
        if(posindex == len(closes)):
            exitprice = posclose
            exitdate = tradata.loc[posindex-1, 'date']
            exitreturn = (exitprice - curclose) * 100 / curclose
        df.loc[i,'exitdate']  = exitdate
        df.loc[i,'exitprice'] = exitprice
        df.loc[i,'exitreturn'] = exitreturn
    return df
def batch_position(codelist, period=240, value='position', Cycle='D'):
    colNames = ['code', 'name', 'position', 'curup', 'curdown']
    dfPosition = DataFrame([], columns=colNames)
    index_date = DP.get_last_trade_time()

    for code, name in zip(codelist['code'], codelist['name']):
        code = DP.codeType(code)
        print(code)
        if (DI.is_tingpai(code)):
            continue
        df = ts.get_k_data(code, ktype=Cycle)
        if (len(df) == 0):
            continue
        closes = df['close'].values
        last_date = df.loc[len(df) - 1, 'date']
        if (len(df) < period or last_date != index_date):
            continue

        closes = closes[-period:]

        position, curup, curdown = position_in_period(closes)
        s = Series([code, name, position, curup, curdown], index=colNames)
        dfPosition = dfPosition.append(s, ignore_index=True)
    dfPosition = dfPosition.sort_values(by=value, ascending=True)
    dfPosition = DataFrame(dfPosition.values, columns=dfPosition.columns)
    return dfPosition
def batch_vectorized_divergence(dataset='hs300', cycle='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'
    ]
    codelist = DI.get_stockcode_list(dataset)

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

        name = dfScreen.loc[i, 'name']
        dfsub = vectorized_falsebreakout_divergence(code, cycle)
        dfsub['name'] = name
        dftotal = pd.concat([dftotal, dfsub])
    RootDir = os.path.join(os.pardir, 'data', 'Vectorized', StrategyName)
    if (not os.path.exists(RootDir)):
        DP.mkdir(RootDir)
    filename = dataset + 'whole' + cycle + '.xls'
    filepath = os.path.join(RootDir, filename)
    dftotal = dftotal.sort_values(by='time')
    dftotal = DataFrame(dftotal.values, columns=dftotal.columns)
    dftotal = Performance.vectorized_forward_return(dftotal, cycle)
    DI.Write_DF_T0_Excel(filepath, dftotal, 'selected')
def get_stock_basic_parameters(code, Cycle='D', period=480):
    '''
    :param code:股票代码
    :param Cycle: 分析周期
    :param period: 分析的时间周期
    :return:返回指标列表:
    ['EMADir','SMADir','MACDDir','SMALight','EMALight','valuerel','ATRWz','ATRRatio',
    'oneATR','twoATR','threeATR','moneATR','mtwoATR','mthreeATR','position','curup',
    'curdown']
    '''
    code = DP.codeType(code)
    print(code)
    dfdata = ts.get_k_data(code, ktype=Cycle)
    if (len(dfdata) < 60):
        return None
    closes = dfdata['close'].values
    dates = dfdata['date'].values
    EMADir = ta.EMA_Direction(dates, closes)
    SMADir = ta.SMA_Direction(dates, closes)
    MACDDir = ta.MACD_Direction(dates, closes)
    SMALight = Triple.ImpluseLight(SMADir, MACDDir)
    EMALight = Triple.ImpluseLight(EMADir, MACDDir)

    valuerel = ta.SMAValueZone_GX(dates, closes)

    highs = dfdata['high'].values
    lows = dfdata['low'].values
    curatr = ta.last_atr(dates, closes, highs, lows)
    absdis, perdis, maprice = ta.curdistosma(closes, 20)
    ATRWz = absdis / curatr
    ATRRatio = absdis / maprice
    oneATR = maprice + curatr
    twoATR = maprice + 2 * curatr
    threeATR = maprice + 3 * curatr
    moneATR = maprice - curatr
    mtwoATR = maprice - 2 * curatr
    mthreeATR = maprice - 3 * curatr

    if (len(closes) > period):
        closes = closes[-period:]
    position, curup, curdown = Statistical.position_in_period(closes)

    valuelist = [
        EMADir, SMADir, MACDDir, SMALight, EMALight, valuerel, ATRWz, ATRRatio,
        oneATR, twoATR, threeATR, moneATR, mtwoATR, mthreeATR, position, curup,
        curdown
    ]
    namelist = [
        'EMADir', 'SMADir', 'MACDDir', 'SMALight', 'EMALight', 'valuerel',
        'ATRWz', 'ATRRatio', 'oneATR', 'twoATR', 'threeATR', 'moneATR',
        'mtwoATR', 'mthreeATR', 'position', 'curup', 'curdown'
    ]
    colnames = []
    for ele in namelist:
        name = Cycle + '-' + ele
        colnames.append(name)
    s = pd.Series(valuelist, index=colnames)
    return s
def vectorized_forward_return(df,cycle):
    forperiods = [1, 3, 5, 10, 15]
    for i in range(len(df)):
        code = DP.codeType(df.loc[i,'code'])
        curclose = df.loc[i,'curclose']
        startdate = df.loc[i,'time']
        tradata = ts.get_k_data(code,start=startdate,ktype=cycle)

        tradata = pd.DataFrame(tradata.values,columns=tradata.columns)

        closes = tradata['close']

        for period in forperiods:

            if (period < len(closes)):
                forclose = closes[period]
                forreturn = (forclose - curclose) * 100 / curclose
            else:
                forclose = None
                forreturn = None
            df.loc[i,'close'+str(period)] = forclose
            df.loc[i, 'return' + str(period)] = forreturn
    return df
Exemple #6
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 screener2():
    totalrows = len(dfScreen)
    for index in range(totalrows):

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

        df_trade = ts.get_k_data(code=stockcode, ktype=tradecycle)

        dates = df_trade['date']
        closes = df_trade['close']
        lows = df_trade['low']

        sma5 = ta.cal_sma(dates, closes, 5)
        sma5 = Series(sma5)

        macd = ta.cal_macd(dates, closes)
        macd = macd[len(macd) - len(sma5):]
        macd = Series(macd)

        sma5 = sma5[len(macd) - len(sma5):]
        sma5 = Series(sma5)

        df_trade = df_trade[len(df_trade) - len(sma5):]

        df_trade = DataFrame(df_trade.values, columns=df_trade.columns)
        df_trade['sma5'] = sma5
        df_trade['macd'] = macd

        totalrows = len(df_trade)
        i = 5
        while (i < totalrows):

            if (df_trade.loc[i, 'close'] > df_trade.loc[i, 'sma5']['sma5']
                    and df_trade.loc[i - 1,
                                     'close'] < df_trade.loc[i, 'sma5']['sma5']
                    and df_trade.loc[i, 'macd']['diff'] >
                    df_trade.loc[i, 'macd']['dea']):
                j = i
                while (j > 0):
                    if df_trade.loc[j, 'macd']['diff'] < df_trade.loc[
                            j, 'macd']['dea']:
                        break
                    j -= 1
                closesslice = closes[j:i]

                if (len(closesslice) < 8):
                    i += 1
                    continue
                print(closesslice)
                k = np.argmax(closesslice)

                print('here')
                print(j, k, i)
                if (min(closesslice[j:k]) < min(closesslice[k:i])):
                    date = df_trade.loc[i, 'date'][:10]

                    df_prim = ts.get_k_data(code=stockcode,
                                            ktype=primarycycle,
                                            start='2000-01-01',
                                            end=date)

                    primcloses = df_prim['close'][-5:]

                    primclose = primcloses.values[-1]
                    primsma5 = np.average(primcloses)

                    primmacd = ta.cal_macd(dates, closes)
                    primdiff = primmacd[len(primmacd) - 1]['diff']
                    primdea = primmacd[len(primmacd) - 1]['dea']
                    if (primclose > primsma5 and primdiff > primdea):
                        #print(df_trade.loc[i, 'date'])

                        curlows = lows[:i]
                        curdates = dates[:i]

                        difenxinglist = ta.get_pre_difenxing(
                            curdates, curlows, 4)
                        #print(difenxinglist)

                        if (len(difenxinglist) < 4):
                            continue
                        # difenxinglist[0]['low'] < difenxinglist[1]['low'] and
                        else:
                            if (difenxinglist[1]['low'] <
                                    difenxinglist[2]['low']
                                    and difenxinglist[2]['low'] <
                                    difenxinglist[3]['low']):
                                print(stockcode, df_trade.loc[i, 'date'])
            i += 1
Exemple #8
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 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
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')
Exemple #11
0
def vectorized_smabreak_divergence(code='510300', tradeCycle='D'):
    colNames = [
        'time', 'code', 'curclose', 'sma', 'ATR', 'ATRRatio', 'ATRWZ',
        'tradeImpScore', 'primImpScore'
    ]

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

    filepath = os.path.join(RootDir, filename + '.xls')

    code = DP.codeType(code)
    startdate = '2000-01-01'
    dfdata = ts.get_k_data(code, start=startdate, end='', ktype=tradeCycle)
    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]
        dates = totaldates[:i]
        if (not ta.smaupcrosssignal(closes, 20)):
            i += 1
            continue
        primCycle = GetPrimaryCycle(tradeCycle)
        if (stock_in_divergece(code,
                               primCycle,
                               startdate=startdate,
                               enddate=dates[-1])):

            absdis, perdis, maprice = ta.curdistosma(closes, 20)
            curATR = ta.last_atr(dates, closes, highs, lows)

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

            tradeImpScore = FBD.ImpluseScore(dates, closes)

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

            ATRWZ = round(ATRWZ, 2)

            maprice = round(maprice, 2)

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

            primImpScore = FBD.ImpluseScore(primdates, primCloses)

            s = Series([
                dates[-1], code, curClose, maprice, curATR, ATRRatio, ATRWZ,
                tradeImpScore, primImpScore
            ],
                       index=colNames)

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

            pass
        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