:Python獲取A股行情、財務與龍虎榜數據全指南)
這話我特別有感觸。前幾年剛開始接觸量化分析的時候最折磨我的不是策略寫不出來而是數據從哪來。今天用這個免費接口、明天手工從財經網站復制數據格式不統(tǒng)一、字段對不上、歷史數據缺胳膊少腿一套策略還沒跑起來光折騰數據就花掉一半時間。后來換到 Tushare Pro才算是把這個問題徹底解決掉。這篇文章我就以一線使用的視角把從環(huán)境搭建到實戰(zhàn)拿數的完整過程捋一遍代碼全部可以直接復制運行希望能幫你少走一些彎路。1. 為什么我選擇用 Tushare Pro 解決 A 股數據獲取問題先說說這個工具到底解決的是什么痛點。做 A 股數據分析的朋友應該都有體會行情軟件能看圖但數據導出來麻煩爬蟲自己寫動不動就被反爬策略擋住而且歷史數據補全也是大工程市面上各種付費數據終端價格對個人玩家來說又不太友好。Tushare Pro 走的是另一種路子——它把數據整理好、接口化你只需要用 Python 調用就能拿到結構化的行情、財務、龍虎榜等數據。我當時的判斷標準其實就三條這也決定了后來長時間的使用體驗。第一條是數據覆蓋面。日線行情、分鐘線、財務指標、資產負債表、利潤表、龍虎榜、融資融券、大宗交易、期貨數據基本上你平時做研究能想到的品種它都有對應的接口。這意味著我不需要在多個數據源之間來回切換一個庫解決大部分問題。第二條是接口設計。Tushare Pro 的接口是標準化的返回的是 pandas DataFrame和 Python 生態(tài)無縫銜接。拿到數據之后直接就能做計算、畫圖、建模不需要自己再做一層繁瑣的格式轉換。這一點對后續(xù)所有工作流來說都是巨大的效率提升。第三條是免費額度路徑。雖然部分接口有積分門檻但注冊、完善資料、參與社區(qū)任務都能攢積分日常使用的絕大多數接口可以免費拿下。對個人學習研究來說這個成本結構很合適。也有朋友問我為什么不直接用 akshare 或者其他開源庫。我的體會是akshare 這類免費庫勝在零門檻但數據穩(wěn)定性和文檔完整度參差不齊部分接口掛在網頁爬蟲上隔一段時間就可能失效Tushare Pro 的接口更接近成熟商業(yè)數據服務的體驗字段說明規(guī)范、更新穩(wěn)定出了問題也好排查。當然如果你只是隨手拿個數據玩一玩哪個順手用哪個都行如果是認真要做自己的數據體系Tushare Pro 的性價比優(yōu)勢就很明顯了。2. 環(huán)境準備與最容易被忽略的安裝細節(jié)我記得自己第一次裝 Tushare 的時候以為和裝普通庫一樣簡單結果報了一堆錯。后來回頭看其實大部分問題都可以提前避免。這里把環(huán)境搭建的完整流程和容易踩的坑一起說清楚。2.1 Python 環(huán)境與 tushare 安裝步驟無論你用的是 Windows、macOS 還是 Linux核心步驟是一樣的。安裝 Python 的時候我建議直接裝 Python 3.9 以上版本Tushare 的版本迭代比較快新版本對新的 Python 兼容性更好。安裝完 Python 之后強烈建議先建一個虛擬環(huán)境別一股腦往系統(tǒng)環(huán)境里塞包。我自己通常是這樣操作的# 創(chuàng)建虛擬環(huán)境 python -m venv tushare_env # 激活虛擬環(huán)境 # Windows tushare_env\Scripts\activate # macOS / Linux source tushare_env/bin/activate # 升級 pip避免后續(xù)安裝報錯 pip install --upgrade pip # 安裝 tushare、pandas、matplotlib 等常用庫 pip install tushare pandas matplotlib這里提一個常見錯誤有些朋友在安裝后立即運行import tushare結果提示找不到模塊。原因經常是虛擬環(huán)境和全局環(huán)境混淆了——終端里激活的 Python 解釋器和你裝包的 pip 對應的不是同一個環(huán)境。最簡單的確認方法是在激活環(huán)境后運行python -c import tushare; print(tushare.__version__)如果能看到版本號說明環(huán)境沒問題如果報錯就要檢查pip是不是被軟鏈接到了其他地方。2.2 注冊 Tushare Pro 賬號與 Token 配置的核心邏輯環(huán)境裝好后接下來是注冊賬號。在 Tushare Pro 官網注冊登錄后進入個人主頁找到接口TOKEN頁面復制那一串 token。這個 token 相當于你訪問數據接口的鑰匙所有請求都要帶上它。token 配置有兩種常見方式。第一種是在代碼里直接設置import tushare as ts ts.set_token(你的token) pro ts.pro_api()第二種是在項目根目錄放一個.env文件用環(huán)境變量的方式管理這樣更安全也方便代碼庫共享時隱藏敏感信息# 安裝 python-dotenvpip install python-dotenv import os from dotenv import load_dotenv load_dotenv() import tushare as ts ts.set_token(os.getenv(TUSHARE_TOKEN)) pro ts.pro_api()這里多說一句token 是個人賬戶憑證盡量不要直接硬編碼在公開的 Jupyter Notebook、GitHub 倉庫或者博客示例里。我見過不少人在分享代碼時把 token 一起貼出來結果賬號被別人盜刷積分的情況。哪怕只是自己本地用也建議養(yǎng)成用環(huán)境變量的習慣。2.3 驗證環(huán)境用最簡單的接口測試連通性環(huán)境裝好、token 配置好之后不要急著寫復雜邏輯先用一個最簡單的接口驗證能不能連通。daily接口的積分門檻相對較低注冊完善資料基本就能開通很適合作為第一個測試接口。import tushare as ts ts.set_token(你的token) pro ts.pro_api() # 獲取平安銀行最近幾個交易日的日線行情 df pro.daily(ts_code000001.SZ, start_date20250101, end_date20250301) print(df.head())如果能在輸出里看到ts_code、trade_date、open、high、low、close這些字段恭喜你整個鏈路已經通了可以繼續(xù)往下做正經事情了。3. 核心數據接口實戰(zhàn)行情、財務、龍虎榜一次拿全這一節(jié)是整個文章的重頭戲也是你后面所有分析工作的地基。我會把日線行情、財務數據、龍虎榜數據三塊分別講透包括接口怎么調、返回什么樣的數據、有哪些值得注意的字段和坑。3.1 日線行情接口從一行代碼到完整的數據獲取流程日線行情是所有 A 股數據分析里最基礎、也最高頻使用的數據。Tushare Pro 里對應的接口是pro.daily()。調用方式很簡單傳股票代碼和日期范圍就行import tushare as ts ts.set_token(你的token) pro ts.pro_api() # 獲取平安銀行 2025年1月1日至今的日線行情 df pro.daily(ts_code000001.SZ, start_date20250101, end_date20250301) print(df.head())返回結果長這樣字段名和格式很有代表性ts_code股票代碼帶后綴例如000001.SZ表示深交所600000.SH表示上交所。trade_date交易日期格式是YYYYMMDD的 8 位字符串。open / high / low / close開盤價、最高價、最低價、收盤價單位是元。pre_close昨收盤價。change漲跌額等于 close 減去 pre_close。pct_chg漲跌幅單位是百分數接口直接幫你算好了。vol成交量單位是手注意 1 手 100 股。amount成交額單位是千元不是元。這里有兩個非常容易弄混的地方我特意說明一下都是血淚教訓。第一daily返回的數據是未復權價格。什么是未復權就是交易所每天公布的原始價格。如果一只股票發(fā)生了分紅、送股除權除息之后價格會留下一個明顯的跳空缺口。這個缺口不是真實的漲跌而是股本變化導致的數字變化。如果你要用歷史價格計算收益率、做策略回測用未復權數據會導致結果嚴重失真。解決方法是使用pro_bar接口指定adjqfq前復權或adjhfq后復權。日??幢P用daily沒問題但一旦涉及量化回測一定要用復權數據。第二vol和amount的單位都是縮水的。vol是手amount是千元。網上能看到很多新手把所有數據加起來算總成交額結果數量級差了好幾位。如果你想把成交額換算成億元直接df[amount] / 100000就能得到億元口徑因為amount單位是千元。3.2 財務數據接口的選擇fina_indicator 與 balance_sheet 的區(qū)別財務數據這塊很多初學者一開始會被一堆接口搞暈fina_indicator、income、balance_sheet、cashflow、forecast每個看著都像財務報表到底該用哪個我從實際使用的角度把它們的區(qū)別整理出來。接口名返回內容典型字段適用場景fina_indicator財務指標按報告期計算的比率roe, grossprofit_margin, debt_to_assets快速看公司賺錢能力、償債能力income利潤表revenue, n_income, operate_profit看營收、利潤的絕對值balance_sheet資產負債表total_assets, total_liab, equity看資產結構、負債水平cashflow現金流量表n_cashflow_act, free_cashflow看現金流狀況forecast業(yè)績預告type, p_change_min, p_change_max事件驅動策略我個人最常用的是fina_indicator因為人家把核心比率都算好了像是roe、grossprofit_margin、debt_to_assets、netprofit_yoy這些字段做基本面篩選的時候直接拿來排序就行不需要自己再做一遍報表計算。但如果你想深入拆解某家公司的財務狀況還是得回到income和balance_sheet去扣細項fina_indicator只是一個摘要視圖。調用方式不復雜# 獲取平安銀行的財務指標數據 df_fin pro.fina_indicator(ts_code000001.SZ, start_date20240101, end_date20250301) print(df_fin.head())返回的數據是按報告期組織的大約每個季度一條字段非常多建議用df_fin.columns查看完整列表不要試圖一次性記住。這里需要特別提醒一個和日線行情完全不同的特性財務數據不是連續(xù)的每日數據而是季報頻率。你會發(fā)現返回的記錄不是從 1 月到 12 月每個月一條而是一季報、中報、三季報、年報這樣的節(jié)奏。做模型時如果你把財務數據直接和日線行情 join 在一起會產生大量重復或者缺失的報告期錯位問題正確做法是按end_date報告期對齊或者對財務指標做向前填充。3.3 龍虎榜數據事件驅動的金礦但有兩個關鍵坑龍虎榜數據是很多做短線和事件驅動策略的玩家重點關注的對象。它直接展示了市場資金博弈的痕跡哪只股票被機構買入哪只被游資炒作凈買入額是多少。Tushare Pro 提供了top_list和top_inst兩個相關接口。top_list返回某一天上榜的股票列表調用方式是按交易日查詢# 獲取 2025年2月10日 的龍虎榜數據 df_top pro.top_list(trade_date20250210) print(df_top.head())核心字段包括ts_code股票代碼trade_date上榜日期name股票名稱close收盤價pct_change漲跌幅net_amount凈買額單位是萬元buy_amount買入總額單位是萬元sell_amount賣出總額單位是萬元turnover_rate換手率使用龍虎榜數據有兩個關鍵坑我在實際項目中都踩過??右籺op_list是按交易日維度的不是按股票維度的。也就是說你傳的是交易日返回的是當天所有上榜股票如果你想知道某只股票的歷史上榜記錄需要遍歷一段時間內的所有交易日然后篩選ts_code。我最早寫策略腳本時就卡在這里以為傳ts_code就能拿到單只股票的榜單結果返回空??佣et_amount單位是萬元不是元。不少新手直接拿這個數去和其他金額字段對比結果差了一萬倍。Tushare 的文檔里單位標注其實是有的但很容易被忽略。建議養(yǎng)成拿到數據后先head()看幾行、再檢查單位的好習慣。另外還有一點龍虎榜數據通常在下個交易日早上 8 點左右更新完畢。如果你寫了一個每天早上自動拉取昨日龍虎榜的程序時間點最好設計在 8 點半以后留出冗余否則容易拉到不完整的數據。3.4 免費積分怎么獲取一個不用花錢的路徑寫完三類核心接口的調用之后肯定會有朋友問積分不夠怎么辦 這確實是 Tushare Pro 新用戶最常見的困惑。daily接口需要 120 積分fina_indicator需要 2000 積分top_list需要 2000 積分看起來門檻不低但實際上有相當一部分積分是可以免費攢出來的。我整理了自己走過的免費積分路徑注冊賬號在 Tushare Pro 官網注冊初始會送一部分基礎積分。完善資料在個人中心把職業(yè)、領域、使用場景這些資料填完整會送一部分積分。我當時填完資料后積分從 120 漲到了 500 左右。發(fā)帖/回帖社區(qū)里發(fā)一個有效的帖子能夠獲得積分。這個看內容質量我發(fā)過幾個接口使用心得帖子攢了一些。官方任務在首頁和公告里偶爾會有一些活動或任務比如寫接口文檔、反饋 bug參與就能拿積分。這一塊比較隨緣但遇到了就是幾十上百積分的大包。如果等不及攢積分還有一個非常實用的方案先注冊一個賬號用低積分接口比如 daily 需要的 120 積分注冊完善資料基本就夠了把行情數據這塊跑通財務和龍虎榜后面再針對性升級。不要一上來就糾結所有接口全部開通那是給自己設不必要的門檻。3.5 數據落地CSV 存檔與增量更新策略接口可以調通之后緊接著要面對的問題就是怎么把數據保存下來避免每次重復拉取。直接調用接口做全量拉數據會有兩個問題一是慢二是浪費接口調用次數。尤其像財務和龍虎榜這種更新頻率不高的數據完全可以做成本地存檔。我在實際項目中常用的做法有三種。第一種全量覆蓋存檔。適合小數據量、低頻更新的數據。比如龍虎榜每天只有幾十上百條直接把當天數據追加到一個 CSV 里遇到重復日期就覆蓋。簡單粗暴適合個人復盤。第二種按日期增量更新。適合日線行情這種每天都更新的數據。第一次先拉全歷史后面每天只拉最近一個交易日的數據追加到 CSV 尾部。這是我最常用的方式。第三種數據庫存儲。當數據量大到 CSV 處理不過來或者要做復雜條件查詢時建議直接上 SQLite 或 MySQL。Tushare 社區(qū)里也有很多現成的數據庫表結構設計可以直接抄作業(yè)。下面給一個簡單的增量更新示例核心思路是記錄上次拉到哪一天# 增量更新日線數據到CSV import tushare as ts import pandas as pd import os ts.set_token(你的token) pro ts.pro_api() def update_daily_to_csv(ts_code, csv_path): # 讀取已有CSV的最后日期 if os.path.exists(csv_path): df_old pd.read_csv(csv_path) last_date df_old[trade_date].max() start_date str(int(last_date) 1) # 從下一天開始拉 else: start_date 20200101 # 拉取新數據 df_new pro.daily(ts_codets_code, start_datestart_date, end_date20250301) if df_new is not None and not df_new.empty: # 合并并去重 df_all pd.concat([df_old, df_new], ignore_indexTrue) df_all df_all.drop_duplicates(subset[ts_code, trade_date]) df_all.to_csv(csv_path, indexFalse) print(f更新完成新增 {len(df_new)} 條總數據 {len(df_all)} 條) else: print(沒有新數據) # 使用示例 update_daily_to_csv(000001.SZ, sz000001_daily.csv)這個函數看起來簡單但實際價值很高。比如你想維護一個全市場 5000 只股票的日線數據庫用這個思路批量跑配合多線程或者異步很快就能攢起一份自己的本地數據資產。3.6 常見錯誤與排錯技巧最后補一節(jié)排錯指南全都是血淚經驗。Tushare 新手大概率會遇到下面幾個報錯這里直接給出原因和解決方案。錯誤一抱歉您沒有訪問該接口的權限原因當前賬號積分不足未達到該接口的積分門檻。解決檢查接口文檔里的積分要求攢積分或升級賬號。注意這是 Tushare 最常見的報錯不是代碼問題是你權限不夠。錯誤二每分鐘訪問次數超過限制原因Tushare Pro 對普通用戶有每分鐘調用次數限制。解決在調用循環(huán)中加入time.sleep(0.2)之類的時間間隔或者控制單次請求的數據量。技巧批量拉取全市場股票時盡量用trade_date維度拉取一次拿全市場而不是股票維度一只一只地拉。以日線為例用pro.daily(trade_date20250210)一次就能拿到當天全市場約 5000 只股票的數據比循環(huán) 5000 次高效得多。錯誤三請求超時或者連接被重置原因網絡問題或者單次請求數據量太大。解決減少單次請求的時間范圍比如一年一年地拉或者設置重試機制。技巧把請求封裝成帶重試的函數3 次重試加指數退避基本能解決 90% 的偶發(fā)網絡問題。錯誤四數據里出現 NaN 或字段缺失原因停牌股票、新上市股票會有部分字段缺失這是正常現象。解決用df.dropna(subset[close])過濾或者在策略里對 NaN 做向前填充。心態(tài)不要試圖消滅 NaNNaN 本身是信息——它告訴你這只股票當時停牌或數據未更新。錯誤五本地時間和接口時間不一致原因Tushare 的trade_date是北京時間但你的服務器可能在其他時區(qū)。解決統(tǒng)一用字符串比較不要用本地datetime.now()去構造trade_date。建議所有日期參數都用字符串硬編碼或者在配置里統(tǒng)一管理避免時區(qū)干擾。按這個排查思路走絕大多數 Tushare 使用問題都能快速定位到根因。4. 一個能直接執(zhí)行的完整示例程序理論部分說得夠多了是時候把完整代碼放出來了。下面這個程序我盡量寫得務實一點既能把數據拿下來又能落到本地 CSV還能順手打印幾條示例方便你驗證自己的環(huán)境是否配置正確。代碼可以直接復制運行。 A股數據獲取綜合示例日線行情 財務指標 龍虎榜 作者一個曾被數據搞得頭大的博主 說明請將 YOUR_TOKEN 替換成自己的 Tushare Pro token import tushare as ts import pandas as pd import time import os # 配置區(qū) TOKEN YOUR_TOKEN ts.set_token(TOKEN) pro ts.pro_api() # 輸出的CSV路徑 DAILY_CSV daily_000001.csv FIN_CSV fin_000001.csv TOP_CSV top_list.csv # 1. 獲取日線行情 def fetch_daily(ts_code000001.SZ, start_date20240101, end_date20250301): df pro.daily(ts_codets_code, start_datestart_date, end_dateend_date) return df # 2. 獲取財務指標 def fetch_financial(ts_code000001.SZ): df pro.fina_indicator(ts_codets_code, start_date20240101, end_date20250301) return df # 3. 獲取龍虎榜 def fetch_top_list(trade_date20250210): df pro.top_list(trade_datetrade_date) return df # 4. 保存到CSV def save_csv(df, path): if df is not None and not df.empty: df.to_csv(path, indexFalse, encodingutf-8-sig) print(f[OK] 已保存 {len(df)} 條數據到 {path}) else: print(f[WARN] {path} 無數據) # 主流程 if __name__ __main__: # 1. 日線行情 df_daily fetch_daily() print(f日線行情{len(df_daily)} 條) print(df_daily.head(3)) save_csv(df_daily, DAILY_CSV) time.sleep(0.3) # 控制請求頻率 # 2. 財務指標 df_fin fetch_financial() print(f財務指標{len(df_fin)} 條) print(df_fin[[ts_code, end_date, roe, grossprofit_margin]].head(3)) save_csv(df_fin, FIN_CSV) time.sleep(0.3) # 3. 龍虎榜 df_top fetch_top_list() print(f龍虎榜{len(df_top)} 條) if not df_top.empty: print(df_top[[ts_code, name, close, net_amount]].head(3)) save_csv(df_top, TOP_CSV) print(\n全部完成數據已保存到本地 CSV 文件。)運行這個腳本后當前目錄會生成三個 CSV 文件daily_000001.csv、fin_000001.csv、top_list.csv。每跑一次都會被覆蓋如果你想要增量追加參考前面寫的update_daily_to_csv()函數就行。5. 數據可視化別讓數據躺在 CSV 里睡大覺數據拿到手只是第一步能把數據變成觀點才是做分析的關鍵。下面展示兩段簡短的繪圖代碼一段是K線圖一段是漲跌幅分布直方圖。這兩段代碼都不復雜但很實用。5.1 K線圖用 matplotlib 畫最基礎的蠟燭圖K線圖是 A 股分析里最常用的可視化圖形。如果你不想裝mplfinance這種專業(yè)庫用matplotlib也能畫一個簡易的K線圖。import matplotlib.pyplot as plt import pandas as pd import tushare as ts ts.set_token(你的token) pro ts.pro_api() # 讀取剛才保存的日線數據 df pd.read_csv(daily_000001.csv) df df.sort_values(trade_date).reset_index(dropTrue) # 取最近20個交易日 df df.tail(20) plt.figure(figsize(12, 6)) # 用收盤價畫折線 plt.plot(pd.to_datetime(df[trade_date]), df[close], markero, labelclose) plt.title(000001.SZ 最近20日收盤價) plt.xlabel(日期) plt.ylabel(收盤價) plt.xticks(rotation45) plt.grid(True, alpha0.3) plt.legend() plt.tight_layout() plt.savefig(kline_close.png, dpi150) plt.show()畫出來之后你能直觀看到價格走勢。如果想畫更精細的蠟燭圖推薦裝一個mplfinance三行代碼就能出圖支持均線、成交量、MACD 疊加。# 使用 mplfinance 畫專業(yè)K線圖需要先 pip install mplfinance import mplfinance as mpf df pd.read_csv(daily_000001.csv, index_col0, parse_datesTrue) df df.sort_index() # mplfinance 需要列名Open High Low Close Volume df_plot df[[open, high, low, close, vol]].rename(columns{ open: Open, high: High, low: Low, close: Close, vol: Volume }) mpf.plot(df_plot.tail(30), typecandle, volumeTrue, mav(5, 10, 20), title000001.SZ, stylecharles)5.2 漲跌幅分布直方圖一眼看出市場情緒另外一個常用畫面是把某天全市場股票的漲跌幅拉出來畫成直方圖看市場整體情緒。這個畫面特別適合做盤后復盤。import matplotlib.pyplot as plt # 獲取某一天全市場行情 df_all pro.daily(trade_date20250210) # 過濾掉無漲跌幅的數據 df_all df_all.dropna(subset[pct_chg]) plt.figure(figsize(10, 6)) plt.hist(df_all[pct_chg], bins50, colorsteelblue, edgecolorwhite, alpha0.8) plt.axvline(x0, colorred, linestyle--, linewidth1.5, label漲跌分界線) plt.title(2025-02-10 全市場漲跌幅分布) plt.xlabel(漲跌幅(%)) plt.ylabel(股票數量) plt.legend() plt.grid(True, alpha0.3) plt.tight_layout() plt.savefig(market_pct_dist.png, dpi150) plt.show()這個直方圖一出來你就能立刻感受到當天市場的狀態(tài)是普漲、普跌、還是結構分化。如果配合連續(xù)幾天的分布變化還能看出情緒的演變過程。這些都是直接從 Tushare 數據里能得到的第一手信息。6. 進階玩法把 Tushare Pro 變成你的量化數據中臺如果你已經能熟練獲取日線、財務、龍虎榜三類數據說明 Tushare Pro 的基本功已經比較扎實了。接下來提幾個我自己覺得性價比極高的進階方向每一個都值得花時間深入。6.1 自建本地數據庫從 CSV 走向 SQLite當你的數據量變大CSV 文件就變得不好維護打開大文件卡頓、條件查詢麻煩、數據更新容易產生重復。這時候我建議把數據遷到 SQLite。SQLite 是 Python 內置支持的輕量數據庫不需要單獨安裝服務非常適合個人量化項目。一個基本的做法是建三張表daily、financial、top_list。然后寫一個同步函數把拉取到的 DataFrame 直接to_sql()寫進去。這個過程不難但數據庫表結構設計需要提前規(guī)劃好比如trade_date和ts_code聯(lián)合起來做唯一索引防止重復數據。import sqlite3 conn sqlite3.connect(a_share.db) df_daily.to_sql(daily, conn, if_existsappend, indexFalse) df_fin.to_sql(financial, conn, if_existsappend, indexFalse) df_top.to_sql(top_list, conn, if_existsappend, indexFalse) conn.close()注意to_sql默認會在重復執(zhí)行時創(chuàng)建重復記錄個人項目里數據量不大我推薦先按唯一鍵查重再插入保證數據一致性。6.2 技術指標計算自己動手用 pandas 實現技術指標是很多人做策略的必備工具。TA-Lib 是量化圈最常用的技術指標庫但安裝有時候會讓人頭疼。如果你不想折騰我建議用 pandas 直接實現常見指標比如移動平均線、MACD、RSI。這些指標的計算邏輯并不復雜用rolling、ewm這些內置方法就能搞定。舉個例子計算均線和 MACD# 計算均線 df[ma5] df[close].rolling(5).mean() df[ma20] df[close].rolling(20).mean() # 計算 MACD ema12 df[close].ewm(span12, adjustFalse).mean() ema26 df[close].ewm(span26, adjustFalse).mean() df[dif] ema12 - ema26 df[dea] df[dif].ewm(span9, adjustFalse).mean() df[macd] (df[dif] - df[dea]) * 2運行之后你就得到了一整列趨勢指標。把這些指標和 Tushare 的基本面數據、龍虎榜數據結合起來就能搭出一個很初級的選股框架。6.3 定時任務每天早上自動拉取數據如果你希望每天開盤前自動更新數據可以寫一個 Python 腳本然后用系統(tǒng)的定時任務去調用。以 Linux/macOS 為例用 crontabWindows 可以用任務計劃程序。# 每天 8:40 運行一次數據更新腳本 40 8 * * 1-5 cd /path/to/your/project /usr/bin/python3 update_data.py update.log 21這里有個細節(jié)A 股交易日是周一到周五所以 cron 表達式里用1-5限定工作日。但遇到節(jié)假日即使在工作日也沒有新數據這需要腳本里做判斷如果當天trade_date的行情數據為空就直接退出不產生報警。如果你用的是云服務器那這個定時任務基本就等于一個小的自動數據中臺了。每天早上打開數據庫前一天的數據已經躺在那里可以直接用來寫復盤或者跑策略。6.4 批量獲取全市場數據兩種思路的取舍最后一個進階方向也是很多人的痛點如何批量獲取全市場數據。A 股目前有 5000 只股票如果一只一只地拉日線就算每次 0.2 秒一輪也要近 20 分鐘。而且 Tushare 有調用頻率限制盲目快跑會被限流。我優(yōu)先推薦按交易日批量拉取模式pro.daily(trade_date20250210)一次拿到全市場當天數據然后把全市場的歷史數據分成多年份、按年份拉取。這樣請求次數少、數據整齊后續(xù)也方便入庫。如果確實需要按股票維度批量拉取建議用ThreadPoolExecutor做有限并發(fā)同時控制 QPS防止接口被限流。from concurrent.futures import ThreadPoolExecutor, as_completed def fetch_one(ts_code): try: return pro.daily(ts_codets_code, start_date20240101, end_date20250301) except Exception as e: print(f{ts_code} 失敗: {e}) return None # 假設 stock_list 是你的股票列表 stock_list [000001.SZ, 600000.SH, 000002.SZ] with ThreadPoolExecutor(max_workers3) as executor: futures [executor.submit(fetch_one, code) for code in stock_list] for future in as_completed(futures): df future.result() if df is not None and not df.empty: print(df[ts_code].iloc[0], len(df))注意并發(fā)數不要開太高建議從 3~5 個線程開始測試逐步調優(yōu)。7. 易錯點整理一張表查清楚高頻問題寫到這里我想把使用過程中踩過的一些坑系統(tǒng)性地整理出來。這些坑不會出現在官方文檔里但幾乎每個深入使用 Tushare 的人都會遇到。問題現象根本原因解決方案積分不足返回無權限賬號積分未達門檻完善資料 社區(qū)任務攢積分每分鐘限頻提示訪問太頻繁超過了接口頻控加 sleep 或按交易日維度批量拉取未復權跳空價格突變daily 返回未復權數據用 pro_bar 指定復權方式財務報告期錯位數據不均勻財務按季報頻率發(fā)布按 end_date 對齊報告期龍虎榜查詢方式錯誤top_list 不支持 ts_code 查詢接口按交易日返回遍歷交易日再篩選 ts_codeNaN 數據字段缺失停牌或新上市dropna 或向前填充時區(qū)問題日期差一天trade_date 是北京時間日期參數全部用字符串除了表格里的問題我再補充三個使用習慣對長期穩(wěn)定使用 Tushare 很重要。習慣一把接口封裝成自己的工具庫。我在項目里會維護一個data_utils.py里面統(tǒng)一封裝了 token 配置、請求重試、日期參數校驗、返回格式整理。這樣每次寫新腳本時只需要調用封裝好的函數不用重復寫一堆樣板代碼。時間長了你會發(fā)現自己積累了一個非常適合個人習慣的數據工具箱。習慣二接數據之前先設計方案不要邊拉邊想。很多新手拿 Tushare 時一上來就寫循環(huán)把所有數據都拉一遍結果拉完才發(fā)現字段沒選對、時間范圍不對、數據格式不合適又要重來。我建議先明確幾個問題你要什么指標時間范圍是多少數據更新頻率多高要不要復權想清楚了再寫代碼效率會高很多。習慣三寫文檔、記筆記尤其是接口字段的坑。前面提到的vol單位是手、amount單位是千元、net_amount單位是萬元這些都是容易踩的細節(jié)。如果不記下來過幾個月回來再看代碼你很可能已經忘了當初為什么那樣處理。用 Markdown 維護一份自己的字段速查表長期價值很高。最后再分享一個我自己的使用習慣所有數據請求我都會統(tǒng)一封裝在一個文件里接口參數、積分要求、字段備注全部寫在函數注釋中。這樣做的時間越長積累的數據工具就越順手后續(xù)不管是做報告還是寫策略效率都會高出一大截。希望這篇文章能讓你在 A 股數據獲取上少踩幾個坑把更多精力放到真正有價值的研究上去。