同花顺选股Python脚本编写全流程

企业微信

同花顺选股Python实现基础

获取同花顺软件内的数据需借助其数据接口或第三方数据服务。常用方法包括使用Tushare、AKShare等第三方Python库,这些库提供了丰富的A股行情数据、财务数据和基本面数据,是构建选股策略的数据基础。

安装数据接口库后,需完成初始设置。首先进行用户注册与Token获取,这是访问数据权限的关键。


import tushare as ts

# 设置您的Token,需要在Tushare官网注册获取

pro = ts.pro_api('your_token_here')

选股因子定义与数据获取

选股策略核心在于因子定义。因子通常分为技术因子、基本面因子和另类因子三类。

同花顺选股Python脚本编写全流程

技术因子基于价格与成交量。常见技术因子包括: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可实现无人值守自动化选股。

转载请注明出处:https://www.lianghuajiaoyi.top/wenzhang/tonghuashun-python-xuangu-114.html