用mpf绘制股票买入卖出K线图示例

18人浏览 / 0人评论 / 添加收藏

用mpf绘制买入卖出K线图示

需要在K线图上标识出买入卖出的标识。
增加买入卖出图示标识,与matplotlib绘图用法一致。

# 创建买入和卖出的 addplot 对象
ap_buy = mpf.make_addplot(df['Buy'], type='scatter', marker='^', markersize=100, color='g', panel=0)
ap_sell = mpf.make_addplot(df['Sell'], type='scatter', marker='v', markersize=100, color='r', panel=0)
 

用随机数模拟OLHC数值。

import pandas as pd
import numpy as np
import mplfinance as mpf
import matplotlib.pyplot as plt

# 模拟生成150天的股票数据
np.random.seed(4222)  # 设置随机种子以保证结果可复现
days = 150
dates = pd.date_range(start='2025-01-01', periods=days, freq='D')

# 使用随机游走模型生成价格数据
open_price = 100  # 初始开盘价
data = {
   'Date': dates,
   'Open': np.round(open_price + np.cumsum(np.random.normal(0, 3, days)), 2),
   'High': np.zeros(days),
   'Low': np.zeros(days),
   'Close': np.zeros(days),
   'Volume': np.random.randint(500, 2000, size=days)
}

# 根据开盘价,用随机数模拟,计算最高价、最低价和收盘价
for i in range(days):
   data['High'][i] = max(data['Open'][i], data['Open'][i] + np.random.normal(0, 2))
   data['Low'][i] = min(data['Open'][i], data['Open'][i] + np.random.normal(-2, 1))
   data['Close'][i] = data['Open'][i] + np.random.normal(0, 1)

# 保留2位小数
data['High'] = np.round(data['High'], 2)
data['Low'] = np.round(data['Low'], 2)
data['Close'] = np.round(data['Close'], 2)

# 转换为DataFrame,并将日期设置为索引
df = pd.DataFrame(data)
df.set_index('Date', inplace=True)  # 设置日期为索引

# 增加两列,初始化买入和卖出信号(NaN 表示没有信号)
df['Buy'] = np.nan
df['Sell'] = np.nan

# 在指定日期买入和卖出
buy_dates = ['2025-01-21', '2025-03-12']  # 买入日期
sell_dates = ['2025-02-20', '2025-04-18']  # 卖出日期

# 将买入和卖出信号标记到 DataFrame 中
for date in buy_dates:
   df.loc[date, 'Buy'] = df.loc[date, 'Close']
for date in sell_dates:
   df.loc[date, 'Sell'] = df.loc[date, 'Close']

# 创建自定义市场颜色风格
mc = mpf.make_marketcolors(
   up='red',          # 上涨K线颜色
   down='green',      # 下跌K线颜色
   edge='inherit',    # K线边缘颜色
   wick='black',      # 影线颜色
   volume='in'        # 成交量颜色(与K线一致)
)

# 创建自定义样式
style = mpf.make_mpf_style(
   marketcolors=mc,
   mavcolors=['orange', 'blue', 'purple', 'yellow'],  # 均线颜色
   gridstyle='--'                   # 网格线样式
)

# 添加技术指标(例如移动平均线)
mav = (5, 10, 20, 60)  # 5日、10日、20日、60日均线

# 创建买入和卖出的 addplot 对象
ap_buy = mpf.make_addplot(df['Buy'], type='scatter', marker='^', markersize=100, color='g', panel=0)
ap_sell = mpf.make_addplot(df['Sell'], type='scatter', marker='v', markersize=100, color='r', panel=0)

# 绘制K线图,并获取返回对象
fig, axlist = mpf.plot(
   df,
   type='candle',          # K线图类型
   style=style,            # 使用自定义样式
   title='Stock Price with Buy/Sell Signals',  # 图表标题
   ylabel='Price',          # Y轴标签
   ylabel_lower='Volume',   # 成交量Y轴标签
   volume=True,             # 显示成交量
   mav=mav,                 # 移动平均线
   figratio=(16, 8),        # 图形比例
   figscale=0.8,            # 图形缩放比例
   xrotation=45,            # 旋转横轴标签角度
   datetime_format='%Y-%m-%d',  # 设置横轴日期格式为 YYYY-MM-DD
   tight_layout=False,      # 紧凑布局
   addplot=[ap_buy, ap_sell],  # 添加买入和卖出信号
   returnfig=True           # 返回图形对象以便进一步修改
)

# 获取成交量子图
volume_ax = axlist[2]

# 手动调整成交量柱状图边框颜色
for bar in volume_ax.patches:
   bar.set_edgecolor(bar.get_facecolor())  # 设置边框颜色与柱体颜色一致

# 显示图表
plt.show()
 

效果如下:

全部评论