python實現股票數據可視化

????????最近在做一個涉及到股票數據清洗及預測的項目,項目中需要用到可視化股票數據這一功能,這里我與大家分享一下股票數據可視化的一些基本方法。

股票數據獲取

?目前,我已知的使用python來獲取股票數據方式有以下三種:

  1. 爬蟲獲取,實現較為復雜,除非對股票數據的實時性要求較高(分時)。
  2. .通過一些現有的庫,比如tushare,akshare等來獲取。
  3. 通過數據公司(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
?mplfinancematplotlib的extensionpip 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可視化的專欄,記錄各種數據類型的可視化已經各種可視化工具的詳細使用方法。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/75014.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/75014.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/75014.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【15】Selenium 爬取實戰

一、selenium適用場景 二、爬取目標 三、爬取列表頁 (1)初始化 (2)加載列表頁 (3)解析列表頁 (4)main 四、爬取詳情頁 (1)加載詳情頁 (2…

如何封裝一個上傳文件組件

#今天用el-upload感到很多不方便,遂決定自己封裝一個。注:本文不提供表面的按鈕樣式和文件上傳成功后的樣式,需要自己創建。本文僅介紹邏輯函數# 1,準備幾個表面用來指引上傳的元素 2,創造統一的隱藏文件上傳輸入框&…

【計網】數據包

期末復習自用的,處理得比較草率,復習的同學或者想看基礎的同學可以看看,大佬的話可以不用浪費時間在我的水文上了 1.數據包的定義: 數據包是網絡通信中的基本單元,它包含了通過網絡傳輸的所有必要信息。數據包的結構…

HTTP抓包Websocket抓包(Fiddler)

近期時常要和各個廠商的java云平臺打交道:登錄、上傳、下載等,程序的日志雖必不可少,但前期調試階段,免不了遇到問題,這時有一個稱手的抓包工具就顯得尤為重要了。 Fiddler Everywhere是一款跨平臺的網絡調試工具&…

Git和GitCode使用(從Git安裝到上傳項目一條龍)

第一步 菜鳥教程-Git教程 點擊上方鏈接,完成Git的安裝,并了解Git 工作流程,知道Git 工作區、暫存區和版本庫的區別 第二步 GitCode官方幫助文檔-SSH 公鑰管理 點擊上方鏈接,完成SSH公鑰設置 第三步(GitCode的官方引…

基于 WebAssembly 的 Game of Life 交互實現

一、前言 在前期的實現中,我們使用 Rust 編寫核心邏輯,并通過 WebAssembly 將其引入到 Web 環境中,再利用 JavaScript 進行渲染。接下來,我們將在這一基礎上增加用戶交互功能,使模擬過程不僅能夠自動演化,…

【keil】單步調試

一、步驟 1、打開stc-isp軟件 2.打開keil仿真設置,選擇對應的單片機型號 3.點擊將所選目標單片機設置為仿真芯片,點擊下載,按一下單片機打下載按鈕 4.此時已經將仿真程序下載到單片機 5.此時點擊options,找到debug選擇STC Montor 51 Driv…

c++弱指針實現原理

在 C 中,弱指針(std::weak_ptr)是一種特殊的智能指針,其核心目標是?解決 std::shared_ptr 的循環引用問題?,同時不增加對象的引用計數。它的實現原理基于與 std::shared_ptr 共享的 ?控制塊(Control Blo…

【ManiSkill】環境success條件和reward函數學習筆記

1. “PickCube-v1” info["success"]:用于指示任務是否成功完成 布爾型張量,在環境的evaluate()方法中計算并返回: "success": is_obj_placed & is_robot_static這確保了機器人不僅能將物體準確放置在目標位置&am…

用空閑時間做了一個小程序-二維碼生成器

一直在摸魚中賺錢的大家好呀~ 先向各位魚友們匯報一下情況,目前小程序已經有900的魚友注冊使用過。雖然每天都有新的魚友注冊,但是魚友增長的還很緩慢。自從國慶前的文字轉語音的工具上線到現在已經將近有1個月沒有更新小程序了。但是今天終終終終終于又…

31天Python入門——第14天:異常處理

你好,我是安然無虞。 文章目錄 異常處理1. Python異常2. 異常捕獲try-except語句捕獲所有的異常信息獲取異常對象finally塊 3. raise語句4. 自定義異常5. 函數調用里面產生的異常補充練習 異常處理 1. Python異常 Python異常指的是在程序執行過程中發生的錯誤或異…

PyQt6實例_批量下載pdf工具_使用pyinstaller與installForge打包成exe文件

目錄 前置: 步驟: step one 準備好已開發完畢的項目代碼 step two 安裝pyinstaller step three 執行pyinstaller pdfdownload.py,獲取初始.spec文件 step four 修改.spec文件,將data文件夾加入到打包程序中 step five 增加…

Axure項目實戰:智慧城市APP(完整交互匯總版)

親愛的小伙伴,在您瀏覽之前,煩請關注一下,在此深表感謝! 課程主題:智慧城市APP 主要內容:主功能(社保查詢、醫療信息、公交查詢等)、活動、消息、我的頁面匯總 應用場景&#xff…

Appium Inspector使用教程

1.下載最新版本 https://github.com/appium/appium-inspector/releases 2.本地啟動一個Appium服務 若Android SDK已安裝Appium服務,則在任意terminal使用appium啟動服務即可 3.Appium Inspector客戶端配置連接到Appium服務 Configuring and Starting a Session…

Pycharm(七):幾個簡單案例

一.剪刀石頭布 需求:和電腦玩剪刀石頭布游戲 考察點:1.隨機數;2.判斷語句 import random # numrandom.randint(1,3) # print(num) # print(**30) #1.錄入玩家手勢 playerint(input(請輸入手勢:(1.剪刀 2.石頭 3&…

Python Cookbook-4.13 獲取字典的一個子集

任務 你有一個巨大的字典,字典中的一些鍵屬于一個特定的集合,而你想創建一個包含這個鍵集合及其對應值的新字典。 解決方案 如果你不想改動原字典: def sub_dict(somedict,somekeys,default None):return dict([(k, somedict.get(k,default)) for k…

VMware Ubuntu 網絡配置全攻略:從斷網到暢通無阻

一、網絡連接模式選擇(先搞懂原理) VMware提供三種網絡模式,就像手機的不同網絡套餐: 模式適用場景特點類比NAT個人上網/新手首選虛擬機共享主機IP,能上網但隱身家用WiFi橋接服務器/需要被局域網訪問虛擬機會獲得獨立…

鏈表(C++)

這是本人第二次學習鏈表,第一次學習鏈表是在大一上的C語言課上,首次接觸,感到有些難;第二次是在大一下學習數據結構時(就是這次),使用C再次理解鏈表。同時,這也是開啟數據結構學習寫…

【SPP】藍牙串口協議應用層深度解析:從連接建立到實戰開發

目錄 一、SPP應用層協議框架與角色模型 1.1 分層協議棧模型 1.2 設備角色模型(DevA 與 DevB 交互) 二、連接建立流程:從 SDP 到 RFCOMM 2.1 服務發現(SDP)流程(SDP 記錄關鍵參數) 2.2 連接…

Giteki 認證:無線產品進入日本市場的關鍵保障

目錄 適用產品認證范圍 認證項目及技術要求 認證流程 認證周期 與其他認證的對比 常見問題 注意事項 Giteki 認證,其名稱來源于日本語 “技適マーク”,羅馬字拼寫為 “GITEKI” ,在行業內也常被稱為 Telec 認證、MIC 認證、RF 認證或技…