摘要:def check_main_growth(stock_code): """ 根据净利润增速和营业收入增速选股 参数: stock_code: 股票代码 (如 "300618") 返回: 包含最近报告期同比增速的DataFrame(按报告期从新到旧排序) ""
相信每一位行走在炒股路上的伙伴,都有一套专属的选股逻辑 —— 有人依赖不同软件,有人紧盯各类指标,有人测算不同价位,各有各的思路与方法。
我自然也不例外。最近,我打算结合自己实践中验证有效的策略,以及几位好友多年积累的实战经验,将这些零散的选股逻辑系统梳理整合,借助计算机工具实现量化选股,让决策更具客观性。
今天想先分享一个来自好友的核心选股指标:通过公司的营收与利润增长,来判断其成长性。话不多说,接下来直接上代码。
def check_main_growth(stock_code): """ 根据净利润增速和营业收入增速选股 参数: stock_code: 股票代码 (如 "300618") 返回: 包含最近报告期同比增速的DataFrame(按报告期从新到旧排序) """ # 1. 获取财务指标数据 df = ak.stock_financial_benefit_ths(symbol=stock_code, indicator="按报告期") # 2. 使用您提供的列名 required_cols = ["报告期", "*净利润", "*营业总收入"] # 3. 筛选所需列 df = df[required_cols].copy # 重命名列以便后续处理 df = df.rename(columns={ "*净利润": "净利润(万元)", "*营业总收入": "营业总收入(万元)" }) # 4. 数据清洗和单位转换 # 转换净利润列为统一单位(万) df["净利润(万元)"] = df["净利润(万元)"].apply(convert_to_wan) # 处理营业总收入列(可能包含逗号) df["营业总收入(万元)"] = df["营业总收入(万元)"].astype(str).str.replace(",", "").apply(convert_to_wan) # 5. 按报告期排序 (从旧到新) - 为计算做准备 df = df.sort_values(by="报告期") # 6. 提取报告期的年份和季度信息 df["报告期"] = pd.to_datetime(df["报告期"]) df["年份"] = df["报告期"].dt.year df["季度"] = df["报告期"].dt.quarter # 7. 创建上年同期数据列 df["上年同期_净利润"] = np.nan df["上年同期_营收"] = np.nan # 8. 为每一行查找上年同期的数据 for i in range(len(df)): current_year = df.iloc[i]["年份"] current_quarter = df.iloc[i]["季度"] # 查找上年同季度的数据 same_quarter_last_year = df[ (df["年份"] == current_year - 1) & (df["季度"] == current_quarter) ] if not same_quarter_last_year.empty: df.loc[df.index[i], "上年同期_净利润"] = same_quarter_last_year.iloc[0]["净利润(万元)"] df.loc[df.index[i], "上年同期_营收"] = same_quarter_last_year.iloc[0]["营业总收入(万元)"] # 9. 计算同比增速 (%),保留两位小数 # 使用安全计算,避免分母为0或缺失值 df["净利润同比增速(%)"] = df.apply( lambda row: round((row["净利润(万元)"] - row["上年同期_净利润"]) / abs(row["上年同期_净利润"]) * 100, 2) if pd.notna(row["上年同期_净利润"]) and row["上年同期_净利润"] != 0 else np.nan, axis=1 ) df["营收同比增速(%)"] = df.apply( lambda row: round((row["营业总收入(万元)"] - row["上年同期_营收"]) / abs(row["上年同期_营收"]) * 100, 2) if pd.notna(row["上年同期_营收"]) and row["上年同期_营收"] != 0 else np.nan, axis=1 ) # 10. 过滤有效数据 (去掉没有上年同期数据的记录) df = df.dropna(subset=["净利润同比增速(%)", "营收同比增速(%)"]) # 11. 按报告期从新到旧排序(最新在前) df = df.sort_values(by="报告期", ascending=False) # 12. 重置索引并删除旧索引列 df = df.reset_index(drop=True) # 13. 做判断 # 选股逻辑:选择最近一期净利润同比增速>30%且营收同比增速>20% if not df.empty: latest = df.iloc[0] # 取最新报告期数据(因为已排序,第一行就是最新的) if latest["净利润同比增速(%)"] > 20 and latest["营收同比增速(%)"] > 10: print(f"净利润同比增速: {latest['净利润同比增速(%)']}%,营收同比增速: {latest['营收同比增速(%)']}%,满足条件,继续") # 返回是否为正 return latest["净利润同比增速(%)"] > 20 and latest["营收同比增速(%)"] > 10 else: # print(f"\n股票 {stock_code} 不符合公司成长性选股条件") print(f"净利润同比增速: {latest['净利润同比增速(%)']}%,营收同比增速: {latest['营收同比增速(%)']}%") return None else: print("\n没有足够的历史数据计算同比增速") return None以上代码的核心功能,是通过调取公司年报数据,计算出净利润增速与营收增速,进而筛选出净利润增速超 20%、且营收增速超 10% 的标的 —— 以此从海量上市公司中快速锁定值得关注的高成长性企业。
这两组增速阈值可根据个人经验灵活调整(比如设为 30% 与 20% 也完全可行)。另外补充一句:年报和半年报的数据来源是调用 AKshare 接口,相信大家开始研究量化的时候都会了解,不仅免费,准确性用下来也比较可靠。
总之,自己整理的逻辑,才是适合自己的逻辑,后面就是把不同的指标叠加,选出那个心仪的票~好了,今天分享到这,也欢迎大家留言留下分享自己的选股逻辑,我们一起实现量化。
来源:AI码农股民