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
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
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']
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!