
为什么用Python做选股
手动翻看几千只股票,眼睛累不说,还容易漏掉关键信号。Python能帮你自动化处理数据,把想法变成可执行的策略,几分钟跑完历史回测。这不是程序员的专利,懂点基础语法就能上手。
第一步:搞定数据
选股离不开历史价格、财务指标。免费数据源有yfinance、tushare。以yfinance为例,一行代码下载全部A股?不行,它主要覆盖美股。A股用akshare或者baostock更顺手。

import akshare as ak
# 获取沪深300成分股列表
df = ak.index_stock_cons(symbol="000300")
print(df.head())
拿到股票池后,批量下载日线数据。注意复权问题,前复权价格才能真实反映收益。akshare的stock_zh_a_hist函数支持复权参数。
stock_data = ak.stock_zh_a_hist(symbol="600519", period="daily", adjust="qfq")
第二步:构建因子
因子就是选股标准。常见的有动量、估值、波动率。动量因子看过去20日涨幅,估值看市盈率倒数。用pandas计算很轻松。
def momentum_factor(close_prices, window=20):
return close_prices.pct_change(window)
把每个股票的因子值算出来,合并成一张大表。注意对齐日期,停牌股要剔除。因子最好做标准化,消除量纲影响。
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
factor_matrix = scaler.fit_transform(factor_df)
第三步:回测验证
回测是检验策略的唯一标准。自己写循环容易出错,用backtrader或者vectorbt更省心。vectorbt速度快,适合向量化回测。
import vectorbt as vbt
# 假设已经计算出每日信号
portfolio = vbt.Portfolio.from_signals(close, entries, exits, init_cash=100000)
print(portfolio.stats())
关键指标看夏普比率、最大回撤、年化收益。夏普大于1算及格,最大回撤超过30%要警惕。注意避免未来函数,用当天收盘价算信号,第二天开盘价成交。
常见坑与优化
数据幸存者偏差:退市股票没包含,回测收益虚高。用全历史成分股列表。
过拟合:因子挖得太细,样本内漂亮样本外惨。留出最近两年做验证。
交易成本:佣金、印花税、滑点都要算进去。A股印花税千分之一,别忽略。
多因子组合:等权配置简单有效,动态加权需要更复杂的模型。
实战小例子
双均线选股:5日均线上穿20日均线买入,下穿卖出。跑一遍沪深300成分股,看看效果。代码不长,但能帮你理解整个流程。
for stock in stock_list:
data = get_price(stock)
data['ma5'] = data['close'].rolling(5).mean()
data['ma20'] = data['close'].rolling(20).mean()
data['signal'] = np.where(data['ma5'] > data['ma20'], 1, 0)
data['position'] = data['signal'].shift(1)
data['return'] = data['close'].pct_change() * data['position']
# 累计收益
data['cum_return'] = (1 + data['return']).cumprod()
把每只股票的累计收益画出来,对比等权买入持有。你会发现择时不一定更好,但能降低回撤。
进阶方向
机器学习选股:用随机森林、XGBoost预测涨跌,特征包括财务指标、技术指标。注意时序交叉验证,不能随机打乱。
组合优化:马科维茨均值方差模型,用scipy.optimize求解。约束条件包括行业中性、市值中性。
实盘对接:用easytrader连接券商客户端,自动下单。记得加风控,单笔亏损不超过总资金2%。
Python选股不是圣杯,但能帮你系统化验证想法。从简单策略开始,逐步迭代。数据质量决定上限,回测严谨性决定下限。动手写代码,比看一百篇文章都管用。