某只股票波动及ema指标分析Stock analysis


import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 设置中文显示
plt.rcParams["font.family"] = ["SimHei", "Microsoft YaHei", "SimSun", "KaiTi", "FangSong"]
plt.rcParams["axes.unicode_minus"] = False
import akshare as ak
from datetime import datetime, timedelta


def fetch_stock_data(symbol, period='1y'):
    """获取股票数据"""
    end_date = datetime.now().strftime('%Y%m%d')
    start_date = (datetime.now() - timedelta(days=365)).strftime('%Y%m%d')
    
    # 处理股票代码格式,确保符合akshare要求
    if not symbol.startswith(('sh', 'sz')):
        if symbol.startswith(('6', '9')):
            symbol = f"sh{symbol}"
        else:
            symbol = f"sz{symbol}"
    
    # 使用更稳定的stock_zh_a_hist函数获取股票日线数据
    data = ak.stock_zh_a_hist(symbol=symbol[2:],  # 只传股票代码部分,不含sh/sz
                             period="daily",
                             start_date=start_date,
                             end_date=end_date,
                             adjust="qfq")  # 使用前复权价格
    
    # 检查数据是否获取成功
    if data.empty:
        print(f"获取股票{symbol}数据失败,请检查股票代码和网络连接")
        return None
    
    # 先转换日期格式
    if '日期' in data.columns:
        data[601288'日期'] = pd.to_datetime(data['日期'])
        # 设置日期为索引
        data.set_index('日期', inplace=True)
        # 重命名收盘价列
        if '收盘' in data.columns:
            data = data.rename(columns={'收盘': 'Close'})
    else:
        print("数据格式异常,无法处理")
        return None
    
    return data


def calculate_ema(data, window=20):
    """计算指数移动平均线 EMA"""
    ema = data['Close'].ewm(span=window, adjust=False).mean()
    return ema


def calculate_std(data, window=20):
    """计算标准差 STD"""
    std = data['Close'].rolling(window=window).std()
    return std


def plot_analysis(data, ema, std, symbol):
    """绘制图表分析结果"""
    plt.figure(figsize=(14, 8))

    plt.subplot(2, 1, 1)
    plt.plot(data['Close'], label='收盘价', color='blue')
    plt.plot(ema, label='EMA(20)', color='orange')
    plt.title(f'{symbol} 股票价格与EMA分析')
    plt.legend()

    plt.subplot(2, 1, 2)
    plt.plot(std, label='STD(20)', color='red')
    plt.title(f'{symbol} 股票价格波动性(STD)分析')
    plt.legend()

    plt.tight_layout()
    plt.show()


def main():
    symbol = input("请输入股票代码(如 000001 或 600000):")
    data = fetch_stock_data(symbol)
    
    # 检查数据获取是否成功
    if data is not None:
        ema = calculate_ema(data)
        std = calculate_std(data)
        plot_analysis(data, ema, std, symbol)


if __name__ == '__main__':
    main()

我来为您详细解释这个股票分析程序输出的图表和EMA指标的用法:

程序输出的图表说明

程序运行后会生成一个包含两个子图的图表:

1. 股票价格与EMA分析(上图)

  • 蓝色曲线:股票的每日收盘价走势
  • 橙色曲线:20日指数移动平均线(EMA(20))
  • 标题:显示当前分析的股票代码和分析类型
  • 图例:标识不同曲线的含义

2. 股票价格波动性(STD)分析(下图)

  • 红色曲线:20日收盘价的标准差(STD(20))
  • 标题:显示当前分析的股票代码和波动性分析类型
  • 图例:标识标准差曲线

EMA指标详解

什么是EMA?

EMA(Exponential Moving Average)即指数移动平均线,是一种加权移动平均线,对最近的价格给予更多权重,反应更灵敏。

EMA的计算方法

程序中使用的计算公式:

ema = data['Close'].ewm(span=window, adjust=False).mean()
  • span=window:设置计算窗口大小(这里是20天)
  • adjust=False:使用标准的指数移动平均计算公式,不进行调整

数学公式:

EMA(t) = Price(t) × k + EMA(t-1) × (1 - k)
其中:k = 2 / (n + 1),n是窗口大小

EMA与SMA的区别

  • SMA(简单移动平均):对所有周期价格给予相同权重,反应较迟缓
  • EMA(指数移动平均):对近期价格给予更高权重,能更快反映价格变化

20日EMA的具体应用

1. 判断趋势方向

  • 当价格在EMA上方:通常表示处于上升趋势
  • 当价格在EMA下方:通常表示处于下降趋势
  • EMA斜率向上:趋势可能继续上升
  • EMA斜率向下:趋势可能继续下降

2. 支撑位与阻力位

  • 支撑位:价格下跌到EMA附近时可能获得支撑反弹
  • 阻力位:价格上涨到EMA附近时可能遇到阻力回调

3. 交易信号

  • 金叉:短期EMA(如5日)上穿长期EMA(如20日),可能发出买入信号
  • 死叉:短期EMA下穿长期EMA,可能发出卖出信号

4. 价格与EMA的偏离程度

  • 价格与EMA偏离过大时,通常会回归,这是一种超买超卖的判断依据

结合标准差(STD)的分析

  • 标准差:衡量价格的波动性或风险程度
  • 高标准差:价格波动大,风险高,可能处于趋势反转或剧烈波动期
  • 低标准差:价格波动小,风险低,可能处于横盘整理期

实际应用示例

  1. 趋势确认:如果价格持续在20日EMA上方运行,且EMA斜率向上,说明上升趋势强劲
  2. 入场时机:当价格回调到20日EMA附近获得支撑,并伴随成交量放大时,可能是较好的买入时机
  3. 止损设置:可以将止损位设置在20日EMA下方一定比例处,保护利润
  4. 风险评估:结合标准差曲线,如果价格上升但标准差下降,说明趋势稳定;如果标准差同时上升,说明波动加大,风险增加

这个程序提供了基础的技术分析工具,您可以根据自己的交易策略进一步优化参数(如调整EMA的窗口大小)或结合其他技术指标(如MACD、RSI等)进行更全面的分析。