【Quant102】 经典技术指标 Pandas 实现(第一部分)

news/2024/9/24 2:33:09

双均线策略

假设你是个高级程序员和量化研究员,编写函数实现双均线策略。函数接受数据帧df,较短均线的列名称short_col和较长均线的列名称long_colinplace参数控制是否原地更新df。买卖信号应保存在signal列中。最后返回df

def dual_moving_average_strategy(df, short_col='sma_short', long_col='sma_long', inplace=False):"""实现双均线策略,生成买卖信号。参数:df : DataFrame包含价格数据的DataFrame。short_col : str短周期均线的列名。long_col : str长周期均线的列名。返回:df : DataFrame原始DataFrame,增加了一个名为'signal'的列,包含买卖信号。"""if not inplace:df = df.copy()# 初始化信号列,默认为无操作df['signal'] = 0# 产生买入信号:短周期均线由下向上穿越长周期均线df.loc[(df[short_col] > df[long_col]) & (df[short_col].shift(1) <= df[long_col].shift(1)), 'signal'] = 1# 产生卖出信号:短周期均线由上向下穿越长周期均线df.loc[(df[short_col] < df[long_col]) & (df[short_col].shift(1) >= df[long_col].shift(1)), 'signal'] = -1return df

布林带指标

假设你是个高级程序员和量化研究员,编写函数实现布林带指标。函数接受数据帧df,中布林带的列名称mid_col,上布林带列名称upper_col,下布林带列名称lower_colinplace参数控制是否原地更新dfdf包含四个列:open开盘价、high最高价、low最低价和close收盘价。所有指标都应当保存到df中,最后返回df

def bollinger_bands(df, mid_col='mid_band', upper_col='upper_band', lower_col='lower_band', window=20, num_std=2, inplace=False
):"""计算布林带指标,并更新DataFrame。参数:df : DataFrame包含价格数据的DataFrame,必须包含'open', 'high', 'low', 'close'列。window : int, optional计算简单移动平均线SMA的窗口大小,默认为20。num_std : int, optional计算布林带通道时使用的标准差倍数,默认为2。inplace : bool, optional是否在原地更新DataFrame,默认为False。返回:df : DataFrame包含布林带指标的新DataFrame(如果inplace为False)。"""# 复制DataFrame以避免修改原始数据if not inplace:df = df.copy()# 计算中轨(简单移动平均线SMA)df['mid_band'] = df['close'].rolling(window=window).mean()# 计算价格的标准差std = df['close'].rolling(window=window).std()# 计算布林带上轨df['upper_band'] = df['mid_band'] + (std * num_std)# 计算布林带下轨df['lower_band'] = df['mid_band'] - (std * num_std)return df

布林带策略

假设你是个高级程序员和量化研究员,编写函数实现布林带策略。函数接受数据帧df,中轨的列名称mid_col,上轨列名称upper_col,下轨列名称lower_colinplace参数控制是否原地更新df。买卖信号应保存在signal列中。最后返回df

def bollinger_bands_strategy(df, mid_col='mid_band', upper_col='upper_band', lower_col='lower_band', inplace=False):"""实现布林带策略,生成买卖信号。参数:df : DataFrame包含价格数据的DataFrame,必须包含'mid_col', 'upper_col', 'lower_col'列。mid_col : str中轨(通常是简单移动平均线SMA)的列名。upper_col : str上轨的列名。lower_col : str下轨的列名。inplace : bool, optional是否在原地更新DataFrame,默认为False。返回:df : DataFrame原始DataFrame,增加了一个名为'signal'的列,包含买卖信号。"""# 复制DataFrame以避免修改原始数据if not inplace:df = df.copy()# 初始化信号列,默认为无操作df['signal'] = 0# 产生买入信号:价格跌破下轨df.loc[df['close'] < df[lower_col], 'signal'] = 1# 产生卖出信号:价格突破上轨df.loc[df['close'] > df[upper_col], 'signal'] = -1return df

MACD 指标

假设你是个高级程序员和量化研究员,编写函数实现 MACD 指标。函数接受数据帧dfinplace参数控制是否原地更新dfdf包含四个列: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()# 计算快速EMAfast_ema = df['close'].ewm(span=fast_window, adjust=False).mean()# 计算慢速EMAslow_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_colinplace参数控制是否原地更新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 : strDEA(信号线)的列名。dif_col : strDIF(MACD线)的列名。hist_col : strMACD柱状图的列名。inplace : bool, optional是否在原地更新DataFrame,默认为False。返回:df : DataFrame原始DataFrame,增加了一个名为'signal'的列,包含买卖信号。"""# 复制DataFrame以避免修改原始数据if not inplace:df = df.copy()# 初始化信号列,默认为无操作df['signal'] = 0# 产生买入信号:DIF上穿DEAdf.loc[(df[dif_col] > df[dea_col]) & (df[dif_col].shift(1) <= df[dea_col].shift(1)), 'signal'] = 1# 产生卖出信号:DIF下穿DEAdf.loc[(df[dif_col] < df[dea_col]) & (df[dif_col].shift(1) >= df[dea_col].shift(1)), 'signal'] = -1return df

RSI 指标

假设你是个高级程序员和量化研究员,编写函数实现 RSI 指标。函数接受数据帧dfinplace参数控制是否原地更新dfdf包含四个列: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, optionalRSI指标的窗口大小,默认为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)# 计算RSIdf[rsi_col] = 100 - (100 / (1 + (up_avg / down_avg)))return df

RSI 策略

假设你是个高级程序员和量化研究员,编写函数实现RSI策略。函数接受数据帧df,RSI列名称rsi_colinplace参数控制是否原地更新df。买卖信号应保存在signal列中。最后返回df

def rsi_strategy(df, rsi_col='rsi', inplace=False):"""实现RSI策略,生成买卖信号。参数:df : DataFrame包含RSI指标数据的DataFrame,必须包含'rsi_col'列。rsi_col : strRSI指标的列名。inplace : bool, optional是否在原地更新DataFrame,默认为False。返回:df : DataFrame原始DataFrame,增加了一个名为'signal'的列,包含买卖信号。"""# 复制DataFrame以避免修改原始数据if not inplace:df = df.copy()# 初始化信号列,默认为无操作df['signal'] = 0# 产生买入信号:RSI低于30df.loc[df[rsi_col] < 30, 'signal'] = 1# 产生卖出信号:RSI高于70df.loc[df[rsi_col] > 70, 'signal'] = -1return df

KDJ 指标

假设你是个高级程序员和量化研究员,编写函数实现 KDJ 指标。函数接受数据帧dfinplace参数控制是否原地更新dfdf包含四个列:open开盘价、high最高价、low最低价和close收盘价。所有指标都应当保存到df中,最后返回df

def kdj(df, k_col='K', d_col='D', j_col='J', n=9, m1=3, m2=3, inplace=False):"""计算KDJ指标,并更新DataFrame。参数:df : DataFrame包含价格数据的DataFrame,必须包含'open', 'high', 'low', 'close'列。n : int, optional计算KDJ指标的时间窗口,默认为9。m1 : int, optional计算D线的时间窗口,默认为3。m2 : int, optional计算J线的参数,默认为3。inplace : bool, optional是否在原地更新DataFrame,默认为False。返回:df : DataFrame包含KDJ指标的新DataFrame(如果inplace为False)。"""# 复制DataFrame以避免修改原始数据if not inplace:df = df.copy()# 计算最小值和最大值low_min = df['low'].rolling(window=n).min()high_max = df['high'].rolling(window=n).max()# 计算K值df[k_col] = (df['close'] - low_min) / (high_max - low_min) * 100# 计算D值df[d_col] = df[k_col].rolling(window=m1).mean()# 计算J值df[j_col] = m2 * df[d_col] - df[k_col].rolling(window=m2).mean()return df

KDJ 策略

假设你是个高级程序员和量化研究员,编写函数实现KDJ策略。函数接受数据帧df,K/D/J列名称k_cold_colj_colinplace参数控制是否原地更新df。买卖信号应保存在signal列中。最后返回df

def kdj_strategy(df, k_col='K', d_col='D', j_col='J', inplace=False):"""实现KDJ策略,生成买卖信号。参数:df : DataFrame包含KDJ指标数据的DataFrame,必须包含'k_col', 'd_col', 'j_col'列。k_col : strK值的列名。d_col : strD值的列名。j_col : strJ值的列名。inplace : bool, optional是否在原地更新DataFrame,默认为False。返回:df : DataFrame原始DataFrame,增加了一个名为'signal'的列,包含买卖信号。"""# 复制DataFrame以避免修改原始数据if not inplace:df = df.copy()# 初始化信号列,默认为无操作df['signal'] = 0# 产生买入信号:K值上穿D值df.loc[(df[k_col] > df[d_col]) & (df[k_col].shift(1) <= df[d_col].shift(1)), 'signal'] = 1# 产生卖出信号:K值下穿D值df.loc[(df[k_col] < df[d_col]) & (df[k_col].shift(1) >= df[d_col].shift(1)), 'signal'] = -1return df

CCI 指标

假设你是个高级程序员和量化研究员,编写函数实现 CCI 指标。函数接受数据帧dfinplace参数控制是否原地更新dfdf包含四个列:open开盘价、high最高价、low最低价和close收盘价。所有指标都应当保存到df中,最后返回df

def cci(df, cci_col='cci', n=20, inplace=False):"""计算CCI指标,并更新DataFrame。参数:df : DataFrame包含价格数据的DataFrame,必须包含'open', 'high', 'low', 'close'列。n : int, optionalCCI指标的时间窗口,默认为20。inplace : bool, optional是否在原地更新DataFrame,默认为False。返回:df : DataFrame包含CCI指标的新DataFrame(如果inplace为False)。"""# 复制DataFrame以避免修改原始数据if not inplace:df = df.copy()# 计算移动平均值sma = df['close'].rolling(window=n).mean()# 计算标准差std = df['close'].rolling(window=n).std()# 计算CCIdf[cci_col] = (df['close'] - sma) / (0.015 * std)return df

CCI 策略

假设你是个高级程序员和量化研究员,编写函数实现CCI策略。函数接受数据帧df,CCI列名称cci_colinplace参数控制是否原地更新df。买卖信号应保存在signal列中。最后返回df

def cci_strategy(df, cci_col='cci', inplace=False):"""实现CCI策略,生成买卖信号。参数:df : DataFrame包含CCI指标数据的DataFrame,必须包含'cci_col'列。cci_col : strCCI指标的列名。inplace : bool, optional是否在原地更新DataFrame,默认为False。返回:df : DataFrame原始DataFrame,增加了一个名为'signal'的列,包含买卖信号。"""# 复制DataFrame以避免修改原始数据if not inplace:df = df.copy()# 初始化信号列,默认为无操作df['signal'] = 0# 产生买入信号:CCI低于-100df.loc[df[cci_col] < -100, 'signal'] = 1# 产生卖出信号:CCI高于+100df.loc[df[cci_col] > 100, 'signal'] = -1return df

OBV 指标

假设你是个高级程序员和量化研究员,编写函数实现 OBV 指标。函数接受数据帧dfinplace参数控制是否原地更新dfdf包含四个列:open开盘价、high最高价、low最低价和close收盘价。所有指标都应当保存到df中,最后返回df

def obv(df, obv_col='obv', inplace=False):"""计算OBV指标,并更新DataFrame。参数:df : DataFrame包含价格数据的DataFrame,必须包含'open', 'high', 'low', 'close'列。inplace : bool, optional是否在原地更新DataFrame,默认为False。返回:df : DataFrame包含OBV指标的新DataFrame(如果inplace为False)。"""# 复制DataFrame以避免修改原始数据if not inplace:df = df.copy()# 计算收盘价差异的符号chg = df['close'].diff()sgn = np.sign(chg)sgn.iloc[0] = 0# 计算OBVdf[obv_col] = (df['volume'] * sgn).cumsum()return df

OBV 策略

假设你是个高级程序员和量化研究员,编写函数实现OBV策略。函数接受数据帧df,OBV列名称obv_colinplace参数控制是否原地更新df。买卖信号应保存在signal列中。最后返回df

def obv_strategy(df, obv_col, inplace=False):"""实现OBV策略,生成买卖信号。参数:df : DataFrame包含OBV指标数据的DataFrame,必须包含'obv_col'列。obv_col : strOBV指标的列名。inplace : bool, optional是否在原地更新DataFrame,默认为False。返回:df : DataFrame原始DataFrame,增加了一个名为'signal'的列,包含买卖信号。"""# 复制DataFrame以避免修改原始数据if not inplace:df = df.copy()# 初始化信号列,默认为无操作df['signal'] = 0# 产生买入信号:OBV连续上升df.loc[df[obv_col].rolling(window=3).sum() > 0, 'signal'] = 1# 产生卖出信号:OBV连续下降df.loc[df[obv_col].rolling(window=3).sum() < 0, 'signal'] = -1return df

ADX 指标

假设你是个高级程序员和量化研究员,编写函数实现 ADX 指标。函数接受数据帧dfinplace参数控制是否原地更新dfdf包含四个列:open开盘价、high最高价、low最低价和close收盘价。所有指标都应当保存到df中,最后返回df

def adx(df, window=14, inplace=False):"""计算ADX指标,并更新DataFrame。参数:df : DataFrame包含价格数据的DataFrame,必须包含'open', 'high', 'low', 'close'列。window : int, optionalADX指标的时间窗口,默认为14。inplace : bool, optional是否在原地更新DataFrame,默认为False。返回:df : DataFrame包含ADX指标的新DataFrame(如果inplace为False)。"""# 复制DataFrame以避免修改原始数据if not inplace:df = df.copy()# 计算最高价和最低价之间的差异df['range'] = df['high'] - df['low']# 计算动量(Momentum)plus_dm = np.where(df['close'] - df['open'] > 0, df['range'], 0)minus_dm = np.where(df['open'] - df['close'] > 0, -df['range'], 0)# 计算ADM和ADNplus_dm_mean = plus_dm.rolling(window=window).mean()minus_dm_mean = minus_dm.rolling(window=window).mean()# 计算DXdx = (plus_dm_mean - minus_dm_mean) / (plus_dm_mean + minus_dm_mean)dx_mean = dx.rolling(window=window).mean()# 计算ADXdf['adx'] = (100 - 100 / (1 + np.sqrt(dx_mean)))return df

ADX 策略

假设你是个高级程序员和量化研究员,编写函数实现ADX策略。函数接受数据帧df,ADX列名称adx_colinplace参数控制是否原地更新df。买卖信号应保存在signal列中。最后返回df

def adx_strategy(df, adx_col='adx', inplace=False):"""实现ADX策略,生成买卖信号。参数:df : DataFrame包含ADX指标数据的DataFrame,必须包含'adx_col'列。adx_col : strADX指标的列名。inplace : bool, optional是否在原地更新DataFrame,默认为False。返回:df : DataFrame原始DataFrame,增加了一个名为'signal'的列,包含买卖信号。"""# 复制DataFrame以避免修改原始数据if not inplace:df = df.copy()# 初始化信号列,默认为无操作df['signal'] = 0# 产生买入信号:ADX超过25df.loc[df[adx_col] > 25, 'signal'] = 1# 产生卖出信号:ADX低于25df.loc[df[adx_col] < 25, 'signal'] = -1return df

VWAP 指标

假设你是个高级程序员和量化研究员,编写函数实现 VWAP 指标。函数接受数据帧dfinplace参数控制是否原地更新dfdf包含四个列:open开盘价、high最高价、low最低价和close收盘价。所有指标都应当保存到df中,最后返回df

def vwap(df, vwap_col='vwap', inplace=False):"""计算VWAP指标,并更新DataFrame。参数:df : DataFrame包含价格数据的DataFrame,必须包含'open', 'high', 'low', 'close', 'volume'列。window : int, optional滚动窗口的大小,默认为1。inplace : bool, optional是否在原地更新DataFrame,默认为False。返回:df : DataFrame包含VWAP指标的新DataFrame(如果inplace为False)。"""# 复制DataFrame以避免修改原始数据if not inplace:df = df.copy()# 计算VWAPdf['vwap'] = (df['open'] + df['high'] + df['low'] + df['close']) / 4 * df['volume']return df

VWAP 策略

假设你是个高级程序员和量化研究员,编写函数实现VWAP策略。函数接受数据帧df,VWAP列名称vwap_colinplace参数控制是否原地更新df。买卖信号应保存在signal列中。最后返回df

def vwap_strategy(df, vwap_col='vwap', inplace=False):"""实现VWAP策略,生成买卖信号。参数:df : DataFrame包含VWAP指标数据的DataFrame,必须包含'vwap_col'列。vwap_col : strVWAP指标的列名。inplace : bool, optional是否在原地更新DataFrame,默认为False。返回:df : DataFrame原始DataFrame,增加了一个名为'signal'的列,包含买卖信号。"""# 复制DataFrame以避免修改原始数据if not inplace:df = df.copy()# 初始化信号列,默认为无操作df['signal'] = 0# 产生买入信号:价格突破VWAPdf.loc[df['close'] > df[vwap_col], 'signal'] = 1# 产生卖出信号:价格跌破VWAPdf.loc[df['close'] < df[vwap_col], 'signal'] = -1return df

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/31076.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

2024 年 5 月 13 日 周一 晴 热(376 字)

正文感觉自己这两天摸鱼有些严重(笑。前两天有件事忘了写了。周六晚去吃饭和拍照的时候,看见有个女生坐在路边,红着眼睛跟谁打电话,语气里带一股哭腔。身上穿着校服,我想应该是高中生。身边没有人。我不知道什么事情能让人发火又哭泣,觉得有些奇怪,也不知道怎么宽慰这个…

基于高斯混合模型的视频背景提取和人员跟踪算法matlab仿真

1.算法运行效果图预览2.算法运行软件版本 MATLAB2013B3.算法理论概述基于高斯混合模型(Gaussian Mixture Model, GMM)的视频背景提取和人员跟踪算法是一种广泛应用的计算机视觉方法,主要用于分离视频序列中的静态背景和动态前景(比如人物运动)。高斯混合模型是一个概率密度函…

开发工具连接实例远程开发

远程开发主要基于将开发环境(包括代码编辑、编译、运行等)从本地机器转移到远程服务器上,这个过程涉及几个关键组件和概念远程开发主要基于将开发环境(包括代码编辑、编译、运行等)从本地机器转移到远程服务器上,这个过程涉及几个关键组件和概念: 立即免费体验:https:/…

m基于遗传优化的LDPC码OMS译码算法最优偏移参数计算和误码率matlab仿真

1.算法仿真效果 matlab2022a仿真结果如下:2.算法涉及理论知识概要低密度奇偶校验码(Low-Density Parity-Check Codes, LDPC codes)因其优秀的纠错能力和接近香农极限的性能而广泛应用于现代通信系统中。有序统计译码(Ordered Statistics Decoding, OSD)是一种基于概率译码准则…

低开开发笔记(六): 工作台与模板样式开发

好家伙,仅仅只是实现了样式,完整功能暂未完成完整代码已开源 https://github.com/Fattiger4399/ph-questionnaire.git 1.灵感来源 (抄袭对象) 刚开始想着随便写个低开项目练练手的,然后就写成这样了 1.1.简道云 1.2.问卷星 2.上代码<template><div class="docum…

vue要做权限管理该怎么做?如果控制到按钮级别的权限怎么做?

一、是什么 权限是对特定资源的访问许可,所谓权限控制,也就是确保用户只能访问到被分配的资源 而前端权限归根结底是请求的发起权,请求的发起可能有下面两种形式触发页面加载触发 页面上的按钮点击触发总的来说,所有的请求发起都触发自前端路由或视图 所以我们可以从这两方…

小集训 - 3

问号这个世界就是一个巨大的问号5.11 下午 继续被 AC自动机的板题 切 感觉可能会一点 AC自动机 的dp了 然后写了 依托答辩 这小自信一下子就起来了 也一下子就下来了 (重点在时间) 淦,对着题解贺都没贺明白 😡 晚上 打 ABC 就过了 5 道 感觉 F 思路挺常规的但确实赛时不会…