
准备环境与tushare初始化
安装tushare库并导入,使用个人token初始化pro接口。token在tushare官网注册后获取,设置ts.set_token('你的token'),随后创建pro = ts.pro_api()。若未安装,通过pip install tushare完成。
获取股票日线数据
调用pro.daily接口,参数包括ts_code(股票代码),start_date和end_date(格式为YYYYMMDD)。例如获取平安银行(000001.SZ)2023年数据:

import tushare as ts
import pandas as pd
import matplotlib.pyplot as plt
# 设置token并初始化
ts.set_token('你的token')
pro = ts.pro_api()
# 获取日线数据
df = pro.daily(ts_code='000001.SZ', start_date='20230101', end_date='20231231')
返回的DataFrame包含trade_date、open、high、low、close等列。注意trade_date为字符串,需转换为日期格式。
数据预处理与清洗
检查数据缺失值和重复值,删除空行。将trade_date转为datetime类型并设为索引,按日期升序排序,以确保折线图时间顺序正确。
df['trade_date'] = pd.to_datetime(df['trade_date'])
df.set_index('trade_date', inplace=True)
df.sort_index(inplace=True)
若需复权价格,可调用pro.adj_factor获取复权因子,计算后复权价。这里以不复权直接绘制,但实际分析中常使用前复权数据。
绘制收盘价折线图
使用matplotlib绘制收盘价序列,设置图形大小、标题、坐标轴标签,网格线增强可读性。
plt.figure(figsize=(12,6))
plt.plot(df.index, df['close'], color='blue', linewidth=1.5, label='收盘价')
plt.title('000001.SZ 收盘价走势(2023)')
plt.xlabel('日期')
plt.ylabel('收盘价(元)')
plt.grid(True, linestyle='--', alpha=0.6)
plt.legend()
plt.show()
进阶:添加移动平均线
为分析趋势,可叠加5日、20日移动均线。使用rolling函数计算移动平均。
df['MA5'] = df['close'].rolling(window=5).mean()
df['MA20'] = df['close'].rolling(window=20).mean()
plt.plot(df.index, df['MA5'], label='MA5', linestyle='--')
plt.plot(df.index, df['MA20'], label='MA20', linestyle='--')
完整代码示例
整合以上过程,完整代码如下:
import tushare as ts
import pandas as pd
import matplotlib.pyplot as plt
# 设置token
ts.set_token('你的token')
pro = ts.pro_api()
# 获取数据
df = pro.daily(ts_code='000001.SZ', start_date='20230101', end_date='20231231')
# 数据清洗
df['trade_date'] = pd.to_datetime(df['trade_date'])
df = df.drop_duplicates(subset='trade_date')
df = df.sort_values('trade_date')
df.set_index('trade_date', inplace=True)
# 计算移动平均
df['MA5'] = df['close'].rolling(5).mean()
df['MA20'] = df['close'].rolling(20).mean()
# 绘制
plt.figure(figsize=(14,7))
plt.plot(df['close'], label='收盘价', linewidth=2)
plt.plot(df['MA5'], label='5日均线', linestyle='--')
plt.plot(df['MA20'], label='20日均线', linestyle='--')
plt.title('收盘价及均线走势')
plt.xlabel('日期')
plt.ylabel('价格')
plt.grid(True)
plt.legend()
plt.show()
处理可能遇到的问题
token权限:部分接口需要付费权限,若获取失败,检查token权限。
数据频率:daily接口为日线,若需周线或月线,可resample重采样。
中文显示:matplotlib默认不支持中文,需设置中文字体(如SimHei)或使用plt.rcParams['font.sans-serif'] = ['SimHei']。
其他可视化技巧
使用plotly可生成交互式图表,便于缩放查看细节。
import plotly.graph_objects as go
fig = go.Figure(data=go.Scatter(x=df.index, y=df['close'], mode='lines', name='收盘价'))
fig.update_layout(title='交互式收盘价折线图')
fig.show()
通过tushare包提取数据,经过数据清洗和转换,使用matplotlib绘制收盘价折线图,步骤清晰,代码简洁。此方法适用于任何股票,结合技术指标可进行深入分析。