当前位置: 首页 > news >正文

手把手教你用Python复刻同花顺的VRSI和WVAD指标(附完整代码与回测)

用Python实战复刻同花顺VRSI与WVAD指标:从原理到回测全解析

在量化投资领域,技术指标如同导航仪,帮助投资者在波动的市场中寻找方向。同花顺作为国内主流金融软件,其内置的VRSI(量相对强弱指标)和WVAD(威廉变异离散量)指标被广泛使用,但很多用户对其计算逻辑和实际效果缺乏深入理解。本文将带你用Python完整实现这两个指标的计算过程,并通过历史数据回测验证其有效性。

1. 环境准备与数据获取

在开始指标计算前,我们需要搭建Python分析环境并获取高质量的金融数据。推荐使用Anaconda创建独立环境:

conda create -n quant python=3.9 conda activate quant pip install pandas numpy matplotlib akshare

对于数据源,我们选择akshare库获取A股历史数据。相比Tushare,akshare无需注册且免费获取基础行情数据:

import akshare as ak def get_stock_data(stock_code, start_date, end_date): """ 获取指定股票的历史行情数据 :param stock_code: 股票代码,如'000001' :param start_date: 开始日期,格式'YYYY-MM-DD' :param end_date: 结束日期,格式'YYYY-MM-DD' :return: DataFrame格式的行情数据 """ df = ak.stock_zh_a_hist(symbol=stock_code, period="daily", start_date=start_date, end_date=end_date, adjust="hfq") df.rename(columns={ '日期': 'date', '开盘': 'open', '收盘': 'close', '最高': 'high', '最低': 'low', '成交量': 'volume' }, inplace=True) df['date'] = pd.to_datetime(df['date']) df.set_index('date', inplace=True) return df

提示:实际应用中建议将获取的数据持久化存储,避免频繁调用API。可以使用df.to_csv()保存到本地文件。

2. VRSI指标原理与Python实现

VRSI(Volume Relative Strength Index)是成交量版的RSI指标,通过比较特定周期内成交量上涨和下跌的幅度来衡量市场买卖力量对比。

2.1 指标计算公式解析

VRSI的计算分为三个核心步骤:

  1. 计算每日成交量变化

    • 当日成交量 > 前一日成交量:记录上涨幅度
    • 当日成交量 < 前一日成交量:记录下跌幅度
  2. 计算N日平均上涨和下跌幅度

    • 平均上涨幅度 = N日内上涨幅度总和 / N
    • 平均下跌幅度 = N日内下跌幅度总和 / N
  3. 计算VRSI值

    VRSI = 100 - (100 / (1 + 相对强弱值)) 其中,相对强弱值 = 平均上涨幅度 / 平均下跌幅度

2.2 Python代码实现

以下是完整的VRSI计算函数,采用向量化计算提高效率:

def calculate_vrsi(data, window=6): """ 计算VRSI指标 :param data: 包含成交量(volume)的DataFrame :param window: 计算窗口,默认为6 :return: 添加了VRSI列的DataFrame """ df = data.copy() # 计算成交量变化 volume_diff = df['volume'].diff(1) # 初始化上涨和下跌幅度 up = pd.Series(0, index=df.index) down = pd.Series(0, index=df.index) # 计算上涨和下跌幅度 up[volume_diff > 0] = volume_diff[volume_diff > 0] down[volume_diff < 0] = -volume_diff[volume_diff < 0] # 计算平均上涨和下跌幅度 avg_up = up.rolling(window=window).mean() avg_down = down.rolling(window=window).mean() # 计算相对强弱值和VRSI rs = avg_up / avg_down df['VRSI'] = 100 - (100 / (1 + rs)) return df

2.3 VRSI指标应用策略

VRSI指标的典型用法包括:

  • 超买超卖判断

    • VRSI > 70:可能超买,考虑卖出
    • VRSI < 30:可能超卖,考虑买入
  • 背离信号

    • 价格创新高而VRSI未创新高:顶背离,可能下跌
    • 价格创新低而VRSI未创新低:底背离,可能反弹
  • 趋势确认

    • VRSI在50上方:多头市场
    • VRSI在50下方:空头市场

3. WVAD指标原理与Python实现

WVAD(Williams Variable Accumulation Distribution)通过结合价格变化和成交量来衡量资金流向。

3.1 指标计算公式解析

WVAD的计算公式为:

WVAD = [(收盘价 - 开盘价) / (最高价 - 最低价)] × 成交量

计算步骤说明:

  1. 计算价格变化比率:

    • 分子(收盘价-开盘价):反映当日价格变动方向
    • 分母(最高价-最低价):反映当日价格波动范围
  2. 乘以成交量:

    • 将价格变化与成交量结合,反映资金流向强度
  3. 通常还会计算WVAD的N日移动平均线作为信号线

3.2 Python代码实现

以下是WVAD指标的完整实现,包括原始WVAD和其移动平均线:

def calculate_wvad(data, ma_window=6): """ 计算WVAD指标 :param data: 包含开盘、最高、最低、收盘价和成交量的DataFrame :param ma_window: 移动平均窗口,默认为6 :return: 添加了WVAD和WVAD_MA列的DataFrame """ df = data.copy() # 计算价格变化比率 price_ratio = (df['close'] - df['open']) / (df['high'] - df['low']) # 计算WVAD df['WVAD'] = price_ratio * df['volume'] # 计算WVAD移动平均 df['WVAD_MA'] = df['WVAD'].rolling(window=ma_window).mean() return df

3.3 WVAD指标应用策略

WVAD指标的主要交易信号包括:

  • 零轴交叉

    • WVAD由下向上穿越0轴:买入信号
    • WVAD由上向下穿越0轴:卖出信号
  • 趋势确认

    • WVAD持续为正:资金流入,多头趋势
    • WVAD持续为负:资金流出,空头趋势
  • 背离分析

    • 价格创新高而WVAD未创新高:可能见顶
    • 价格创新低而WVAD未创新低:可能见底

4. 双指标组合策略与回测

单独使用VRSI或WVAD都有其局限性,将两者结合可以产生更可靠的交易信号。

4.1 组合策略设计

我们设计一个简单的双指标组合策略:

  1. 买入条件(同时满足):

    • VRSI < 30(超卖)
    • WVAD > 0且WVAD > WVAD_MA(资金流入且趋势向上)
  2. 卖出条件(满足任一):

    • VRSI > 70(超买)
    • WVAD < 0且WVAD < WVAD_MA(资金流出且趋势向下)

4.2 回测框架实现

使用Python实现一个简单的回测框架:

def backtest_strategy(data): """ 执行回测并计算收益 :param data: 包含VRSI和WVAD指标的DataFrame :return: 回测结果DataFrame """ df = data.copy() df['signal'] = 0 # 0表示无信号,1表示买入,-1表示卖出 df['position'] = 0 # 持仓状态,0表示空仓,1表示持仓 # 生成交易信号 buy_condition = (df['VRSI'] < 30) & (df['WVAD'] > 0) & (df['WVAD'] > df['WVAD_MA']) sell_condition = (df['VRSI'] > 70) | ((df['WVAD'] < 0) & (df['WVAD'] < df['WVAD_MA'])) df.loc[buy_condition, 'signal'] = 1 df.loc[sell_condition, 'signal'] = -1 # 计算持仓状态 position = 0 for i in range(1, len(df)): if df['signal'].iloc[i] == 1 and position == 0: position = 1 elif df['signal'].iloc[i] == -1 and position == 1: position = 0 df['position'].iloc[i] = position # 计算策略收益 df['daily_return'] = df['close'].pct_change() df['strategy_return'] = df['position'].shift(1) * df['daily_return'] return df

4.3 回测结果可视化

使用Matplotlib绘制策略收益曲线:

import matplotlib.pyplot as plt def plot_backtest_results(df): """ 绘制回测结果 :param df: 包含回测结果的DataFrame """ plt.figure(figsize=(14, 7)) # 绘制累计收益曲线 cumulative_returns = (1 + df['strategy_return']).cumprod() buy_signals = df[df['signal'] == 1].index sell_signals = df[df['signal'] == -1].index plt.plot(cumulative_returns, label='策略收益', color='blue') plt.scatter(buy_signals, cumulative_returns[buy_signals], marker='^', color='green', label='买入信号') plt.scatter(sell_signals, cumulative_returns[sell_signals], marker='v', color='red', label='卖出信号') plt.title('VRSI+WVAD组合策略回测结果') plt.xlabel('日期') plt.ylabel('累计收益') plt.legend() plt.grid(True) plt.show()

4.4 策略优化方向

初步回测后,可以考虑以下优化方向:

  1. 参数优化

    • 测试不同VRSI计算周期(6日、12日等)
    • 调整WVAD移动平均窗口大小
  2. 过滤条件增强

    • 增加成交量放大条件
    • 结合价格趋势指标(如MA)过滤信号
  3. 风险控制

    • 加入止损机制
    • 根据波动率调整仓位

5. 实战应用与注意事项

在实际应用中,有几个关键点需要注意:

  1. 数据质量检查

    • 确保没有缺失值或异常值
    • 检查复权处理是否正确
  2. 参数稳定性测试

    • 在不同市场环境下测试指标表现
    • 避免过度拟合特定时间段
  3. 与其他指标配合

    • 可结合趋势指标(如MACD)确认大方向
    • 使用波动率指标(如ATR)辅助仓位管理
  4. 实时计算优化

    • 对于实时计算,可以使用增量更新方法
    • 考虑使用Numba加速计算密集型部分
# 增量更新VRSI计算的示例 def update_vrsi(previous_vrsi, new_volume, last_volume, window=6): """ 增量更新VRSI值 :param previous_vrsi: 前一天的VRSI值 :param new_volume: 当日成交量 :param last_volume: 前一日成交量 :param window: 计算窗口 :return: 当日VRSI值 """ volume_diff = new_volume - last_volume up = volume_diff if volume_diff > 0 else 0 down = -volume_diff if volume_diff < 0 else 0 # 这里简化处理,实际应用中需要维护一个窗口内的up/down队列 avg_up = up / window avg_down = down / window rs = avg_up / (avg_down + 1e-6) # 避免除以0 return 100 - (100 / (1 + rs))

在实盘应用中,建议先进行至少3个月的历史数据回测,再考虑用小资金实盘测试。指标信号并非百分之百准确,需要结合资金管理和风险控制策略使用。

http://www.rkmt.cn/news/1508407.html

相关文章:

  • 如何用Super IO革命性提升Blender文件导入导出效率
  • Python文本处理实战:从字符串清洗到语义解析的五步精炼法
  • pandas显示配置:性能与可读性的三层调控指南
  • 本地千万级政府人口数据分类处理实战:用 AI 工作流零代码、零 SQL 完成人口数据清洗、多表拆分与分类统计
  • 从EV1527手册到可运行代码:手把手教你用STC89C52RC单片机实现433M无线解码(附完整工程)
  • 别再死记硬背了!用Python+Matplotlib动画可视化两角和差公式推导过程
  • 2026年知名的锯片/成都金属冷锯生产厂家推荐 - 品牌宣传支持者
  • 2026年南通机场招聘市场深度观察:本地服务商与全国机构如何选择?附上海浦东/虹桥真实入职案例 - 优质品牌商家
  • 别再死记硬背HMM了!用Python手搓一个中文分词器,从BMES标注到Viterbi解码全流程
  • 从一次接口损坏说起:深入解析电阻在TVS浪涌防护电路中的‘功率陷阱’与选型要点
  • 骁龙X2 Elite边缘AI应用开发实战(4): AIGC实战之Stable Diffusion 1.5极速文生图
  • FlexCAN(FD)的Message Buffer到底存了什么?一个结构体带你彻底搞懂MB的RAM布局
  • CesiumJS 114版本性能调优实战:如何用好dynamicScreenSpaceError与缓存新参数
  • 2026年口碑好的电动超高压阀门/20000Psi超高压阀门多家厂家对比分析 - 行业平台推荐
  • Mermaid Live Editor深度解析:实时图表编辑的现代技术架构
  • CloudFront + Lambda@Edge + Cognito 实现 S3 私有桶零信任访问控制(完整实战)
  • 2026年6月儿童摄影机构有哪些,生日照/全家福/新生儿照/派对布置/儿童摄影/宝宝照/百天上门照,儿童摄影工作室推荐 - 品牌推荐师
  • Gyroflow教程:免费开源视频防抖神器,拯救手抖废片
  • 别只调延迟时间了!深入理解Flink Watermark的生成与传播机制
  • 2026年大学生考证避坑指南:一般大学生要考哪些证书有哪些?系统提升职业竞争力的核心路径
  • 别再只懂原理了!用Wireshark抓包带你‘看见’BFD单臂回声的工作过程
  • RS485主从通信闭环验证工程:含可直接烧录的HEX文件与Keil完整工程
  • 告别ReLU和GELU?手把手教你用NAFNet在SIDD/GoPro数据集上复现SOTA图像修复效果
  • 明华RF-EYE-U010读写器开发套件:含C++/Delphi/VB示例、DLL库与CHM接口手册
  • 避坑指南:HPM6750的UART DMA传输,这些细节不注意代码就跑不起来
  • MCP协议:AI工具的USB-C式即插即用通信标准
  • LOINC 2.64版结构化数据包:含Oracle/MySQL建库脚本、CSV字典及批量导入工具
  • OpenCV图像处理流水线优化:从imread到imencode,一步到位搞定图片压缩与网络传输
  • 大模型稀疏激活原理:MoE架构如何实现1.8万亿参数仅2%动态计算
  • STM32H743xI性能调优实战:避开多主设备争抢AXI总线的坑,提升DMA2D刷屏效率