以下是一个结合资金面、技术面和板块面的选股逻辑示例代码。这里使用Python语言,并假设您有股票数据接口(这里用tushare作为示例):
“`python
import tushare as ts
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
# 初始化tushare(需要token)
ts.set_token(‘your_tushare_token’)
pro = ts.pro_api()
# 参数设置
end_date = datetime.now().strftime(‘%Y%m%d’)
start_date = (datetime.now() – timedelta(days=60)).strftime(‘%Y%m%d’)
def get_selected_stocks():
# 获取基础股票数据
stock_basic = pro.stock_basic(exchange=”, list_status=’L’, fields=’ts_code,symbol,name,industry’)
# 存储符合条件的股票
selected_stocks = []
# 获取行业板块数据
industry_list = stock_basic[‘industry’].unique()
strong_industries = get_strong_industries(industry_list)
for idx, stock in stock_basic.iterrows():
try:
ts_code = stock[‘ts_code’]
industry = stock[‘industry’]
# 排除ST股票和科创板
if ‘ST’ in stock[‘name’] or stock[‘ts_code’].startswith(‘688’):
continue
# 1. 板块面筛选:选择强势行业
if industry not in strong_industries:
continue
# 获取个股数据
df = pro.daily(ts_code=ts_code, start_date=start_date, end_date=end_date)
df = df.sort_values(‘trade_date’)
# 2. 资金面筛选
# 计算资金流向指标(示例:近5日平均成交额超过1亿)
if df[‘amount’].tail(5).mean() < 100000000:
continue
# 3. 技术面筛选
# 计算技术指标
df = calculate_technical(df)
# 技术指标条件
condition1 = df[‘close’].iloc[-1] > df[‘ma5’].iloc[-1] # 收盘价在5日均线上
condition2 = df[‘ma5’].iloc[-1] > df[‘ma20’].iloc[-1] # 5日线上穿20日线
condition3 = df[‘macd’].iloc[-1] > df[‘signal’].iloc[-1] # MACD金叉
condition4 = df[‘rsi_14’].iloc[-1] > 50 # RSI大于50
if condition1 and condition2 and condition3 and condition4:
selected_stocks.append({
‘代码’: ts_code,
‘名称’: stock[‘name’],
‘行业’: industry,
‘最新价’: df[‘close’].iloc[-1],
‘5日平均成交额’: round(df[‘amount’].tail(5).mean()/1e8, 2),
‘RSI’: round(df[‘rsi_14’].iloc[-1], 2),
‘MACD’: round(df[‘macd’].iloc[-1], 4)
})
except Exception as e:
print(f”处理{stock[‘name’]}时出错: {str(e)}”)
continue
return pd.DataFrame(selected_stocks)
def calculate_technical(df):
# 计算移动平均线
df[‘ma5’] = df[‘close’].rolling(5).mean()
df[‘ma20’] = df[‘close’].rolling(20).mean()
# 计算MACD
ema12 = df[‘close’].ewm(span=12, adjust=False).mean()
ema26 = df[‘close’].ewm(span=26, adjust=False).mean()
df[‘macd’] = ema12 – ema26
df[‘signal’] = df[‘macd’].ewm(span=9, adjust=False).mean()
# 计算RSI
delta = df[‘close’].diff()
gain = delta.where(delta > 0, 0)
loss = -delta.where(delta < 0, 0)
avg_gain = gain.rolling(14).mean()
avg_loss = loss.rolling(14).mean()
rs = avg_gain / avg_loss
df[‘rsi_14’] = 100 – (100 / (1 + rs))
return df.dropna()
def get_strong_industries(industry_list):
# 获取强势行业(示例:行业指数近20日涨幅前30%的行业)
strong_industries = []
for industry in industry_list:
try:
# 假设有获取行业指数的接口
industry_df = pro.industry_daily(industry_code=industry, start_date=start_date, end_date=end_date)
if len(industry_df) < 20:
continue
industry_return = (industry_df[‘close’].iloc[-1] / industry_df[‘close’].iloc[-20] – 1) * 100
if industry_return > np.percentile(industry_returns, 70):
strong_industries.append(industry)
except:
continue
return strong_industries
if __name__ == ‘__main__’:
selected = get_selected_stocks()
print(“筛选出的股票:”)
print(selected.sort_values(‘5日平均成交额’, ascending=False))
“`
这个程序包含三个维度的筛选逻辑:
1. **资金面筛选**:
– 近5日平均成交额超过1亿元
– 可根据需要添加更多资金指标(如主力资金净流入、量比等)
2. **技术面筛选**:
– 价格在5日均线之上
– 5日线上穿20日线
– MACD金叉
– RSI大于50
– 可根据需要添加更多技术指标(如KDJ、BOLL等)
3. **板块面筛选**:
– 选择近期涨幅处于前30%的强势行业
– 行业指数趋势判断
**使用说明**:
1. 需要注册tushare pro账号并获取API token
2. 安装必要库:pip install tushare pandas numpy
3. 可根据实际需求调整参数:
– 修改时间周期(start_date/end_date)
– 调整技术指标参数
– 修改资金面筛选条件
– 调整行业筛选逻辑
**注意事项**:
1. 实际使用需要处理更多异常情况和数据验证
2. 行业数据获取可能需要特殊权限
3. 建议结合基本面分析增加更多筛选条件
4. MACD和RSI参数可以根据策略需要调整
5. 需注意不同市场环境下的参数适应性
这个程序可以通过增加更多维度的数据和更复杂的策略逻辑来进一步优化,建议在实际使用前进行充分的历史回测验证策略有效性。
发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/1227418
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!