别再死记硬背了!用Python复现同花顺VR、VMA等10个技术指标(附完整代码)

别再死记硬背了!用Python复现同花顺VR、VMA等10个技术指标(附完整代码) 用Python实战复现同花顺十大技术指标从数据获取到可视化全流程解析在量化投资领域技术指标是分析市场趋势、判断买卖时机的重要工具。同花顺作为国内主流金融软件内置了VR、VMA、VMACD等经典技术指标但很多用户只知其然而不知其所以然。本文将带你用Python从零开始完整复现这些指标的计算过程不仅理解其数学本质还能根据个人需求进行灵活调整和优化。1. 环境准备与数据获取在开始指标复现前我们需要搭建Python开发环境并获取高质量的金融数据。推荐使用Anaconda创建独立环境conda create -n quant python3.8 conda activate quant pip install pandas numpy matplotlib tushare akshare金融数据源的选择至关重要这里介绍两种常用方案Tushare Pro方案需注册获取tokenimport tushare as ts pro ts.pro_api(你的token) df pro.daily(ts_code600519.SH, start_date20200101, end_date20221231)AKShare方案无需注册import akshare as ak df ak.stock_zh_a_daily(symbolsh600519, adjusthfq) # 后复权数据数据预处理是保证指标计算准确的关键步骤# 处理缺失值 df.fillna(methodffill, inplaceTrue) # 按日期排序 df.sort_index(ascendingTrue, inplaceTrue) # 计算涨跌幅 df[pct_change] df[close].pct_change()2. 核心指标实现与代码解析2.1 VR波动区间指标VR指标用于衡量股票在特定置信水平下的价格波动范围其核心是计算标准差def calculate_vr(df, window250, confidence1.65): 计算VR波动区间指标 参数 df: 包含收盘价的数据框 window: 计算窗口默认为250日 confidence: 置信水平乘数默认为1.65对应95%置信度 返回 添加了VR指标的数据框 df[vr] confidence * df[pct_change].rolling(window).std() df[upper_bound] df[close] * (1 df[vr]) df[lower_bound] df[close] * (1 - df[vr]) return df实际应用时可以通过调整window参数观察不同时间尺度下的波动特征# 计算不同时间周期的VR df calculate_vr(df, window60) # 季度波动 df calculate_vr(df, window120) # 半年波动2.2 VMA变异平均线VMA是对传统均线的改进通过引入中价概念提高灵敏度def calculate_vma(df, periods[5, 10, 20, 60, 120]): 计算变异平均线(VMA) 参数 df: 包含OHLC数据的数据框 periods: 均线周期列表 返回 添加了VMA指标的数据框 # 计算中价 df[vv] (df[high] df[low] df[open] df[close]) / 4 # 计算各周期VMA for period in periods: df[fvma_{period}] df[vv].rolling(period).mean() return dfVMA的使用技巧当股价上穿VMA时可能预示上涨趋势开始短期VMA上穿长期VMA形成金叉是重要买入信号多条VMA线聚拢后发散往往意味着趋势加速2.3 VMACD量指数平滑异同平均线VMACD是MACD的成交量版本反映资金流动情况def calculate_vmacd(df, short12, long26, m9): 计算VMACD指标 参数 df: 包含成交量数据的数据框 short: 短期EMA周期 long: 长期EMA周期 m: DEA计算周期 返回 添加了VMACD指标的数据框 df[diff] df[volume].ewm(spanshort).mean() - df[volume].ewm(spanlong).mean() df[dea] df[diff].ewm(spanm).mean() df[macd] df[diff] - df[dea] return dfVMACD的典型应用场景DIFF和DEA均为正且DIFF上穿DEA资金流入明显当价格创新高而VMACD未创新高警惕顶背离风险柱状线由绿转红时可能预示资金面改善3. 进阶指标实现与优化3.1 VPT量价曲线VPT将价格变化与成交量结合反映资金推动力度def calculate_vpt(df): 计算量价曲线(VPT) 参数 df: 包含收盘价和成交量的数据框 返回 添加了VPT指标的数据框 df[price_change] df[close].pct_change() df[vpt] (df[volume] * df[price_change]).cumsum() df[vpt_ma] df[vpt].rolling(20).mean() return dfVPT使用要点VPT上穿0轴时资金开始积极介入价格与VPT出现背离时趋势可能反转结合EMV指标使用可提高准确性3.2 VRSI量相对强弱VRSI是成交量版的RSI反映资金活跃程度def calculate_vrsi(df, n6): 计算量相对强弱指标(VRSI) 参数 df: 包含成交量数据的数据框 n: 计算周期 返回 添加了VRSI指标的数据框 delta df[volume].diff() up delta.clip(lower0) down -delta.clip(upper0) ma_up up.rolling(n).mean() ma_down down.rolling(n).mean() df[vrsi] 100 - (100 / (1 ma_up / ma_down)) return dfVRSI的实战价值VRSI在50以上表示市场活跃突破80可能超买跌破20可能超卖与价格RSI结合可判断量价配合情况4. 可视化分析与策略回测4.1 多指标协同可视化使用Matplotlib实现专业级指标面板def plot_indicators(df, code_name): 绘制多指标协同分析图 参数 df: 包含指标数据的数据框 code_name: 股票名称 plt.figure(figsize(16, 12)) # K线图 ax1 plt.subplot(411) plt.title(f{code_name} - 多指标分析) plt.plot(df[close], label收盘价) plt.plot(df[vma_10], labelVMA10) plt.plot(df[vma_60], labelVMA60) plt.legend() # 成交量VMACD ax2 plt.subplot(412) plt.bar(df.index, df[volume], color[r if x0 else g for x in df[price_change]]) plt.plot(df[diff], labelDIFF) plt.plot(df[dea], labelDEA) plt.legend() # VPT ax3 plt.subplot(413) plt.plot(df[vpt], labelVPT) plt.plot(df[vpt_ma], labelVPT_MA20) plt.axhline(0, colorgray, linestyle--) plt.legend() # VRSI ax4 plt.subplot(414) plt.plot(df[vrsi], labelVRSI6) plt.axhline(80, colorr, linestyle--) plt.axhline(20, colorg, linestyle--) plt.legend() plt.tight_layout() plt.show()4.2 简单策略回测示例基于VMA和VMACD的交叉策略def backtest_strategy(df): 简单策略回测 参数 df: 包含指标数据的数据框 返回 回测结果数据框 df[signal] 0 # VMA10上穿VMA60且DIFF0时买入 df.loc[(df[vma_10] df[vma_60]) (df[vma_10].shift() df[vma_60].shift()) (df[diff] 0), signal] 1 # VMA10下穿VMA60且DIFF0时卖出 df.loc[(df[vma_10] df[vma_60]) (df[vma_10].shift() df[vma_60].shift()) (df[diff] 0), signal] -1 # 计算收益率 df[return] df[close].pct_change() df[strategy_return] df[signal].shift() * df[return] return df回测结果分析要点年化收益率与最大回撤胜率与盈亏比交易次数与持仓周期不同市场环境下的表现差异