
同花顺选股Python实现基础
获取同花顺软件内的数据需借助其数据接口或第三方数据服务。常用方法包括使用Tushare、AKShare等第三方Python库,这些库提供了丰富的A股行情数据、财务数据和基本面数据,是构建选股策略的数据基础。
安装数据接口库后,需完成初始设置。首先进行用户注册与Token获取,这是访问数据权限的关键。
import tushare as ts
# 设置您的Token,需要在Tushare官网注册获取
pro = ts.pro_api('your_token_here')
选股因子定义与数据获取
选股策略核心在于因子定义。因子通常分为技术因子、基本面因子和另类因子三类。

技术因子基于价格与成交量。常见技术因子包括:N日涨跌幅、均线排列、相对强弱指数(RSI)、布林带位置等。这些因子可捕捉市场趋势与动量效应。
基本面因子源于公司财务报表与经营状况。重要基本面因子包含:市盈率(PE)、市净率(PB)、净资产收益率(ROE)、营业收入增长率、净利润增长率等。它们衡量公司估值与盈利能力。
另类因子包含股东人数变化、机构持股比例、分析师评级变化等市场行为数据。
数据获取需调用接口函数。以下示例演示获取特定日期基本面数据与行情数据。
# 获取指定交易日的基础股票列表
df_basic = pro.stock_basic(exchange='', list_status='L', fields='ts_code,symbol,name,area,industry,list_date')
# 获取某日所有股票的每日行情指标(如前复权)
df_daily = pro.daily(trade_date='20230815')
# 获取股票TTM市盈率数据(此为示例,实际需使用对应接口)
# df_bak_daily = pro.bak_daily(trade_date='20230815', fields='ts_code,pe_ttm')
构建多因子筛选逻辑
单一因子选股存在局限性,多因子模型能更全面评估股票。构建逻辑分为以下步骤:数据合并、因子计算、标准化处理和加权综合评分。
首先将不同来源数据进行合并对齐,确保每只股票对应所有所需因子值。然后计算衍生因子,例如过去20日的平均成交量与波动率。
import pandas as pd
import numpy as np
# 假设已获取包含代码、收盘价、成交额的DataFrame:df_price
# 计算20日涨跌幅与20日平均成交额
df_price['pct_chg_20'] = df_price.groupby('ts_code')['close'].pct_change(20)
df_price['avg_amount_20'] = df_price.groupby('ts_code')['amount'].rolling(20).mean().values
# 数据清洗,去除缺失值
df_merged = df_merged.dropna(subset=['pe_ttm', 'pct_chg_20', 'avg_amount_20'])
随后对因子进行标准化处理,使不同量纲的因子可比。常用方法为Z-Score标准化。
# Z-Score标准化函数
def z_score_standardize(series):
return (series - series.mean()) / series.std()
df_merged['pe_z'] = z_score_standardize(df_merged['pe_ttm'])
# 对于市盈率等估值因子,通常认为越低越好,因此可取其负值
df_merged['pe_score'] = -df_merged['pe_z']
最后根据投资逻辑设定权重,计算综合得分。
# 假设已计算好多个因子的得分:pe_score, growth_score, momentum_score
weights = {'pe': 0.3, 'growth': 0.4, 'momentum': 0.3}
df_merged['composite_score'] = (df_merged['pe_score'] * weights['pe'] +
df_merged['growth_score'] * weights['growth'] +
df_merged['momentum_score'] * weights['momentum'])
# 按综合得分降序排列
df_merged = df_merged.sort_values('composite_score', ascending=False)
高级筛选与条件设置
基本筛选基于分数排序,高级筛选引入严格条件阈值。设定硬性条件可过滤掉不符合基本要求的股票。
硬性条件可能包括:上市时间超过N年、非ST/*ST股票、股价高于一定数值、日均成交额大于某阈值以确保流动性。
# 添加筛选条件
# 条件1:上市时间早于2020年(假设当前为2023年)
df_merged = df_merged[df_merged['list_date'] < '20200101']
# 条件2:最新收盘价高于5元
df_merged = df_merged[df_merged['close'] > 5]
# 条件3:20日日均成交额大于1亿元
df_merged = df_merged[df_merged['avg_amount_20'] > 1.0e8]
# 条件4:市盈率为正且小于50
df_merged = df_merged[(df_merged['pe_ttm'] > 0) & (df_merged['pe_ttm'] < 50)]
策略回测与绩效评估
选股策略需通过历史数据回测验证其有效性。回测流程包括:在历史时点运行选股逻辑、构建股票组合、计算组合在未来一段时间的收益,并与基准指数(如沪深300)对比。
# 简化回测框架示例(需处理复权、停牌等复杂情况)
initial_date = '20220101'
end_date = '20221231'
trade_dates = pro.trade_cal(exchange='SSE', start_date=initial_date, end_date=end_date, is_open='1')['cal_date']
portfolio_returns = []
for date in trade_dates[::20]: # 假设每20个交易日调仓一次
# 在该日期运行上述选股脚本,选出前10只股票
selected_stocks = df_merged.head(10)['ts_code'].tolist()
# 计算这些股票在未来20个交易日的等权平均收益
# ... 此处需获取未来收益数据并计算 ...
period_return = calculated_return # 假设已计算出
portfolio_returns.append(period_return)
# 计算策略年化收益与波动率
total_return = np.prod([1 + r for r in portfolio_returns]) - 1
自动化运行与结果输出
将上述步骤封装为函数或类,实现每日自动运行。结果可通过邮件发送、写入数据库或生成Excel报告。
def run_screening_strategy(trade_date):
# 整合数据获取、因子计算、筛选逻辑
final_stock_list = ... # 经过完整筛选的股票列表
return final_stock_list
# 输出结果至Excel
output_df = df_merged[['ts_code', 'symbol', 'name', 'industry', 'composite_score']].head(30)
output_df.to_excel('selected_stocks.xlsx', index=False)
print(f"选股完成,共筛选出{len(output_df)}只股票。")
脚本运行应考虑网络异常、数据缺失、接口限制等现实问题,需增加错误处理与日志记录功能。通过定时任务工具如Windows任务计划或Linux的Cron可实现无人值守自动化选股。