import yfinance as yf
import pandas as pd
import time
def get_valuation_fast_track(ticker_str):
print(f"⚡️ 启动快速通道: {ticker_str}")
stock = yf.Ticker(ticker_str)
try:
# 1. 只拿最稳的两个表,不调用 stock.info (因为 info 最容易卡死)
income = stock.financials
# 尝试拿过去两年的价格,减少请求量
df_price = stock.history(period="2y")['Close']
if income is None or income.empty:
print("❌ 财务表为空,可能被暂时降级限流。")
return
print("✅ 基础数据就位,开始逻辑对齐...")
# 2. 提取 EPS (优先找 Basic EPS 字段)
# 雅虎的索引有时候是 'Basic EPS', 有时候是 'BasicEPS'
income_t = income.T
eps_col = [c for c in income_t.columns if 'EPS' in c and 'Basic' in c]
if eps_col:
fin_series = income_t[eps_col[0]].to_frame(name='EPS')
else:
# 如果没有 EPS,找 Net Income 和 Share Issued 强制计算
net_income = income_t['Net Income Common Stockholders']
# 注意:'Share Issued' 通常在 balance_sheet 里
shares = stock.balance_sheet.T['Share Issued']
fin_series = (net_income / shares).to_frame(name='EPS')
# 3. 对齐日期 (去掉时区)
fin_series.index = pd.to_datetime(fin_series.index).tz_localize(None)
price_df = df_price.to_frame().reset_index()
price_df['Date'] = pd.to_datetime(price_df['Date']).dt.tz_localize(None)
# 4. 合并并计算
merged = pd.merge_asof(
price_df.sort_values('Date'),
fin_series.sort_index(),
left_on='Date',
right_index=True,
direction='backward'
)
merged['PE'] = merged['Close'] / merged['EPS']
print(f"\n🚀 {ticker_str} 历史 PE 片段 (最新 5 条):")
print(merged[['Date', 'Close', 'EPS', 'PE']].tail())
return merged
except Exception as e:
print(f"🚨 快速通道报错: {e}")
# 立即测试 0700.HK
df_hk = get_valuation_fast_track("0700.HK")
# 如果通了,立即接上日股 7203.T,中间休息 5 秒
if df_hk is not None:
time.sleep(5)
get_valuation_fast_track("7203.T")