使用yfinance获取NASDAQ 100成分股中科技行业股票:
import yfinance as yf
import pandas as pd
# 预设成分股列表(实际应通过官方渠道获取完整列表)
nasdaq_100 = ['AAPL', 'MSFT', 'AMZN', 'GOOG', 'META', 'TSLA', 'NVDA']
# 获取基础数据
data = yf.download(nasdaq_100, start='2022-01-01', end='2023-01-01', group_by='ticker')
# 行业分类筛选
tech_stocks = []
for ticker in nasdaq_100:
info = yf.Ticker(ticker).info
if info.get('sector') == 'Technology':
tech_stocks.append(ticker)
# 构建筛选函数
def screen_strategy(ticker_data):
# 条件1:200日平均成交额 > 1亿美元
avg_dollar_volume = (____ * ____).rolling(200).mean()[-1]
# 条件2:当前市值 > 500亿美元
market_cap = yf.Ticker(ticker).info.get('marketCap', 0)
# 条件3:最新收盘价 > 50美元
last_price = ____.iloc[-1]
return ____ & ____ & ____
# 执行筛选
qualified = [t for t in tech_stocks if screen_strategy(data[t])]
print("符合条件标的:", qualified)
实现季度再平衡机制并计算换手率:
from dateutil.relativedelta import relativedelta
# 初始参数
start_date = pd.to_datetime('2020-01-01')
end_date = pd.to_datetime('2022-01-01')
current_date = start_date
# 获取历史成分股数据
all_dates = pd.date_range(start_date, end_date, freq='D')
full_data = yf.download(nasdaq_100, start=start_date, end=end_date)['Adj Close']
# 再平衡逻辑
turnover_rates = []
prev_universe = []
while current_date <= end_date:
# 获取当前有效股票池
current_universe = [t for t in nasdaq_100
if full_data[t].loc[:current_date].last('1M').mean() > 50
and (full_data[t].loc[:current_date].iloc[-1]/full_data[t].loc[:current_date].iloc[0] -1) > -0.2]
# 计算换手率
if prev_universe:
added = len(set(current_universe) - set(prev_universe))
removed = len(set(prev_universe) - set(current_universe))
turnover = (____ + ____) / len(prev_universe) * 100
turnover_rates.append(turnover)
prev_universe = current_universe.copy()
current_date += relativedelta(months=3)
# 可视化结果
pd.Series(turnover_rates,
index=pd.date_range(start_date, periods=len(turnover_rates), freq='3M')).plot(
title='季度换手率趋势',
ylabel='换手率 (%)',
figsize=(10,6))
plt.axhline(y=15, color='r', linestyle='--')