# 创建买入和卖出的 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()
效果如下:
微信扫码加好友
全部评论