提示词

1
在一个DataFrame中,包含股票的开盘价、最高价、最低价、收盘价、成交量。需要用Ploty绘制K线图,添加20日、30日均线,并将成交量以子图的形式绘制在K线图的下方。请给出示例代码。

答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
import pandas as pd
import plotly.graph_objects as go
from plotly.subplots import make_subplots

# 假设df是包含以下列的DataFrame:
# 开盘价(Open), 最高价(High), 最低价(Low), 收盘价(Close), 成交量(Volume)
# 索引应为日期时间类型(DatetimeIndex)
df = pd.read_excel('../数据/历史行情数据.xlsx')

#这次我们保留日期、开盘、收盘、最高、最低、成交量
df = df[['日期', '开盘', '收盘', '最高', '最低', '成交量']]

# 2. 列名规范化(关键步骤!)
print("原始列名:", df.columns.tolist()) # 调试查看实际列名

# 去除列名首尾空格
df.columns = df.columns.str.strip()

# 统一列名映射(根据实际数据调整)
column_mapping = {
'日期': 'Date',
'开盘': 'Open',
'最高': 'High',
'最低': 'Low',
'收盘': 'Close',
'成交量': 'Volume', # 中文常见列名
'volume': 'Volume', # 小写列名
'VOL': 'Volume' # 大写列名
}
df.rename(columns=column_mapping, inplace=True)

# 3. 设置日期索引
df['Date'] = pd.to_datetime(df['Date'])
df.set_index('Date', inplace=True)

# 4. 检查必要列是否存在
required_cols = ['Open', 'High', 'Low', 'Close']
if 'Volume' not in df.columns:
print("警告: Volume列不存在, 自动禁用成交量显示")
volume_param = False
else:
volume_param = True

# 1. 计算技术指标
df['MA20'] = df['Close'].rolling(window=20).mean() # 20日均线
df['MA30'] = df['Close'].rolling(window=30).mean() # 30日均线

# 2. 创建带子图的图表框架
fig = make_subplots(
rows=2, cols=1, # 2行1列布局
shared_xaxes=True, # 共享X轴
vertical_spacing=0.05, # 子图间距
row_heights=[0.7, 0.3], # K线图占70%高度,成交量占30%
specs=[[{"secondary_y": True}], [{}]] # 主图可添加副轴
)

# 3. 添加K线图(主图区域)
fig.add_trace(
go.Candlestick(
x=df.index,
open=df['Open'],
high=df['High'],
low=df['Low'],
close=df['Close'],
name='K线',
increasing_line_color='red', # 阳线颜色
decreasing_line_color='green' # 阴线颜色
),
row=1, col=1
)

# 4. 添加移动平均线(主图区域)
fig.add_trace(
go.Scatter(
x=df.index,
y=df['MA20'],
mode='lines',
name='20日均线',
line=dict(color='blue', width=1.5)
),
row=1, col=1
)

fig.add_trace(
go.Scatter(
x=df.index,
y=df['MA30'],
mode='lines',
name='30日均线',
line=dict(color='orange', width=1.5)
),
row=1, col=1
)

# 5. 添加成交量柱状图(副图区域)
fig.add_trace(
go.Bar(
x=df.index,
y=df['Volume'],
name='成交量',
marker_color='gray', # 统一为灰色
# 可选:按涨跌着色(需结合收盘价和开盘价)
# marker=dict(
# color=[ 'red' if close > open else 'green'
# for close, open in zip(df['Close'], df['Open']) ]
# )
),
row=2, col=1
)

# 6. 设置图表布局
fig.update_layout(
title='股票K线分析',
height=700, # 图表总高度
xaxis_title='日期',
yaxis_title='价格',
# 隐藏非交易日(防止K线断裂)
xaxis_rangeslider_visible=False, # 禁用内置范围滑块(因已有子图)
legend_title='图例说明',
hovermode='x unified' # 鼠标悬停时显示所有数据
)

# 7. 设置Y轴标题(成交量子图)
fig.update_yaxes(title_text="成交量", row=2, col=1)

# 8. 显示图表
fig.show()

# 9. 可选:保存为HTML文件
# fig.write_html("stock_chart.html")

数据导入代码是我加进去的,其余都是ai写的。

图像: