【Quant102】 经典技术指标 Pandas 实现(第一部分)(1)https://developer.aliyun.com/article/1524456
MACD 指标
假设你是个高级程序员和量化研究员,编写函数实现 MACD 指标。函数接受数据帧
df
,inplace
参数控制是否原地更新df
。df
包含四个列:open
开盘价、high
最高价、low
最低价和close
收盘价。所有指标都应当保存到df
中,最后返回df
。
def macd(df, dea_col='dea', dif_col='dif', hist_col='macd_hist', fast_window=12, slow_window=26, signal_window=9, inplace=False): """ 计算MACD指标,并更新DataFrame。 参数: df : DataFrame 包含价格数据的DataFrame,必须包含'open', 'high', 'low', 'close'列。 fast_window : int, optional 快速EMA的窗口大小,默认为12。 slow_window : int, optional 慢速EMA的窗口大小,默认为26。 signal_window : int, optional 信号线的窗口大小,默认为9。 inplace : bool, optional 是否在原地更新DataFrame,默认为False。 返回: df : DataFrame 包含MACD指标的新DataFrame(如果inplace为False)。 """ # 复制DataFrame以避免修改原始数据 if not inplace: df = df.copy() # 计算快速EMA fast_ema = df['close'].ewm(span=fast_window, adjust=False).mean() # 计算慢速EMA slow_ema = df['close'].ewm(span=slow_window, adjust=False).mean() # 计算MACD线 df[dea_col] = fast_ema - slow_ema # 计算信号线 df[dif_col] = df[dea_col].ewm(span=signal_window, adjust=False).mean() # 计算MACD柱 df[hist_col] = df[dea_col] - df[dif_col] return df
MACD 策略
假设你是个高级程序员和量化研究员,编写函数实现MACD策略。函数接受数据帧
df
,DEA列名称dea_col
,DIF列名称dif_col
,柱状图列名称hist_col
,inplace
参数控制是否原地更新df
。买卖信号应保存在signal
列中。最后返回df
。
def macd_strategy(df, dea_col='dea', dif_col='dif', hist_col='macd_hist', inplace=False): """ 实现MACD策略,生成买卖信号。 参数: df : DataFrame 包含MACD指标数据的DataFrame,必须包含'dea_col', 'dif_col', 'hist_col'列。 dea_col : str DEA(信号线)的列名。 dif_col : str DIF(MACD线)的列名。 hist_col : str MACD柱状图的列名。 inplace : bool, optional 是否在原地更新DataFrame,默认为False。 返回: df : DataFrame 原始DataFrame,增加了一个名为'signal'的列,包含买卖信号。 """ # 复制DataFrame以避免修改原始数据 if not inplace: df = df.copy() # 初始化信号列,默认为无操作 df['signal'] = 0 # 产生买入信号:DIF上穿DEA df.loc[(df[dif_col] > df[dea_col]) & (df[dif_col].shift(1) <= df[dea_col].shift(1)), 'signal'] = 1 # 产生卖出信号:DIF下穿DEA df.loc[(df[dif_col] < df[dea_col]) & (df[dif_col].shift(1) >= df[dea_col].shift(1)), 'signal'] = -1 return df
RSI 指标
假设你是个高级程序员和量化研究员,编写函数实现 RSI 指标。函数接受数据帧
df
,inplace
参数控制是否原地更新df
。df
包含四个列:open
开盘价、high
最高价、low
最低价和close
收盘价。所有指标都应当保存到df
中,最后返回df
。
def rsi(df, rsi_col='rsi', window=14, inplace=False): """ 计算RSI指标,并更新DataFrame。 参数: df : DataFrame 包含价格数据的DataFrame,必须包含'open', 'high', 'low', 'close'列。 window : int, optional RSI指标的窗口大小,默认为14。 inplace : bool, optional 是否在原地更新DataFrame,默认为False。 返回: df : DataFrame 包含RSI指标的新DataFrame(如果inplace为False)。 """ # 复制DataFrame以避免修改原始数据 if not inplace: df = df.copy() # 计算价格变动 chg = df['close'].diff() # 计算上涨和下跌的平均值 up_avg = chg.where(chg > 0).rolling(window=window).mean() down_avg = -chg.where(chg < 0).rolling(window=window).mean() # 防止除以零 up_avg.fillna(0, inplace=True) down_avg.fillna(0, inplace=True) # 计算RSI df[rsi_col] = 100 - (100 / (1 + (up_avg / down_avg))) return df
【Quant102】 经典技术指标 Pandas 实现(第一部分)(3)https://developer.aliyun.com/article/1524458