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")
|