生生不息

生生不息

AI添加K线图成交量

2025-06-22
AI添加K线图成交量

提示词

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

答案

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写的。

图像: