Example #1
0
def getMAMid(MA_Short, MA_Mid, symbol, K_MIN, indexoffset=0):
    #计算ma以及ma_cross
    bardata = pd.read_csv(DC.BAR_DATA_PATH + symbol + '\\' + symbol + ' ' +
                          str(K_MIN) + '.csv')
    madf = pd.DataFrame({'close': bardata.close})
    madf['utc_time'] = bardata['utc_time']
    madf['strtime'] = bardata['strtime']
    madf['index'] = bardata['Unnamed: 0'] - indexoffset
    #madf['MA_Short'] = MA.calMA(madf['close'], MA_Short)
    madf['MA_Mid'] = MA.calMA(madf['close'], MA_Mid)
    madf['MA_True'], madf['MA_Cross'] = MA.dfCross(madf, 'close', 'MA_Mid')
    #madf.to_csv("mamid.csv")
    return madf
Example #2
0
def BOLL(df, N=26, M=26, P=2):
    print 'start computing DMI'
    mid = MA.calMA(df['close'], N)
    tmp2 = pd.rolling_std(df['close'], M)
    TOP = mid + P * tmp2
    BOTTOM = mid - P * tmp2
    df1 = pd.DataFrame({
        'close': df['close'],
        'MID': mid,
        'TOP': TOP,
        'BOTTOM': BOTTOM
    })
    print 'DMI compute finished'
    return df1
Example #3
0
def calDMI(df, N=14, M=6):
    high = df.high
    low = df.low
    close = df.close
    closeshift1 = close.shift(1).fillna(0)
    open = df.open
    c = high - low
    d = high - closeshift1
    df1 = pd.DataFrame({'c': c, 'd': d})
    df1['A'] = df1.max(axis=1)
    df1.drop('c', axis=1, inplace=True)
    df1.drop('d', axis=1, inplace=True)
    df1['B'] = np.abs(low - closeshift1)
    df1['C'] = df1.max(axis=1)

    # df1.drop('A',axis=1,inplace=True)
    # df1.drop('B',axis=1,inplace=True)

    df1['TR'] = df1['C'].rolling(N).sum()
    # 2、HD=最高价-昨日最高价
    # 3、LD=昨日最低价-最低价
    HD = high - high.shift(1).fillna(0)
    LD = low.shift(1).fillna(0) - low
    df1['HD'] = HD
    df1['LD'] = LD
    # DMP:= SUM(IFELSE(HD>0 && HD>LD,HD,0),N);
    # DMM:= SUM(IFELSE(LD>0 && LD>HD,LD,0),N);
    df2 = pd.DataFrame({'HD': HD, 'LD': LD})
    df2['DMP_1'] = df2[(df2['HD'] > df2['LD']) & (df2['HD'] > 0)]['HD']
    df2['DMM_1'] = df2[(df2['LD'] > df2['HD']) & (df2['LD'] > 0)]['LD']
    df2 = df2.fillna(0)
    df1['DMP'] = df2['DMP_1'].rolling(N).sum()
    df1['DMM'] = df2['DMM_1'].rolling(N).sum()
    del df2
    # 6、PDI=DMP*100/TR
    # 7、MDI=DMM*100/TR
    df1['PDI'] = df1['DMP'] * 100 / df1['TR']
    df1['MDI'] = df1['DMM'] * 100 / df1['TR']
    # ADX: MA(ABS(MDI-PDI)/(MDI+PDI)*100,M);
    # ADXR:(ADX+REF(ADX,M))/2;
    df1['ADX'] = MA.calMA(
        np.abs(df1['MDI'] - df1['PDI']) / (df1['MDI'] + df1['PDI']) * 100, M)
    df1['ADXR'] = (df1['ADX'] + df1['ADX'].shift(M).fillna(0)) / 2

    return df1['PDI'], df1['MDI'], df1['ADX'], df1['ADXR']
Example #4
0
def Lvyi3MAWin(symbolinfo, rawdata, paraset):
    setname = paraset['Setname']
    MA_Short = paraset['MA_Short']
    MA_Mid = paraset['MA_Mid']
    MA_Long = paraset['MA_Long']
    rawdata['Unnamed: 0'] = range(rawdata.shape[0])
    beginindex = rawdata.ix[0, 'Unnamed: 0']

    #df_MA = MA.MA(rawdata['close'], MA_Short, MA_Mid)
    #df_MA.drop('close', axis=1, inplace=True)
    #df = pd.concat([rawdata, df_MA], axis=1)
    df = rawdata
    df['MA_Short'] = MA.calMA(df['close'],MA_Short)
    df['MA_Mid'] = MA.calMA(df['close'],MA_Mid)
    df['MA_Long'] = MA.calMA(df['close'],MA_Long)
    df['MA_True'],df['MA_Cross'] = MA.dfCross(df,'MA_Short','MA_Mid')

    # 找出买卖点:
    # 1.先找出MA金叉的买卖点
    # 2.找到结合判决条件的买点
    # 3.从MA买点中滤出真实买卖点
    # 取出金叉点
    goldcrosslist = pd.DataFrame({'goldcrosstime': df.loc[df['MA_Cross'] == 1, 'strtime']})
    goldcrosslist['goldcrossutc'] = df.loc[df['MA_Cross'] == 1, 'utc_time']
    goldcrosslist['goldcrossindex'] = df.loc[df['MA_Cross'] == 1, 'Unnamed: 0'] - beginindex
    goldcrosslist['goldcrossprice'] = df.loc[df['MA_Cross'] == 1, 'close']

    # 取出死叉点
    deathcrosslist = pd.DataFrame({'deathcrosstime': df.loc[df['MA_Cross'] == -1, 'strtime']})
    deathcrosslist['deathcrossutc'] = df.loc[df['MA_Cross'] == -1, 'utc_time']
    deathcrosslist['deathcrossindex'] = df.loc[df['MA_Cross'] == -1, 'Unnamed: 0'] - beginindex
    deathcrosslist['deathcrossprice'] = df.loc[df['MA_Cross'] == -1, 'close']
    goldcrosslist = goldcrosslist.reset_index(drop=True)
    deathcrosslist = deathcrosslist.reset_index(drop=True)

    # 生成多仓序列(金叉在前,死叉在后)
    if goldcrosslist.ix[0, 'goldcrossindex'] < deathcrosslist.ix[0, 'deathcrossindex']:
        longcrosslist = pd.concat([goldcrosslist, deathcrosslist], axis=1)
    else:  # 如果第一个死叉的序号在金叉前,则要将死叉往上移1格
        longcrosslist = pd.concat([goldcrosslist, deathcrosslist.shift(-1)], axis=1)
    longcrosslist = longcrosslist.set_index(pd.Index(longcrosslist['goldcrossindex']), drop=True)

    # 生成空仓序列(死叉在前,金叉在后)
    if deathcrosslist.ix[0, 'deathcrossindex'] < goldcrosslist.ix[0, 'goldcrossindex']:
        shortcrosslist = pd.concat([deathcrosslist, goldcrosslist], axis=1)
    else:  # 如果第一个金叉的序号在死叉前,则要将金叉往上移1格
        shortcrosslist = pd.concat([deathcrosslist, goldcrosslist.shift(-1)], axis=1)
    shortcrosslist = shortcrosslist.set_index(pd.Index(shortcrosslist['deathcrossindex']), drop=True)

    # 取出开多序号和开空序号
    openlongindex = df.loc[(df['MA_Cross'] == 1) & (df['MA_Short'] >= df['MA_Long']) & (df['MA_Mid'] >= df['MA_Long'])].index
    openshortindex = df.loc[(df['MA_Cross'] == -1) & (df['MA_Short'] <= df['MA_Long']) & (df['MA_Mid'] <= df['MA_Long'])].index

    # 从多仓序列中取出开多序号的内容,即为开多操作
    longopr = longcrosslist.loc[openlongindex]
    longopr['tradetype'] = 1
    longopr.rename(columns={'goldcrosstime': 'opentime',
                            'goldcrossutc': 'openutc',
                            'goldcrossindex': 'openindex',
                            'goldcrossprice': 'openprice',
                            'deathcrosstime': 'closetime',
                            'deathcrossutc': 'closeutc',
                            'deathcrossindex': 'closeindex',
                            'deathcrossprice': 'closeprice'}, inplace=True)

    # 从空仓序列中取出开空序号的内容,即为开空操作
    shortopr = shortcrosslist.loc[openshortindex]
    shortopr['tradetype'] = -1
    shortopr.rename(columns={'deathcrosstime': 'opentime',
                             'deathcrossutc': 'openutc',
                             'deathcrossindex': 'openindex',
                             'deathcrossprice': 'openprice',
                             'goldcrosstime': 'closetime',
                             'goldcrossutc': 'closeutc',
                             'goldcrossindex': 'closeindex',
                             'goldcrossprice': 'closeprice'}, inplace=True)

    # 结果分析
    result = pd.concat([longopr, shortopr])
    result = result.sort_index()
    result = result.reset_index(drop=True)
    #result.drop(result.shape[0] - 1, inplace=True)
    result = result.dropna()
    # 去掉跨合约的操作
    # 使用单合约,不用再去掉跨合约
    #result = removeContractSwap(result, contractswaplist)

    slip = symbolinfo.getSlip()

    result['ret'] = ((result['closeprice'] - result['openprice']) * result['tradetype']) - slip
    result['ret_r'] = result['ret'] / result['openprice']
    results = {}

    '''
    # 使用单合约,策略核心内不再计算结果
    if calcResult:
        result['commission_fee'], result['per earn'], result['own cash'], result['hands'] = RS.calcResult(result,
                                                                                                          symbolinfo,
                                                                                                          initialCash,
                                                                                                          positionRatio)
    
        endcash = result['own cash'].iloc[-1]
        Annual = RS.annual_return(result)
        Sharpe = RS.sharpe_ratio(result)
        DrawBack = RS.max_drawback(result)[0]
        SR = RS.success_rate(result)
        max_single_loss_rate = abs(result['ret_r'].min())

        results = {
            'Setname':setname,
            'opentimes': result.shape[0],
            'end_cash': endcash,
            'SR': SR,
            'Annual': Annual,
            'Sharpe': Sharpe,
            'DrawBack': DrawBack,
            'max_single_loss_rate': max_single_loss_rate
        }
    closeopr = result.loc[:, 'closetime':'tradetype']
    return result, df, closeopr, results
    '''
    return result
    #准备画布
    _xlength = 8
    _ylength = 4
    _Fig = plt.figure(figsize=(_xlength, _ylength),
                      dpi=200,
                      facecolor=PlotLib.__color_pink__,
                      edgecolor=PlotLib.__color_navy__,
                      linewidth=1.0)  # Figure 对象
    axes = _Fig.add_axes([0.1, 0.1, 0.8, 0.8], facecolor='black')

    bardata = DC.getBarData(symbol,
                            K_MIN,
                            starttime=starttime,
                            endtime=endtime)
    bardata['ms'] = MA.calMA(bardata['close'], ms)
    bardata['mm'] = MA.calMA(bardata['close'], mm)
    bardata['ml'] = MA.calMA(bardata['close'], ml)

    for w in range(1, len(weeklist)):
        weekstart = weeklist[w - 1]
        weekend = weeklist[w]
        weekstartutc = float(
            time.mktime(
                time.strptime(weekstart + ' 00:00:00', "%Y-%m-%d %H:%M:%S")))
        weekendutc = float(
            time.mktime(
                time.strptime(weekend + ' 00:00:00', "%Y-%m-%d %H:%M:%S")))
        weekbar = bardata.loc[(bardata['utc_time'] >= weekstartutc)
                              & (bardata['utc_time'] < weekendutc)]
        #这里没有reset_index!