🔴
入学要求
💯
能力测试
🛣️
课程安排
🕹️
研究资源

练习

行业流动性筛选策略

使用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='--')