一个牛逼因子,40多行Python代码选出一个翻倍的股票!

本文介绍了如何使用Python进行股票数据分析,包括爬取数据、清洗、财务指标分析(如净利润同比增长率)以及与股票涨跌幅结合构建因子来筛选低估股票。作者通过实例展示了如何通过Python实现股票投资策略,强调了Python在量化投资中的实用价值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这篇文章讲的是Python量化的系列内容,相关内容还包括如何准备爬取数据,拿到数据如何清洗,如何回测,如何用策略去开仓平仓,如何可视化等等。

今天又挖掘出一个不错的因子,看了一下效果不错,竟然一个月涨了56% ,2月份到现在已经翻倍了,太神奇了。

我们还是以创业板为例子来挖掘股票(其他板块类似),这次的因子是涨跌幅和财务指标的因子。简单说就是财务数据很好,但是股票价格严重低估的,我们用Python来把这样的股票筛选出来,然后进行因子排名,择机入场。

1.什么是财务数据

财务数据,就是我们在股票软件或者股票网站上经常看到的F10. 主要是反应在一定时期内的财务状况、经营成果和现金流量的各项数值记录。这些数据通常通过财务报表来体现,主要包括资产负债表、利润表和现金流量表等。通过分析这些财务数据,投资者和分析师可以评估公司的财务健康状况、盈利能力、成长潜力和风险水平。

我们打开同花顺软件,随便找一个股票看一下:

在这里插入图片描述

这个里面有很多指标,我们挑几个拿出来讲一下:

1).市盈率(P/E Ratio):市盈率是衡量股票价格与每股收益(EPS)之比的指标,用来评估股票的估值水平。高市盈率可能意味着股票相对于其盈利被高估,而低市盈率可能表示股票被低估。

2).市净率(P/B Ratio):市净率是公司市值与其账面价值之比,用于评估股票价格与公司净资产的关系。一般而言,市净率低于1可能表明股票被低估。

3).净资产收益率(ROE):净资产收益率是衡量公司盈利能力的指标,表示公司净利润与股东权益的比率。高ROE值通常意味着公司管理层在使用股东资本方面效率较高。

4).资产负债率(Debt-to-Asset Ratio):资产负债率显示了公司总负债与总资产的比例,用以评估公司的财务杠杆水平和偿债能力。较低的资产负债率表示较低的财务风险。

5).营业收入增长率:这一指标显示了公司营业收入的增长速度,反映了公司销售和业务扩展的能力。持续的收入增长是公司成长性的重要标志。

6).现金流量:包括经营活动产生的现金流量、投资活动产生的现金流量和融资活动产生的现金流量。稳定的正现金流量表示公司能够自我维持和扩展业务,而负现金流量则可能表明财务压力。

7).分红率(Dividend Yield):分红率是公司分红总额与股票价格的比例,反映了投资者持有股票的现金回报率。对于寻求稳定现金流的投资者来说,分红率是一个重要的考量指标。

这些指标都是非常重要的财务指标,每一个都是一个因子,今天我们选出起的一个“净利润同比增长率”,这个因子来进行分析。

2.如何获取数据

我们还是用ak这个库来获取股票数据(ak这个库的使用,历史文章里面,我们的量化小册里面也详细介绍了),看一下下面的代码:

在这里插入图片描述

我提取了前3次的财务指标里面的 ‘净利润同比增长率’ ,这里面有2个层次可以挖掘,第一就是增长率的大小,第二就是3个季度的增长率的走向,很明显这个股票是很健康的走势,我们就单拿一个30.43% 来挖掘,我们看一下对不对,可以打开股票软件,看一下:

在这里插入图片描述

数据对的,总营收同比 21.05% ,净利润同比30.43%。

3.构造因子,筛选股票

我们通过上面的操作可以获取股票的财务指标 里面的净利润增长率,然后我们跟股票的涨跌幅进行组合,来构造一个因子,如果股票的净利润增长率很高,而股票又是跌了很多的,那么就意味着 股票是低估的,价格是围绕价值波动,那么股票后面会上涨的概率会很大。

基于这个思想,我们进行排序,我们对创业板1366家股票,进行排序:

在这里插入图片描述

我们看到排名在前面的2家是“飞荣达” 和 “罗博特科” ,这2家的净利润增长率非常高,我看一下这股票的最近1个月的收益

从2月份的12块左右,涨到现在的15块,还是非常可观的,有近30%的涨幅,我们接着看看第二名罗博特科的收益:

在这里插入图片描述

从2月份的51.96 一路涨到现在的124块左右,已经翻倍了,这个收益已经非常牛逼了!

好了,限于篇幅其他的财务因子我就不挖掘了,大部分的选股策略都是通过各种因子进行排序来构建自己的股票池,如果财务数据再配合我们的k线来判断进出场时间点,是非常有戏的。**所以学点Python还是很有用的,对量化有兴趣的同学,小编也给大家分享一份Python学习资料和公开课,里面的内容都是适合零基础小白的笔记和资料,不懂编程也能听懂、看懂。

包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程。

点击免费领取《CSDN大礼包》:Python入门到进阶资料 & 实战源码 & 兼职接单方法 安全链接免费领取

<think>我们被要求回答:如何使用历史数据回测多因子选股策略并计算夏普比率 根据用户提供的引用,多因子选股模型是量化选股的重要策略,而回测是验证策略有效性的关键步骤。夏普比率是衡量策略风险调整后收益的重要指标。 步骤概述: 1. 数据准备:获取历史股票数据(价格、财务数据等)和因子数据(如PE、PB、ROE等)。 2. 构建多因子模型:确定选股因子,计算每个股票因子得分,并综合得分选股。 3. 回测框架:模拟历史交易,计算策略的每日收益率。 4. 计算夏普比率:根据策略的日收益率序列,计算年化夏普比率。 详细步骤: 一、数据准备 - 获取股票池:例如沪深300成分股(随时间变化需动态调整成分股)。 - 时间范围:如2015年1月1日至2023年12月31日。 - 数据内容: - 股票价格(日收盘价、复权价) - 因子数据:价值因子(PE、PB)、质量因子(ROE、负债率)、动量因子(过去6个月收益率)等[^1]。 - 注意:财务数据存在滞后性(年报在次年4月底前公布),回测中需使用公告日后的数据[^3]。 二、构建多因子模型 - 因子标准化:将每个因子值转换为Z-score(减去均值,除以标准差),以消除量纲影响。 $$ z = \frac{x - \mu}{\sigma} $$ - 因子方向调整:确保所有因子方向一致(如高收益为正向)。例如,低PE为正向,但PE是倒数关系,所以通常使用倒数或负值。 - 综合得分:为每个因子赋予权重(如等权重),计算每只股票的综合得分。 $$ \text{综合得分} = \sum_{i} w_i \cdot z_i $$ 其中$w_i$为因子权重,$z_i$为标准化后的因子值。 - 选股:每月初(调仓日)选择综合得分最高的前N只股票(如前10%),等权重构建投资组合。 三、回测框架 - 初始化:设定初始资金(如1000万元),持仓为空。 - 循环每个调仓日(每月第一个交易日): a. 获取当前股票池,计算每个股票因子值(注意使用滞后数据避免未来函数)。 b. 计算每个股票因子得分,并排序选出目标股票。 c. 卖出不在目标股票中的持仓,买入新入选的股票(等权重分配资金)。 d. 记录每日投资组合的市值(考虑交易成本,如0.1%的单边佣金)。 - 非调仓日:持有股票,计算每日组合市值。 - 计算每日收益率: $$ r_t = \frac{PV_t - PV_{t-1}}{PV_{t-1}} $$ 其中$PV_t$为第t日投资组合总市值。 四、计算夏普比率 - 收集策略的每日收益率序列$r_1, r_2, \dots, r_T$。 - 计算年化收益率: $$ \text{年化收益率} = \left( \prod_{t=1}^{T} (1+r_t) \right)^{\frac{252}{T}} - 1 $$ 其中252为年交易日数量(假设一年约252个交易日)。 - 计算年化波动率: $$ \text{年化波动率} = \text{日收益率标准差} \times \sqrt{252} $$ - 夏普比率(无风险利率设为0或3%): $$ \text{夏普比率} = \frac{\text{年化收益率} - r_f}{\text{年化波动率}} $$ 其中$r_f$为年化无风险利率(如3%,则日无风险利率约为0.000119)。 五、注意事项 - 避免未来函数:使用财务数据时,必须确保在公告日之后才能使用(如年报数据在次年4月30日后使用)。 - 交易成本:回测中需扣除交易佣金和冲击成本。 - 基准比较:同时计算基准指数(如沪深300)的夏普比率,以评估策略相对表现。 示例代码框架(Python): ```python import pandas as pd import numpy as np # 1. 数据加载(示例数据格式:日期、股票代码因子1、因子2、...、收盘价) # 假设df是面板数据,索引为日期和股票代码 # 2. 参数设置 start_date = '2015-01-01' end_date = '2023-12-31' trade_freq = 'monthly' # 月度调仓 top_n = 30 # 选前30只股票 # 3. 回测主循环 # 生成调仓日期列表(每月第一个交易日) dates = pd.date_range(start_date, end_date, freq='MS') # 每月第一天,实际交易中需调整为交易日 # 初始化持仓和组合净值 portfolio_value = 10000000 # 初始资金1000万 portfolio_record = [] # 记录每日组合净值 # 遍历每个交易日(实际回测需要按交易日循环,这里简化) for date in trading_dates: # trading_dates为所有交易日列表 # 如果是调仓日(每月第一个交易日) if date in rebalance_dates: # 获取当前股票池的因子数据(注意:使用截至前一日的数据) # 计算每个股票因子综合得分(标准化、加权求和) # 选出得分最高的top_n只股票 # 卖出不在名单中的股票,买入新股票(等权重分配) # 记录交易后的持仓 pass # 非调仓日:根据当日收盘价更新持仓市值 # 计算当日组合总市值 # 4. 计算每日收益率 df_portfolio = pd.DataFrame(portfolio_record, columns=['date', 'value']) df_portfolio['daily_return'] = df_portfolio['value'].pct_change().fillna(0) # 5. 计算夏普比率 annual_return = (df_portfolio['daily_return'].mean() * 252) # 简单年化(也可用对数年化) # 更精确的年化收益率计算: cumulative_return = (df_portfolio['value'].iloc[-1] / df_portfolio['value'].iloc[0]) - 1 annualized_return = (1 + cumulative_return) ** (252 / len(df_portfolio)) - 1 # 年化波动率 annualized_volatility = df_portfolio['daily_return'].std() * np.sqrt(252) # 假设无风险利率为3% risk_free_rate = 0.03 sharpe_ratio = (annualized_return - risk_free_rate) / annualized_volatility ``` 注意:以上代码仅为框架,实际回测需处理大量细节(如停牌、退市、涨跌停限制等)。 根据引用[1],多因子模型需要定期检验因子有效性并更新模型,因此在回测中可考虑滚动窗口优化因子权重[^3]。 §§相关问题§§ 1. 多因子选股中如何确定因子权重? 2. 回测中如何处理股票停牌和涨跌停? 3. 如何避免回测中的过拟合问题?</think>### 多因子选股策略回测与夏普比率计算指南 以下是使用历史数据回测多因子选股策略并计算夏普比率的完整流程,结合引用内容的关键要点: --- #### **1. 数据准备阶段** **核心原则**:避免未来函数,严格处理数据滞后性[^3] - **财务数据滞后处理**(关键步骤) ```python # 示例:滞后3个月使用财报数据(年报4月发布,7月才可用) effective_date = report_date + pd.DateOffset(months=3) # 实际使用日期 ``` - **数据源要求**: - 日级收盘价、复权因子 - 因子数据:PE/PB(价值)、ROE/负债率(质量)、6个月收益率(动量)[^1] - 基准指数数据(如沪深300) --- #### **2. 回测框架搭建** **步骤分解**: 1. **因子标准化** $$ z_{\text{因子}} = \frac{x - \mu}{\sigma} $$ 消除量纲影响,使不同因子可比[^1] 2. **综合评分计算** ```python # 示例:三因子等权组合 def composite_score(df): df['score'] = (zscore(1/df['PE']) + zscore(df['ROE']) + zscore(df['6m_return']))/3 return df.sort_values('score', ascending=False) ``` 3. **调仓规则** - 每月首个交易日调仓 - 持有得分前10%的股票 - 单票仓位≤5%,交易成本按0.1%计算 4. **收益计算** $$ \text{日收益率} = \frac{\text{组合当日市值}}{\text{前日市值}} - 1 $$ --- #### **3. 夏普比率计算** **公式与实现**: $$ \text{夏普比率} = \frac{R_p - R_f}{\sigma_p} $$ - $R_p$:策略年化收益率 - $R_f$:无风险利率(如3%) - $\sigma_p$:策略收益年化波动率 **Python计算示例**: ```python import numpy as np def calculate_sharpe(daily_returns, risk_free=0.03): # 年化收益率 annual_return = np.prod(1 + daily_returns)**(252/len(daily_returns)) - 1 # 年化波动率 annual_volatility = np.std(daily_returns) * np.sqrt(252) sharpe = (annual_return - risk_free) / annual_volatility return sharpe ``` --- #### **4. 回测验证要点** 1. **时间窗口**:至少覆盖5年(包含牛熊市)[^1] 2. **基准对比**:与沪深300的夏普比率比较 3. **敏感性测试**: - 不同因子权重组合 - 调仓频率变化(周/月/季) - 交易成本冲击测试(0.05%~0.2%) 4. **过拟合防范**: - 避免在相同数据集优化参数 - 使用滚动窗口回测(如前3年训练,后2年测试)[^3] --- #### **5. 工具推荐** | 平台 | 优势 | 适用场景 | |-------------|-------------------------------|-------------------| | **聚宽JoinQuant** | 免费A股数据,完整回测框架 | 学术研究/个人实盘 | | **米筐RiceQuant** | 多因子合成工具,实时风控 | 机构级策略开发 | | **Python库** | `empyrical`(夏普计算库) | 自定义回测系统 | > **关键提醒**:多因子模型需定期迭代(每6-12个月),因市场风格切换会导致因子失效[^3]。建议回测夏普比率>1.0且持续跑赢基准的策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值