别再只看K线了!用Python复刻同花顺里的VR、VMA等10个量价指标(附完整代码)
用Python实战10大量价指标:从同花顺公式到可运行代码
在量化交易领域,技术指标是决策的重要参考。同花顺作为国内主流交易软件,内置了多种经过市场验证的量价指标。本文将带您用Python完整实现V&R、VMA等10个核心指标,不仅提供可运行的代码,还会深入解析每个指标背后的数学逻辑和实际应用场景。
1. 环境准备与数据获取
在开始指标实现前,我们需要搭建Python环境并准备历史行情数据。推荐使用Anaconda创建独立环境:
conda create -n quant python=3.8 conda activate quant pip install pandas numpy matplotlib tushare backtrader对于数据源,我们使用Tushare Pro获取高质量的A股历史数据。首先需要注册获取API token:
import tushare as ts pro = ts.pro_api('你的token') # 获取贵州茅台日线数据 df = pro.daily(ts_code='600519.SH', start_date='20190101', end_date='20231231') df = df.sort_values('trade_date') df.index = pd.to_datetime(df['trade_date'])为方便后续计算,我们预处理基础数据字段:
df['pre_close'] = df['close'].shift(1) # 前收盘价 df['pct_change'] = df['close'].pct_change() # 涨跌幅 df['avg_price'] = (df['high'] + df['low'] + df['close']) / 3 # 平均价2. 波动性指标实现
2.1 V&R指标:波动风险区间
V&R(Volatility and Range)通过统计学方法计算股价的波动区间,帮助判断当前价格在统计意义上的位置。
计算原理:
- 取250个交易日的收盘价涨跌幅标准差
- 波动带宽度 = 1.65 × 标准差(对应95%置信区间)
- 上轨 = 收盘价 + 波动带宽度
- 下轨 = 收盘价 - 波动带宽度
Python实现:
def calculate_vr(df, window=250): df['vr_std'] = df['pct_change'].rolling(window).std() df['vr_band'] = 1.65 * df['vr_std'] * df['close'] df['vr_upper'] = df['close'] + df['vr_band'] df['vr_lower'] = df['close'] - df['vr_band'] return df df = calculate_vr(df)应用场景:
- 当股价触及上轨,可能面临回调压力
- 当股价触及下轨,可能具备反弹潜力
- 波动带收窄往往预示变盘在即
2.2 VSTD指标:成交量标准差
VSTD(Volume Standard Deviation)衡量成交量波动的剧烈程度,识别异常放量或缩量。
计算逻辑:
def calculate_vstd(df, window=20): df['vstd'] = df['vol'].rolling(window).std() return df使用技巧:
- 价格创新高但VSTD未创新高,警惕顶背离
- VSTD突破长期均线预示趋势可能加速
- 极端低值往往出现在市场底部区域
3. 量价结合指标实现
3.1 VMA:变异平均线
VMA(Variable Moving Average)通过改进传统均线算法,提高了对价格变化的敏感度。
计算步骤:
- 计算变异价VV = (最高价+开盘价+最低价+收盘价)/4
- 对VV计算不同周期的简单移动平均
def calculate_vma(df, periods=[5, 10, 20, 60, 120]): df['vv'] = (df['high'] + df['open'] + df['low'] + df['close']) / 4 for p in periods: df[f'vma_{p}'] = df['vv'].rolling(p).mean() return df交易信号:
- 短期VMA上穿长期VMA,买入信号
- 价格在VMA上方运行为强势特征
- 多根VMA聚拢后发散预示趋势启动
3.2 VPT:量价曲线
VPT(Volume Price Trend)将价格变化与成交量结合,反映资金流向。
算法实现:
def calculate_vpt(df): df['vpt'] = df['vol'] * (df['close'] - df['pre_close']) / df['pre_close'] df['vpt_cum'] = df['vpt'].cumsum() df['vpt_ma'] = df['vpt_cum'].rolling(20).mean() return df应用要点:
- VPT由下向上穿越0轴为买入信号
- 价格与VPT出现背离时需警惕反转
- 配合均线使用可过滤虚假信号
4. 动量类指标实现
4.1 VR:容量比率
VR(Volatility Ratio)通过成交量强弱判断市场超买超卖状态。
Python代码:
def calculate_vr(df, window=24): up_vol = df['vol'].where(df['close'] > df['pre_close'], 0) down_vol = df['vol'].where(df['close'] < df['pre_close'], 0) df['vr'] = up_vol.rolling(window).sum() / down_vol.rolling(window).sum() return df关键阈值:
- VR<40%:可能形成市场底部
- VR>250%:警惕市场过热风险
- 150%为常态分布中值
4.2 VRSI:量相对强弱
VRSI(Volume Relative Strength Index)是成交量版的RSI指标。
计算过程:
def calculate_vrsi(df, window=14): vol_up = df['vol'].where(df['close'] > df['pre_close'], 0) vol_down = df['vol'].where(df['close'] < df['pre_close'], 0) avg_up = vol_up.rolling(window).mean() avg_down = vol_down.rolling(window).mean() df['vrsi'] = 100 - 100 / (1 + avg_up / avg_down) return df使用法则:
- VRSI>70为超买区域
- VRSI<30为超卖区域
- 与价格走势背离时信号更强
5. 指标集成与回测
将自定义指标集成到Backtrader回测框架中:
class VRStrategy(bt.Strategy): params = (('vr_period', 24), ('vr_oversold', 40), ('vr_overbought', 250)) def __init__(self): self.vr = VRIndicator(self.data, period=self.p.vr_period) def next(self): if not self.position: if self.vr[0] < self.p.vr_oversold: self.buy() elif self.vr[0] > self.p.vr_overbought: self.close() class VRIndicator(bt.Indicator): lines = ('vr',) def __init__(self): up_vol = bt.If(self.data.close > self.data.close(-1), self.data.volume, 0) down_vol = bt.If(self.data.close < self.data.close(-1), self.data.volume, 0) sum_up = bt.indicators.SumN(up_vol, period=self.p.period) sum_down = bt.indicators.SumN(down_vol, period=self.p.period) self.lines.vr = sum_up / sum_down回测要点:
- 单一指标效果有限,建议组合使用
- 参数优化需避免过度拟合
- 需考虑交易成本和滑点影响
6. 可视化分析
使用Matplotlib绘制指标组合图表:
plt.figure(figsize=(16,12)) # 价格与VMA ax1 = plt.subplot(311) plt.plot(df['close'], label='Close') for p in [5,20,60]: plt.plot(df[f'vma_{p}'], label=f'VMA {p}') plt.legend() # 成交量与VSTD ax2 = plt.subplot(312) plt.bar(df.index, df['vol'], color='gray', alpha=0.3) plt.plot(df['vstd'], label='VSTD', color='purple') plt.legend() # VRSI ax3 = plt.subplot(313) plt.plot(df['vrsi'], label='VRSI', color='orange') plt.axhline(30, linestyle='--', color='green') plt.axhline(70, linestyle='--', color='red') plt.legend()通过多指标协同分析,可以更全面把握市场状态。例如当出现:
- 价格突破VMA均线系统
- VSTD显示成交量放大
- VRSI从超卖区回升 这种多指标共振时,交易信号可靠性更高。
