如何获取Yahoo Finance支持的全部股票代码列表?
如何获取Yahoo Finance支持的完整股票代码并验证用户输入
问题背景
开发股票交易程序时,需要验证用户输入的股票代码是否被Yahoo Finance支持。之前尝试整合NYSE、NASDAQ和S&P500的代码到本地列表,但存在代码缺失或失效的问题;用yahooquery仅能获取少量代码,从维基百科抓取的S&P500代码也不够全面,希望找到获取Yahoo Finance支持的全量股票代码的方案,并优化验证逻辑。
当前使用的Tkinter验证代码如下:
from tkinter import Tk, Label, Entry, Button import sys root = Tk() root.title("Enter Ticker Symbol") root.geometry("500x400") message_label = Label(root, text="Enter NASDAQ ticker symbol:") message_label.pack() ticker_input = Entry(root) ticker_input.pack() ticker = None names = open('ticker.names') read = names.read() def set_ticker(input): global ticker print(f"Setting ticker to {input}") ticker = input def validate_ticker(input): if input in read: print(input) set_ticker(input) print(f"{input} is set to the ticker.") root.destroy() else: set_ticker(input) print(f"Error: {ticker} is not vaild in YAHOO database.") sys.exit(1) ok_button = Button(root, text="OK", command=lambda: validate_ticker(ticker_input.get())) ok_button.pack() root.mainloop()
解决方案
1. 实时验证代码有效性(推荐,无需预存全量列表)
预存本地代码列表的最大问题是无法实时同步Yahoo Finance的代码更新(比如新增、退市代码),直接通过API实时验证更可靠。可以使用yfinance库尝试获取股票的基本信息,若请求失败则判定为无效代码。
修改后的验证代码示例:
from tkinter import Tk, Label, Entry, Button, messagebox import yfinance as yf root = Tk() root.title("Enter Ticker Symbol") root.geometry("500x400") message_label = Label(root, text="Enter ticker symbol:") message_label.pack() ticker_input = Entry(root) ticker_input.pack() ticker = None def set_ticker(input): global ticker print(f"Setting ticker to {input}") ticker = input def validate_ticker(input): if not input.strip(): messagebox.showerror("Error", "Please enter a ticker symbol") return try: # 尝试获取股票信息,若失败会抛出异常 stock = yf.Ticker(input) # 检查是否有基本信息(避免无效但不报错的情况) if stock.info.get('longName') or stock.info.get('symbol'): set_ticker(input) print(f"{input} is a valid Yahoo Finance ticker.") root.destroy() else: messagebox.showerror("Error", f"{input} is not a valid Yahoo Finance ticker.") except Exception as e: messagebox.showerror("Error", f"{input} is not a valid Yahoo Finance ticker.") ok_button = Button(root, text="OK", command=lambda: validate_ticker(ticker_input.get())) ok_button.pack() root.mainloop()
2. 获取更全面的预存股票代码列表
如果必须使用本地列表,可以通过yahooquery获取主流交易所的成分股代码并合并去重,覆盖NYSE、NASDAQ、S&P500的大部分有效代码:
from yahooquery import Ticker import pandas as pd # 获取各交易所成分股代码 nasdaq_tickers = Ticker('^IXIC').components['symbol'].tolist() sp500_tickers = Ticker('^GSPC').components['symbol'].tolist() nyse_tickers = Ticker('^NYA').components['symbol'].tolist() # 合并去重 all_tickers = list(set(nasdaq_tickers + sp500_tickers + nyse_tickers)) # 保存到本地文件 with open('ticker.names', 'w') as f: f.write('\n'.join(all_tickers)) print(f"已保存{len(all_tickers)}个有效股票代码到ticker.names")
注意事项
- Yahoo Finance的API存在访问频率限制,频繁请求可能会被限制,建议添加请求间隔或使用代理。
- 部分场外交易代码带有后缀(如
.PK、.OB),验证时需考虑用户是否输入完整后缀。 - 本地列表需要定期更新,避免因退市、新增代码导致验证失效。
内容的提问来源于stack exchange,提问作者Subbsos
相关产品推荐
相关产品推荐

