摘要:以下是一个基于当前指数状态进行选股的Python程序示例,结合技术指标和基本面数据筛选股票。程序分为四个部分:指数状态判断、选股策略、数据获取和筛选执行。
以下是一个基于当前指数状态进行选股的Python程序示例,结合技术指标和基本面数据筛选股票。程序分为四个部分:指数状态判断、选股策略、数据获取和筛选执行。
---
### 一、程序框架
```python
import pandas as pd
import numpy as np
import tushare as ts # 需安装tushare库(注册获取token)
from datetime import datetime, timedelta
# 初始化
ts.set_token('YOUR_API_TOKEN') # 替换为你的Tushare token
pro = ts.pro_api
# 全局参数
INDEX_CODE = '000001.SH' # 上证指数
START_DATE = (datetime.now - timedelta(days=365)).strftime('%Y%m%d')
END_DATE = datetime.now.strftime('%Y%m%d')
```
---
### 二、指数状态判断
```python
def get_index_status:
# 获取指数数据
df = pro.index_daily(ts_code=INDEX_CODE, start_date=START_DATE, end_date=END_DATE)
df = df.sort_values('trade_date').set_index('trade_date')
# 计算技术指标
df['20ma'] = df['close'].rolling(20).mean
df['60ma'] = df['close'].rolling(60).mean
# 判断趋势(金叉/死叉)
last_20ma = df['20ma'].iloc[-1]
last_60ma = df['60ma'].iloc[-1]
if last_20ma > last_60ma and df['close'].iloc[-1] > last_20ma:
return 'uptrend' # 上升趋势
elif last_20ma
return 'downtrend' # 下降趋势
else:
return 'consolidation' # 震荡
```
---
### 三、选股策略
```python
def select_stocks(market_status):
# 获取全A股列表(剔除ST和次新股)
stock_list = pro.stock_basic(exchange='', list_status='L', fields='ts_code,name,industry,list_date')
stock_list = stock_list[~stock_list['name'].str.contains('ST')]
stock_list = stock_list[stock_list['list_date']
selected =
for ts_code in stock_list['ts_code']:
try:
# 获取个股数据
k_data = pro.daily(ts_code=ts_code, start_date=START_DATE, end_date=END_DATE)
k_data = k_data.sort_values('trade_date')
# 技术面筛选
close_prices = k_data['close'].values
vol = k_data['vol'].values
# 计算指标
ma20 = close_prices[-20:].mean
ma60 = close_prices[-60:].mean
rsi = compute_rsi(close_prices, 14) # 需自定义RSI计算函数
# 基本面筛选
fina = pro.fina_indicator(ts_code=ts_code, period='20230630') # 最新财报
pe = fina['pe'].values[0]
roe = fina['roe'].values[0]
# 根据市场状态应用不同策略
if market_status == 'uptrend':
if (close_prices[-1] > ma20 > ma60 and
rsi[-1]
vol[-1] > vol[-5:-1].mean and
roe > 15):
selected.append(ts_code)
elif market_status == 'downtrend':
if (ma20
close_prices[-1]/close_prices[-30] > 0.9 and # 抗跌
pe
fina['current_ratio'] > 2):
selected.append(ts_code)
except Exception as e:
continue
return stock_list[stock_list['ts_code'].isin(selected)]
```
---
### 四、执行与输出
```python
if __name__ == '__main__':
market_status = get_index_status
print(f"当前市场状态: {market_status}")
selected_stocks = select_stocks(market_status)
print("\n筛选结果(前20只):")
print(selected_stocks[['ts_code', 'name', 'industry']].head(20))
```
---
### 五、关键增强点
1. **数据增强**:
- 增加北向资金持股数据(`pro.hk_hold`)
- 添加机构调研数据(`pro.stk_surv`)
2. **策略优化**:
```python
# 动量因子改进
def momentum_score(close_prices):
return (close_prices[-1]/close_prices[-20] * 0.4 +
close_prices[-1]/close_prices[-60] * 0.6)
# 波动率过滤
def volatility_filter(close_prices):
returns = np.diff(np.log(close_prices))
return np.std(returns[-20:])
```
3. **风险控制**:
- 行业分散:每个行业不超过3只
- 市值平衡:大市值(>300亿)占比不低于50%
---
### 六、注意事项
1. 数据接口需要处理请求限制(Tushare Pro版有频次限制)
2. 财务数据需注意报告期滞后问题
3. 实际应用需增加止损/止盈逻辑
4. 建议结合宏观经济数据(GDP、CPI等)增强判断
---
这是一个基础框架,实际应用中需要根据市场变化持续优化策略参数,并建议使用更专业的回测框架(如backtrader)进行验证。
来源:向阳随笔