股市能量场理论Python实战指南
目录
- 一、传统指标的局限性
- 1. 常见指标分析
- 2. 核心痛点
- 二、能量场理论:重新定义市场动力学
- 1.理论基础与创新点
- 能量守恒定律的金融化:
- 核心逻辑:
- 2.指标公式与计算步骤
- 能量场强度(Energy Field Intensity, EFI)
- 3.Python代码实现(核心逻辑)
在股票交易中,传统技术指标(如MACD、RSI)常因滞后性错过最佳买卖点。本文将融合物理学中的能量场理论,提出一个创新指标——市场能量潮(Market Energy Tide, MET),通过量化价格、成交量、波动率的能量转换,提前识别趋势转折点。文末提供可直接运行的Python代码,助你实战验证。
一、传统指标的局限性
1. 常见指标分析
- 趋势线斜率:依赖主观画线,难以量化;
- RSI/MACD:基于历史价格计算,信号滞后;
- 波动率指标(ATR):反映幅度但无法预判方向。
2. 核心痛点
- 维度单一:仅考虑价格或成交量;
- 噪声干扰:震荡市中假信号频发;
- 缺乏能量视角:未衡量市场多空力量的“积蓄-爆发-衰竭”过程。
二、能量场理论:重新定义市场动力学
1.理论基础与创新点
能量守恒定律的金融化:
将价格动能(K)、成交量势能(V)、波动率热能(H)视为市场能量的三大来源,三者相互转化,形成「能量场」。
- 价格动能(K):价格变化的加速度(二阶导数),代表趋势惯性。
- 成交量势能(V):成交量对价格变化的支撑强度,类似“燃料”。
- 波动率热能(H):市场情绪的热度,高波动率加速能量释放。
核心逻辑:
- 能量积累阶段:价格缓涨+缩量+低波动 → 能量场积蓄。
- 能量爆发阶段:价格陡升+放量+高波动 → 能量释放,进入主升浪。
- 能量衰竭阶段:价格滞涨+量能背离 → 能量场衰减,趋势反转。
2.指标公式与计算步骤
能量场强度(Energy Field Intensity, EFI)
E F I t = α ⋅ K t + β ⋅ V t + γ ⋅ H t EFI_t=α⋅K _t+β⋅V_t+γ⋅H_t EFIt=α⋅Kt+β⋅Vt+γ⋅Ht
- 参数:
- α,β,γ 为权重系数(默认各1/3,可优化)。
- K t = d 2 P / d t 2 K_t=d^2P/dt^2 Kt=d2P/dt2(价格二阶导数,反映加速度)。
- V t = 成交 量 t / E M A ( 成交量 , N ) V_t=成交量_t/EMA(成交量,N) Vt=成交量t/EMA(成交量,N)(成交量相对强度)。
- H t = A T R t / E M A ( A T R , N ) H_t=ATR_t/EMA(ATR,N) Ht=ATRt/EMA(ATR,N)(波动率相对强度)。
- 动态调整权重:
- 当 V t V_t Vt>1(放量)时,提高 β 权重,强化量能影响;
- 当 H t H_t Ht>1(高波动)时,降低γ 权重,避免噪声干扰。
- 信号规则
- 买入信号:
EFI > 0.6 且能量方向向上,成交量突破前高。 - 卖出信号:
EFI < 0.4 且能量方向向下,价格-EFI顶背离。
- 买入信号:
3.Python代码实现(核心逻辑)
import yfinance as yf
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import gridspec
# 计算ATR(平均真实波幅)
def calculate_ATR(df, period=14):
df['H-L'] = df['High'] - df['Low']
df['H-PC'] = abs(df['High'] - df['Close'].shift(1))
df['L-PC'] = abs(df['Low'] - df['Close'].shift(1))
df['TR'] = df[['H-L', 'H-PC', 'L-PC']].max(axis=1)
df['ATR'] = df['TR'].rolling(period).mean()
return df.drop(['H-L', 'H-PC', 'L-PC', 'TR'], axis=1)
# 市场能量潮(MET)指标计算
def calculate_MET(df, period=14):
# 价格二阶导数(使用5日均线的加速度)
df['MA5'] = df['Close'].rolling(5).mean()
df['Price_Derivative2'] = df['MA5'].diff().diff()
# 成交量势能
df['Volume_EMA'] = df['Volume'].ewm(span=period).mean()
df['V_t'] = df['Volume'] / df['Volume_EMA']
# 波动率热能(ATR相对强度)
df = calculate_ATR(df, period)
df['ATR_EMA'] = df['ATR'].ewm(span=period).mean()
df['H_t'] = df['ATR'] / df['ATR_EMA']
# 动态权重调整
df['Beta'] = np.where(df['V_t'] > 1, 0.5, 0.3)
df['Gamma'] = np.where(df['H_t'] > 1, 0.2, 0.3)
df['Alpha'] = 1 - df['Beta'] - df['Gamma']
# 标准化处理(消除量纲影响)
df['Price_Derivative2_norm'] = (df['Price_Derivative2'] - df['Price_Derivative2'].rolling(50).mean()) / df[
'Price_Derivative2'].rolling(50).std()
df['V_t_norm'] = (df['V_t'] - df['V_t'].rolling(50).mean()) / df['V_t'].rolling(50).std()
df['H_t_norm'] = (df['H_t'] - df['H_t'].rolling(50).mean()) / df['H_t'].rolling(50).std()
# 计算能量场强度EFI
df['EFI'] = df['Alpha'] * df['Price_Derivative2_norm'] + df['Beta'] * df['V_t_norm'] + df['Gamma'] * df['H_t_norm']
# 计算MET方向(3日EMA平滑)
df['MET_Direction'] = df['EFI'].diff().ewm(span=3).mean()
# 生成交易信号
df['Buy_Signal'] = (df['EFI'] > 0.6) & (df['MET_Direction'] > 0)
df['Sell_Signal'] = (df['EFI'] < 0.4) & (df['MET_Direction'] < 0)
return df
# 可视化函数
def visualize_MET(df, ticker):
plt.figure(figsize=(16, 12))
gs = gridspec.GridSpec(3, 1, height_ratios=[3, 1, 2])
# 价格走势和交易信号
ax1 = plt.subplot(gs[0])
ax1.plot(df['Close'], label='Price', linewidth=1)
ax1.scatter(df.index[df['Buy_Signal']], df['Close'][df['Buy_Signal']],
marker='^', color='g', s=100, label='Buy Signal')
ax1.scatter(df.index[df['Sell_Signal']], df['Close'][df['Sell_Signal']],
marker='v', color='r', s=100, label='Sell Signal')
ax1.set_title(f'{ticker} Price with MET Signals')
ax1.legend()
# 能量场强度EFI
ax2 = plt.subplot(gs[1])
ax2.plot(df['EFI'], label='Energy Field Intensity', color='purple')
ax2.axhline(0.6, linestyle='--', color='orange')
ax2.axhline(0.4, linestyle='--', color='blue')
ax2.fill_between(df.index, df['EFI'], 0.6, where=(df['EFI'] >= 0.6),
facecolor='red', alpha=0.3)
ax2.fill_between(df.index, df['EFI'], 0.4, where=(df['EFI'] <= 0.4),
facecolor='green', alpha=0.3)
ax2.set_ylim(0, 1)
ax2.legend()
# MET方向
ax3 = plt.subplot(gs[2])
ax3.bar(df.index, df['MET_Direction'], color=np.where(df['MET_Direction'] > 0, 'g', 'r'))
ax3.set_title('MET Direction (Energy Flow)')
plt.tight_layout()
plt.show()
# 主程序
if __name__ == "__main__":
# 参数设置
ticker = '002364.yahoo' # 改为你要分析的股票代码
start_date = '2025-01-01'
end_date = '2025-03-02'
# 获取数据
print(f"Downloading {ticker} data...")
df = yf.download(ticker, start=start_date, end=end_date)
# 计算指标
print("Calculating MET indicators...")
df = calculate_MET(df)
# 可视化结果
print("Generating visualization...")
visualize_MET(df, ticker)
# 显示最近20天的EFI值
print("\nRecent EFI Values:")
print(df[['Close', 'EFI', 'MET_Direction']].tail(20))