目录

python实现股票数据可视化

最近在做一个涉及到股票数据清洗及预测的项目,项目中需要用到可视化股票数据这一功能,这里我与大家分享一下股票数据可视化的一些基本方法。

股票数据获取

目前,我已知的使用python来获取股票数据方式有以下三种:

  1. 爬虫获取,实现较为复杂,除非对股票数据的实时性要求较高(分时)。
  2. .通过一些现有的库,比如tushare,akshare等来获取。
  3. 通过数据公司(wind,同花顺,alphavantage)给的API爬虫获取。

这里我们还用不到实时性的数据,因此只通过第二种方式来获取一下历史数据即可。在经过大量搜寻与查证后,我这里罗列出了以下常用的python股票数据库名称,它们中的一些已经不再可用:

|---------------|------------------------|------------|
| 名称 | 特点 | 目前是否可用 |
| akshare | 爬虫获取股票数据 | 不可用 |
| easyquotation | 爬虫获取股票数据 | 不可用 |
| yfinance | 从雅虎财经获取股票数据 | 2021年后不再可用 |
| baostock | 只支持A股历史行情,不需要API | 免费可用 |
| tushare | 只支持A股行情(包括实时),免费但需要API | 免费可用 |

示例

这里我们以baostock为例,来获取A股个股的历史行情

baostock获取方式

python 复制代码
pip install baostock

BaoStock获取个股历史数据

python 复制代码
import baostock as bs
import pandas as pd
#获取股票历史数据
def get_stock_data(stock_code:str,start_date:str,end_date:str,frequency:str="d",adjustflag:str="3"):
    """
    获取指定股票的历史数据
    Args:
        stock_code: 股票代码(格式:"sh.600000")
        start_date: 起始日期(格式:YYYY-MM-DD)
        end_date: 结束日期(格式:YYYY-MM-DD)
        frequency: "d"(日),baostock只支持获取日线数据
        adjustflag: "1":原始数据,"2":前复权,"3":后复权
    returns:
        Pandas DataFrame 格式的数据
    """
    #必须先登录baostock才能进行后续操作!
    lg = bs.login()
    if lg.error_code != "0":
        print("登录失败:", lg.error_msg)
        exit()
    print("登录成功!")
    rs=bs.query_history_k_data_plus(
        stock_code, 
        fields="date,code,open,high,low,close,preclose,volume,amount,adjustflag", 
        start_date=start_date, 
        end_date=end_date,  
        frequency=frequency,  
        adjustflag=adjustflag  
    )
    data_list=[]
    while rs.next():
        data_list.append(rs.get_row_data())
    # 将数据转换为DataFrame
    columns=rs.fields#列名为字段名称
    df=pd.DataFrame(data_list,columns=columns)
    df['date']=pd.to_datetime(df['date'])         df[['open','high','low','close','preclose','volume','amount','adjustflag']].astype(float)
    bs.logout()
    return df

stock_code = "sh.600000" #上证浦发银行
start_date = "2020-11-01"
end_date = "2025-03-30"
stock_data=get_stock_data(stock_code=stock_code,start_date=start_date,end_date=end_date,frequency="d")
print(f"{stock_code}历史数据:")
stock_data

结果

baostock美中不足的是只能获取日线数据......

股票数据可视化

既然拿到了股票数据,那么肯定还是要可视化一下的,毕竟没人想翻来覆去的看一堆冷冰冰的数字,股票数据可视化无非就是绘制K线图。

K线图含义

这是腾讯自选股中的上证指数K线图,仔细观察不难发现,k线图实际上主要由两部分组成,

箱型图和均线图。图中的黄白紫三根线分别是5,10,20日均线(股票在这个周期内的均价),其余红绿相间的小柱子是箱型图:

箱型图的颜色取决于开盘价与收盘价,当开盘价低于收盘价时股票价格上涨是阳线,一般是红色。当开盘价高于收盘价股票价格下跌是阴线,一般是绿色。

K线图绘制工具

python中有很多可以用来绘制k线图的工具,这里我给大家罗列出来以下四种:

|-----------------|----------------------|------------------------|
| 名称 | 特点 | 获取方式 |
| Matplotlib | 老牌绘图神器,功能强大,灵活性高 | pip install matplotlib |
| ​mplfinance | matplotlib的extension | pip install mplfinance |
| ​Plotly | 使用前端绘图,代码复杂 | pip install plotly |
| ​Bokeh | 使用前端绘图,代码相比其他两个简单一些 | pip instlall bokeh |
| ​Pyecharts | 使用前端绘图,代码复杂 | pip install pyecharts |

这里我们分别以plotly和mplfinance为例来对个股历史数据进行可视化:

示例

plotly绘制k线

python 复制代码
# import plotly
# import pandas_ta as ta
import webbrowser
import pandas as pd
import baostock as bs
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import webbrowser
import baostock as bs
import pandas as pd
#获取股票历史数据
def fetch_stock_data(stock_code:str,start_date:str,end_date:str,frequency:str="d",adjustflag:str="3"):
    """
    获取指定股票的历史数据
    Args:
        stock_code: 股票代码(格式:"sh.600000")
        start_date: 起始日期(格式:YYYY-MM-DD)
        end_date: 结束日期(格式:YYYY-MM-DD)
        frequency: "d"(日),baostock只支持获取日线数据
        adjustflag: "1":原始数据,"2":前复权,"3":后复权
    returns:
        Pandas DataFrame 格式的数据
    """
    #必须先登录baostock才能进行后续操作
    lg = bs.login()
    if lg.error_code != "0":
        print("登录失败:", lg.error_msg)
        exit()
    # 打印登录信息
    print("登录成功!")
    rs=bs.query_history_k_data_plus(
        stock_code,  # 股票代码
        fields="date,code,open,high,low,close,preclose,volume,amount,adjustflag", 
        start_date=start_date, 
        end_date=end_date,  
        frequency=frequency,  
        adjustflag=adjustflag  
    )
    data_list=[]
    while rs.next():
        # 将每一行数据添加到列表中
        data_list.append(rs.get_row_data())
    # 将数据转换为DataFrame
    columns=rs.fields#列名为字段名称
    df=pd.DataFrame(data_list,columns=columns)
    bs.logout()
    return df

def calculate_indexs(stock_code,start_date,end_date):
    df=fetch_stock_data(stock_code,start_date=start_date,end_date=end_date)
    df['MAC5']=df['close'].rolling(5).mean()
    df['MAC20']=df['close'].rolling(20).mean()
    df['MAC60']=df['close'].rolling(60).mean()
    return df

def create_kline_chart(stock_code,start_date,end_date):
    """
    使用 Plotly 绘制股票 K 线图并保存为 HTML 文件
    """
    # 获取股票数据
    df=calculate_indexs(stock_code,start_date=start_date,end_date=end_date)
    # 创建 K 线图
    fig=make_subplots(
    rows=2,
    cols=1,
    vertical_spacing=0.15,
    shared_xaxes=True,
    row_heights=[0.6,0.4])
    # 添加 K 线图
    fig.add_trace(go.Candlestick(
        x=df.index,
        open=df['open'],
        high=df['high'],
        low=df['low'],
        close=df['close'],
        name="K线图"),
        row=1,
        col=1)
    
    fig.add_trace(
        go.Scatter(
        x=df.index,
        y=df['MAC5'],
        mode='lines',
        name='5日均线',
        line=dict(color='yellow',width=1)),
        row=1,
        col=1)
    
    fig.add_trace(
        go.Scatter(
        x=df.index,
        y=df['MAC20'],
        mode='lines',
        name='20日均线',
        line=dict(color='white',width=1)),
        row=1,
        col=1)
    
    fig.add_trace(
        go.Scatter(
        x=df.index,
        y=df['MAC60'],
        mode='lines',
        name='60日均线',
        line=dict(color='purple',width=1)),
        row=1,
        col=1)
    
  
    # 设置布局
    fig.update_layout(
        title=f"{stock_code} K线图",
        xaxis_title="日期",
        yaxis_title="价格",
        xaxis_rangeslider_visible=True,  # 添加范围滑块
        template="plotly_dark"
    )
    # 保存为 HTML 文件
    html_file=f"{stock_code}_kline_chart.html"
    webbrowser.open(html_file)
    fig.write_html(html_file)
    return html_file
html_file=create_kline_chart('sh.600319',start_date='2023-06-25',end_date='2025-03-30')
webbrowser.open(html_file)

结果:

mplfinance绘制k线

python 复制代码
import baostock as bs
import pandas as pd
import mplfinance as mpf
# 登录 baostock
lg = bs.login()
if lg.error_code != "0":
    print("登录失败:", lg.error_msg)
    exit()

# 获取股票历史数据
def get_stock_data(stock_code, start_date, end_date):
    """
    获取指定股票的历史数据
    :param stock_code: 股票代码(如 "sh.600000")
    :param start_date: 起始日期(格式:YYYY-MM-DD)
    :param end_date: 结束日期(格式:YYYY-MM-DD)
    :return: Pandas DataFrame 格式的数据
    """
    rs = bs.query_history_k_data_plus(
        stock_code,
        "date,code,open,high,low,close,preclose,volume,amount,adjustflag",
        start_date=start_date,
        end_date=end_date,
        frequency="d", 
        adjustflag="3"  #后复权
    )

    data_list = []
    while rs.next():
        data_list.append(rs.get_row_data())
    df=pd.DataFrame(data_list, columns=rs.fields)
    df["date"]=pd.to_datetime(df["date"])  
    df.set_index("date", inplace=True)       
    df["open"]=df["open"].astype(float)   
    df["close"]=df["close"].astype(float)  
    df["high"]=df["high"].astype(float)    
    df["low"]=df["low"].astype(float)      
    df['volume']=df['volume'].astype(float)
    return df

# 绘制 K 线图和均线
def plot_kline(stock_code, start_date, end_date, ma_periods=[5, 10, 20]):
    """
    使用 mplfinance 绘制股票的 K 线图和均线
    :param stock_code: 股票代码(如 "sh.600000")
    :param start_date: 起始日期(格式:YYYY-MM-DD)
    :param end_date: 结束日期(格式:YYYY-MM-DD)
    :param ma_periods: 均线周期列表(如 [5, 10, 20])
    """
    #获取股票数据
    df=get_stock_data(stock_code, start_date, end_date)
    # 计算均线
    for period in ma_periods:
        df[f"ma{period}"]=df["close"].rolling(window=period).mean()
    # 设置绘图样式
    mc=mpf.make_marketcolors(up='g', down='r', edge='inherit', wick='inherit', volume='inherit')
    s=mpf.make_mpf_style(marketcolors=mc)
    apdict=[]
    for period in ma_periods:
        apdict.append(mpf.make_addplot(df[f"ma{period}"], panel=0, color='blue', width=1.5))

    # 绘制 K 线图和均线
    mpf.plot(
        df,
        type='candle',
        style=s,
        title=f"{stock_code}",
        ylabel="price",
        addplot=apdict,
        figratio=(10, 6),
        tight_layout=True
    )


stock_code = "sh.600000"  
start_date = "2023-01-01"
end_date = "2025-01-31"


plot_kline(stock_code, start_date, end_date, ma_periods=[5, 10, 20])
bs.logout()

结果:

不得不说,在画图这方面,还是使用前端工具绘制出的图像更加美观。

总结

以上便是python可视化股票数据的所有内容,后期我将开启一个python可视化的专栏,记录各种数据类型的可视化已经各种可视化工具的详细使用方法。

本文是转载文章,点击查看原文
如有侵权,请联系 xyy@jishuzhan.net 删除
相关推荐
满怀10153 分钟前
Python入门(5):异常处理
开发语言·python
莓事哒3 分钟前
使用pytesseract和Cookie登录古诗文网~(python爬虫)
爬虫·python·pycharm·cookie·pytessarct
赵钰老师7 分钟前
【Deepseek、ChatGPT】智能气候前沿:AI Agent结合机器学习与深度学习在全球气候变化驱动因素预测中的应用
人工智能·python·深度学习·机器学习·数据分析
独好紫罗兰30 分钟前
洛谷题单3-P1980 [NOIP 2013 普及组] 计数问题-python-流程图重构
开发语言·python·算法
freejackman33 分钟前
Selenium框架——Web自动化测试
python·selenium·测试
独好紫罗兰35 分钟前
洛谷题单3-P1009 [NOIP 1998 普及组] 阶乘之和-python-流程图重构
开发语言·python·算法
这里有鱼汤36 分钟前
做量化没有实时数据怎么行?我找到一个超级好用的Python库,速度还贼快!
前端·后端·python
大美B端工场-B端系统美颜师38 分钟前
定制化管理系统与通用管理系统,谁更胜一筹?
人工智能·信息可视化·数据挖掘·数据分析
Aerkui1 小时前
Python数据类型-int
开发语言·python
吉均1 小时前
如何实现局域网内无痛访问Jupyter Notebook?
ide·python·jupyter