import pandas as pd
import numpy as np
import mplfinance as mpf
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import yfinance as yf
# 定义EMA计算函数
def EMA(series, window):
return series.ewm(span=window, adjust=False).mean()
# 计算MACD相关指标
SHORT, LONG, M = 12, 26, 9
df['EMA12'] = EMA(df['Close'], SHORT)
df['EMA26'] = EMA(df['Close'], LONG)
df['LIJINW1'] = df['EMA12'] - df['EMA26']
df['LIJINW2'] = EMA(df['LIJINW1'], M)
# 计算买卖信号
df['金叉'] = (df['LIJINW1'] > df['LIJINW2']) & (df['LIJINW1'].shift(1) <= df['LIJINW2'].shift(1))
df['死叉'] = (df['LIJINW1'] < df['LIJINW2']) & (df['LIJINW1'].shift(1) >= df['LIJINW2'].shift(1))
# 计算RSI类指标
N1, N2 = 7, 14
df['LC'] = df['Close'].shift(1)
df['变化'] = df['Close'] - df['LC']
df['正变化'] = df['变化'].clip(lower=0)
df['MEMA正7'] = EMA(df['正变化'], N1)
df['MEMA绝7'] = EMA(df['变化'].abs(), N1)
df['LIJINWE1'] = df['MEMA正7'] / df['MEMA绝7'] * 100
df['MEMA正14'] = EMA(df['正变化'], N2)
df['MEMA绝14'] = EMA(df['变化'].abs(), N2)
df['LIJINWE2'] = df['MEMA正14'] / df['MEMA绝14'] * 100
# 计算均线
df['MA3'] = EMA(df[
'Close'], 3)
df['MA26'] = EMA(df['Close'], 26)
# 准备绘图数据
df = df.dropna()
df['Date'] = df.index
df['Date_num'] = df['Date'].map(mdates.date2num)
# 创建自定义K线颜色
colors = []
for i in range(len(df)):
if df['LIJINW1'].iloc[i] > df['LIJINW2'].iloc[i]:
colors.append('red')
else:
colors.append('green')
# 创建绘图对象
fig, ax = plt.subplots(figsize=(15, 8))
# 绘制K线
for i in range(len(df)):
date = df['Date_num'].iloc[i]
open_p = df['Open'].iloc[i]
close = df['Close'].iloc[i]
high = df['High'].iloc[i]
low = df['Low'].iloc[i]
color = colors[i]
# 绘制影线
ax.plot([date, date], [low, high], color=color, lw=1)
# 绘制实体
if close > open_p:
ax.fill_between([date-0.2, date+0.2], open_p, close, color=color, edgecolor=color)
else:
ax.fill_between([date-0.2, date+0.2], close, open_p, color=color, edgecolor=color)
# 绘制均线
ax.plot(df['Date_num'], df['MA3'], color='white', lw=2, label='MA3')
ax.plot(df['Date_num'], df['MA26'], color='yellow', lw=2, label='MA26')
# 标记买卖信号
for idx in df[df['金叉']].index:
ax.text(mdates.date2num(idx), df.loc[idx, 'Low'], '买',
color='white', ha='center', va='bottom', fontsize=10)
for idx in df[df['死叉']].index:
ax.text(mdates.date2num(idx), df.loc[idx, 'High'], '卖',
color='yellow', ha='center', va='top', fontsize=10)
# 设置日期格式
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'
))
plt.xticks(rotation=45)
plt.title(f'{symbol} 股票分析图表')
plt.xlabel('日期')
plt.ylabel('价格')
plt.legend()
plt.tight_layout()
plt.show()
STICKLINE(VAR1>VAR2, CLOSE, OPEN, 3.5, 0), COLORRED;STICKLINE(VAR1>VAR2, HIGH, LOW, 0, 0), COLORRED;STICKLINE(VAR1<=VAR2, CLOSE, OPEN, 3.5, 0), COLORGREEN;STICKLINE(VAR1<=VAR2, HIGH, LOW, 0, 0), COLORBLUE;