????????最近在做一個涉及到股票數據清洗及預測的項目,項目中需要用到可視化股票數據這一功能,這里我與大家分享一下股票數據可視化的一些基本方法。
股票數據獲取
?目前,我已知的使用python來獲取股票數據方式有以下三種:
- 爬蟲獲取,實現較為復雜,除非對股票數據的實時性要求較高(分時)。
- .通過一些現有的庫,比如tushare,akshare等來獲取。
- 通過數據公司(wind,同花順,alphavantage)給的API爬蟲獲取。
這里我們還用不到實時性的數據,因此只通過第二種方式來獲取一下歷史數據即可。在經過大量搜尋與查證后,我這里羅列出了以下常用的python股票數據庫名稱,它們中的一些已經不再可用:
名稱 | 特點 | 目前是否可用 |
akshare | 爬蟲獲取股票數據 | 不可用 |
easyquotation | 爬蟲獲取股票數據 | 不可用 |
yfinance | 從雅虎財經獲取股票數據 | 2021年后不再可用 |
baostock | 只支持A股歷史行情,不需要API | 免費可用 |
tushare | 只支持A股行情(包括實時),免費但需要API | 免費可用 |
示例?
這里我們以baostock為例,來獲取A股個股的歷史行情?
baostock獲取方式
pip install 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())# 將數據轉換為DataFramecolumns=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 dfstock_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())# 將數據轉換為DataFramecolumns=rs.fields#列名為字段名稱df=pd.DataFrame(data_list,columns=columns)bs.logout()return dfdef 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 dfdef 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可視化的專欄,記錄各種數據類型的可視化已經各種可視化工具的詳細使用方法。