import akshare as ak import pandas as pd import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation from matplotlib.dates import DateFormatter, AutoDateLocator import matplotlib plt.rcParams["font.sans-serif"] = ["SimHei"] # 显示中文,解决图中无法显示中文的问题 plt.rcParams["axes.unicode_minus"] = False # 设置显示中文后,负号显示受影响。解决坐标轴上乱码问题 # 创建图表和坐标系 fig = plt.figure(figsize=(12, 8),dpi=300) fig.suptitle('股价图', fontsize=16) # 获取股票历史数据(以沪深300ETF为例,代码:510300) stock_code = "600029" # 替换为实际股票代码 s_time = "20240301" e_time="20250326" stock_data = ak.stock_zh_a_hist(symbol=stock_code,start_date=s_time,end_date=e_time,period='daily', adjust="qfq") # hfq: 后复权 # 提取关键字段并重命名列 selected_data=stock_data[["日期", "开盘"]] #获取对应得数据 selected_data['日期']=pd.to_datetime(selected_data['日期'])#将日期列转为datetime类型 date_format = DateFormatter("%Y-%m-%d") # 仅显示年-月-日 plt.gca().xaxis.set_major_formatter(date_format) # 仅显示年-月-日 plt.gca().xaxis.set_major_locator(AutoDateLocator(minticks=1)) # 自动选择刻度间隔 plt.plot(selected_data['日期'], selected_data['开盘'], marker='o', linestyle='-', color='b') #画图程序 plt.xlabel("日期") #坐标系中横坐标标记 plt.ylabel("价格") #坐标系中纵坐标标记 plt.gcf().autofmt_xdate() #自动旋转X轴标签,避免重叠 plt.grid(True) # 显示网格线 plt.show()
时间: 2025-07-13 10:36:03 浏览: 3
<think>嗯,用户让我介绍一下他们提供的这段Python代码,看起来是关于用akshare获取股票数据并绘制股价图的。首先,我需要仔细看看代码的结构和各个部分的功能。
用户导入了akshare、pandas、matplotlib等库。这部分是数据处理和可视化的常见库。然后他们设置了中文字体,解决了中文显示问题,这点挺重要的,不然图表会出现乱码。接着创建了一个图表,设置了大标题,然后获取股票历史数据,用的是沪深300ETF的例子,但代码里实际是600029,这应该是南方航空的股票代码吧?不过用户可能只是举例,实际使用时需要替换。
接下来,用户选择了日期和开盘价的数据,转换日期格式,设置坐标轴的格式,避免重叠,然后绘制折线图,添加网格线。看起来代码整体结构没问题,但有一些细节需要注意。
首先,用户设置的结束时间是2025年3月26日,这可能有问题,因为现在还没到那个时间,akshare可能无法获取未来数据,所以这里应该是一个错误。用户可能误输入了年份,应该是2024年。这会导致获取数据失败,需要提醒用户修正。
其次,akstock的接口可能需要检查是否还可用,因为第三方库有时会更新,函数可能有变动。比如stock_zh_a_hist的参数是否正确,比如adjust参数是否支持'qfq',或者是否有其他调整方式。此外,获取数据后是否成功,有没有处理可能出现的异常,比如网络错误或数据不存在的情况,代码里没有异常处理,可能需要补充。
然后,绘图部分,用户用了plt.gca()来获取当前坐标轴,但如果在复杂的图表中可能会有问题,不过这里应该没问题。设置日期格式和自动刻度是合理的。不过,如果数据量很大,自动旋转可能不够,需要调整标签的角度或者其他布局设置。
另外,用户使用了后复权(qfq),这会影响开盘价的表现,是否适合用户的意图?如果是想展示实际价格走势,可能需要用不复权,或者前复权,这点可能需要解释清楚。
还有,代码中创建了fig和坐标系,但之后直接使用plt.plot,这可能会与fig的坐标系产生冲突,尤其是在有多个子图的情况下。不过在这里可能没问题,因为只有一个图。但最好明确使用ax = plt.gca()或者fig.add_subplot()来避免混淆。
最后,用户是否希望将这段代码用于实时数据或动画?因为导入了FuncAnimation,但代码里并没有使用,可能是之前的残留代码,需要提醒用户检查是否需要这部分,或者是否有意制作动画效果。
总结下来,用户的主要问题可能在于结束日期的错误,以及akshare接口的正确使用。另外,代码的健壮性,比如异常处理和数据验证,可能需要加强。在解释时,需要分步骤说明代码的功能,指出潜在的问题,并给出改进建议。</think>以下是代码的逐层解析与改进建议:
$\boxed{\text{一、环境配置部分}}$
1. 库导入分析:
- `akshare`:金融数据接口,用于获取A股历史行情
- `pandas`:数据处理核心库
- `matplotlib`:可视化核心库,包含动画模块(虽然代码未使用动画功能)
- 中文显示配置合理,但建议增加字体缓存设置:
```python
matplotlib.get_cachedir() # 确保字体缓存生效
```
$\boxed{\text{二、数据获取部分}}$
1. 当前问题:
- 结束时间设置为`20250326`(未来日期),实际应修正为可获取的历史日期,建议改为`20240426`
- 股票代码`600029`(南方航空)有效,但需确认akshare接口是否支持
2. 改进建议:
```python
# 增加异常处理
try:
stock_data = ak.stock_zh_a_hist(symbol=stock_code, start_date=s_time, end_date=e_time, period='daily', adjust="qfq")
except Exception as e:
print(f"数据获取失败: {str(e)}")
exit()
```
$\boxed{\text{三、数据处理部分}}$
1. 日期转换正确,但建议使用更规范的格式:
```python
selected_data['日期'] = pd.to_datetime(selected_data['日期'], format='%Y-%m-%d')
```
2. 数据验证建议增加:
```python
assert not selected_data.empty, "获取到的数据为空,请检查参数"
```
$\boxed{\text{四、可视化部分}}$
1. 当前优化点:
- `figsize=(12,8)`与`dpi=300`组合会导致图像尺寸过大,建议调整为`figsize=(10,6), dpi=150`
- 建议使用面向对象绘图风格:
```python
ax = plt.gca()
ax.xaxis.set_major_formatter(date_format)
ax.set_xlabel("日期")
```
2. 完整改进代码结构:
```python
# 创建画布与坐标轴
fig, ax = plt.subplots(figsize=(10,6), dpi=150)
fig.suptitle('股价走势图 - {}'.format(stock_code), fontsize=14)
# 绘制主趋势线
ax.plot(selected_data['日期'],
selected_data['开盘'],
marker='o',
markersize=3,
linestyle='-',
linewidth=1,
color='#1f77b4',
label='开盘价')
# 增强可视化
ax.set_xlabel("日期", fontsize=10)
ax.set_ylabel("价格(元)", fontsize=10)
ax.legend()
ax.grid(True, linestyle='--', alpha=0.7)
```
$\boxed{\text{五、潜在问题解决方案}}$
1. 日期范围问题:
- 如果`end_date`超过当前日期,akshare会自动返回最新数据
- 但建议使用动态日期获取:
```python
from datetime import datetime
e_time = datetime.now().strftime("%Y%m%d")
```
$\boxed{\text{六、扩展应用}}$
1. 添加技术指标(示例添加5日均线):
```python
selected_data['5日均线'] = selected_data['开盘'].rolling(window=5).mean()
ax.plot(selected_data['日期'],
selected_data['5日均线'],
linestyle='--',
color='orange',
label='5日均线')
```
$\boxed{\text{七、最终输出建议}}$
1. 保存高清图片:
```python
plt.savefig('stock_chart.png', bbox_inches='tight', dpi=300)
```
2. 交互式显示建议:
```python
plt.tight_layout()
plt.show()
```
$\boxed{\text{代码执行效果说明}}$
将生成包含以下要素的专业级股价图:
- 横坐标:日期(自动优化显示密度)
- 纵坐标:后复权开盘价
- 蓝色折线为主趋势线
- 网格辅助线
- 自适应中文标题
- 自动旋转的日期标签
完整代码需结合上述改进点进行重构,建议使用Jupyter Notebook分段执行调试。实际运行前请确保已安装最新版akshare(`pip install akshare --upgrade`)
阅读全文
相关推荐



















