马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
迩来在做一个涉及到股票数据洗濯及猜测的项目,项目中须要用到可视化股票数据这一功能,这里我与各人分享一下股票数据可视化的一些根本方法。
股票数据获取
现在,我已知的使用python来获取股票数据方式有以下三种:
- 爬虫获取,实现较为复杂,除非对股票数据的及时性要求较高(分时)。
- .通过一些现有的库,比如tushare,akshare等来获取。
- 通过数据公司(wind,同花顺,alphavantage)给的API爬虫获取。
这里我们还用不到及时性的数据,因此只通过第二种方式来获取一下汗青数据即可。在颠末大量征采与查证后,我这里摆列出了以下常用的python股票数据库名称,它们中的一些已经不再可用:
| 名称 | 特点 | 现在是否可用 | | akshare | 爬虫获取股票数据 | 不可用 | | easyquotation | 爬虫获取股票数据 | 不可用 | | yfinance | 从雅虎财经获取股票数据 | 2021年后不再可用 | | baostock | 只支持A股汗青行情,不须要API | 免费可用 | | tushare | 只支持A股行情(包罗及时),免费但须要API | 免费可用 | 示例
这里我们以baostock为例,来获取A股个股的汗青行情
baostock获取方式
BaoStock获取个股汗青数据
- 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线
- # 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线
- 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可视化的专栏,记载各种数据范例的可视化已经各种可视化工具的详细使用方法。
|