# DMA指标事件策略复现 **Published by:** [不确定性守恒](https://paragraph.com/@uniswapv6/) **Published on:** 2022-06-10 **URL:** https://paragraph.com/@uniswapv6/dma ## Content https://bbs.quantclass.cn/thread/12369一、指标说明二、策略代码2.1、指标计算def calculate(df, parameters, **kwargs): """ 计算单个币种的因子 这边坚决不能进行去重或者删除空值等删除某行的操作 :param df: 需要计算的币种数据 :param parameters: 参数 :param kwargs: 额外的参数 :return: """ N1,N2=parameters DMA=df['close'].rolling(window=N1).mean()-df['close'].rolling(window=N2).mean() df['{}_{}'.format(factor_name, parameters)]=DMA df['{}MA_{}'.format(factor_name,parameters)]=DMA.rolling(window=N1).mean() return df 2.2、遍历代码def batch_parameters(): """ 生成遍历的参数 :return: """ listp = [2, 3, 5, 9, 14, 23, 36, 57, 93] while len(listp)<20: _par=int(listp[-1]/0.8) listp.append(_par) parameters_list = [] for short in listp: for long in listp: if short < long: parameters_list.append([short, long]) return parameters_list 2.3、事件定义当DMA值上穿其移动平均线时买入def event_strategy(df, params, **kwargs): """ 计算事件 :param df: 数据 :param params: :return: """ event_name = '{}_{}'.format(strategy_name,params) # 策略名称 #-----long------------- #条件1,DMA上穿其均线,买入 con1=df['DMA_{}'.format(params)]>df['DMAMA_{}'.format(params)] #条件2,上一周期,DMA在均线下 #短线对应SMI df['DMA_shift_{}'.format(params)] = df.groupby('symbol')['DMA_{}'.format(params)].shift() #长线对应SMIMA df['DMAMA_shift_{}'.format(params)] = df.groupby('symbol')['DMAMA_{}'.format(params)].shift() con2=df['DMA_shift_{}'.format(params)] < df['DMAMA_shift_{}'.format(params)] df.loc[con1 & con2, event_name] = 1 return df 三、回测结果(收益回撤比Top3)3.1、TOP1资金曲线3.2、收益回撤比事件频率3.3、回测评价3.4、最优结果每年表现3.5、TOP1盈利最多三笔交易3.6、TOP1亏损最多三笔交易四、遍历结果(收益回撤比前十)五、附件内容1、指标计算代码import pandas as pd factor_name = 'DMA' def special_data(candle_df, symbol, agg_dict, **kwargs): """ 导入额外的数据 :param candle_df: 基础数据 :param symbol: 币种名 :param agg_dict: 转换周期的字典 :return: """ return candle_df, agg_dict def batch_parameters(): """ 生成遍历的参数 :return: """ listp = [2, 3, 5, 8, 13, 21, 34, 55, 89] while len(listp)<20: _par=int(listp[-1]/0.8) listp.append(_par) parameters_list = [] for short in listp: for long in listp: if short < long: parameters_list.append([short, long]) return parameters_list def calculate(df, parameters, **kwargs): """ 计算单个币种的因子 这边坚决不能进行去重或者删除空值等删除某行的操作 :param df: 需要计算的币种数据 :param parameters: 参数 :param kwargs: 额外的参数 :return: """ N1,N2=parameters DMA=df['close'].rolling(window=N1).mean()-df['close'].rolling(window=N2).mean() df['{}_{}'.format(factor_name, parameters)]=DMA df['{}MA_{}'.format(factor_name,parameters)]=DMA.rolling(window=N1).mean() return df def cross_section_calculate(df, parameters, **kwargs): """ 计算截面因子的函数 :param df: 所有币种的数据 :param parameters: 参数 :param kwargs: 额外的参数 :return: """ df['{}_{}_排名' .format (factor_name, parameters)] = df.groupby('candle_begin_time')['{}_{}'.format(factor_name,parameters)].rank(ascending=False, method='first') return df 2、事件生成代码# 事件需要的因子 factors = ['DMA'] # 事件的名称名 strategy_name = 'DMA&event' # 名称和程序文件名相同,不能含有_ def batch_parameters(): """ 生成遍历的参数 :return: """ listp = [2, 3, 5, 8, 13, 21, 34, 55, 89] while len(listp)<20: _par = int(listp[-1]/0.8) listp.append(_par) parameters_list = [] for short in listp: for long in listp: if short < long: parameters_list.append([short, long]) return parameters_list def event_strategy(df, params, **kwargs): """ 计算事件 :param df: 数据 :param params: :return: """ event_name = '{}_{}'.format(strategy_name,params) # 策略名称 #-----long------------- #条件1,DMA上穿其均线,买入 con1=df['DMA_{}'.format(params)]>df['DMAMA_{}'.format(params)] #条件2,上一周期,DMA在均线下 #短线对应SMI df['DMA_shift_{}'.format(params)] = df.groupby('symbol')['DMA_{}'.format(params)].shift() #长线对应SMIMA df['DMAMA_shift_{}'.format(params)] = df.groupby('symbol')['DMAMA_{}'.format(params)].shift() con2=df['DMA_shift_{}'.format(params)] < df['DMAMA_shift_{}'.format(params)] df.loc[con1 & con2, event_name] = 1 return df 3、遍历回测结果https://bbs.quantclass.cn/thread/12369 https://bbs.quantclass.cn/thread/12369 ## Publication Information - [不确定性守恒](https://paragraph.com/@uniswapv6/): Publication homepage - [All Posts](https://paragraph.com/@uniswapv6/): More posts from this publication - [RSS Feed](https://api.paragraph.com/blogs/rss/@uniswapv6): Subscribe to updates