ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

数据挖掘实战:上市公司高送转预测项目全解析

数据挖掘实战:上市公司高送转预测项目全解析 简介在金融科技与数据挖掘的交叉领域事件预测是典型的落地场景。高送转作为A股市场特殊的股本扩张行为其预测本质是一个基于上市公司财务数据、股本数据与行情数据的二分类问题。通过特征工程将资本公积、未分配利润、股本规模、股价水平等业务先验转化为模型输入结合逻辑回归、随机森林与LightGBM等机器学习算法可在不平衡样本下实现有效识别。该项目不仅适用于数据挖掘课程设计、金融科技毕业设计也为量化研究提供了一套可复现的建模流程。围绕数据对齐、防泄漏、样本平衡与阈值优化可以构建出业务逻辑清晰、评估指标完备的预测系统帮助研究者与从业者掌握从数据清洗到模型上线的完整方法论并自然应用于高送转预测这一典型事件驱动场景。 如果你正在找数据挖掘方向的实战项目或者想把机器学习用进金融场景里那“基于数据挖掘的上市公司高送转预测”是一个很典型的切入点。这个项目表面上是金融主题本质上是一个标准的二分类任务拿上市公司已经公开的财务数据、股本数据、行情数据做特征预测这家公司在接下来这个年报季会不会推出高送转分配方案。放在数据挖掘课程设计、金融科技毕业设计或者量化研究入门里都算是一个能立得住、能讲清楚、能出结果的项目。这个项目真正有价值的地方在于它不是一个“拍脑袋选题”而是一个业务逻辑清晰、数据可获取、评价指标明确、还能反复调优的完整闭环。你不需要真的去预测股价涨跌只需要预测“会不会高送转”这个事件本身难度适中又不容易被质疑“没有实战意义”。我能看到这个题目的第一反应是能把这个项目做出高分的人一定不只是会调包而是真的把数据清洗、特征构造、样本平衡、防数据泄漏这一整套流程都跑明白了。下面我从项目设计、数据与特征、模型训练、代码实现、问题排查这五个维度把一个完整可复现的高送转预测项目拆开讲。内容适合准备用这个题目做课程设计、毕设或者竞赛练手的同学也适合想系统走一遍数据挖掘流程的从业者参考。1. 项目整体设计与解题思路1.1 高送转预测到底在预测什么先把这个概念说清楚。高送转是A股市场里一个特殊的分配行为指的是上市公司在年度分红方案中以送红股或者资本公积转增股本的方式向股东进行高比例的股份扩张。送股用的是未分配利润转增用的是资本公积两者都不改变公司的净资产和股东权益总额只是把账面上的权益结构变了把股票数量变多了。之所以大家都关注高送转是因为这类方案在预案公告前后往往伴随明显的市场关注度提升流动性变好部分公司在实施后会有填权行情。所以从投资研究角度提前判断哪些公司可能推出高送转是一个长期存在的需求。从数据挖掘角度这个问题恰好能被构造为利用年报披露前的公开特征预测下一年度公司是否会实施每10股送转5股及以上的方案。这里有个关键细节预测的不是“公司未来业绩好坏”而是“公司是否会做高送转这个动作”。这说明特征工程的方向要对应“分红能力”和“分配意愿”而不是单纯堆一堆财务指标就完事。很多第一次做这个题目的同学会把预测目标理解成“预测高送转后股价涨不涨”那就是另一个问题了也会把评估方式完全带偏。1.2 数据挖掘方法为什么适合这个场景高送转预测天然适合数据挖掘原因有三。第一业务可解释性足够特征来源明确。能够高送转的公司通常要有足够的资本公积用来转增和未分配利润用来送股这些直接体现在资产负债表里。同时股本偏小、股价偏高的公司有更强的股份扩张动机。这些业务常识能直接转化成特征模型不用在完全无监督的状态下乱找规律。第二样本量大、结构清晰。A股每年有几千家上市公司每家公司的年报、季报、股本变动、股价信息都是结构化数据。剔除ST、剔除上市时间过短的公司之后仍然有足够的样本量支撑模型训练。第三事件本身有明确定义标签可构造。只要把送转比例阈值定好每家公司每个年度是否高送转就是一个确定的二分类标签。不需要人工标注不需要复杂的文本抽取数据驱动可以直接跑起来。用一句话概括这个场景里有明确的业务先验、充足的数据、清晰的标签非常适合用来完整走一遍“业务理解→数据获取→特征工程→建模→评估→迭代”的数据挖掘流程。1.3 项目交付形态与高分要素既然题目里带了“源码文档说明高分项目”那就必须按一个标准的、可验收的项目来交付。我建议的交付结构是这样的项目文档说明选题背景、业务定义、数据来源、字段说明、特征清单、模型对比、评估结论。数据采集脚本从数据源拉取财务数据、股本数据、行情数据落库或者落CSV。特征工程模块对原始数据做清洗、对齐、特征衍生输出训练集。模型训练模块训练多个基线模型逻辑回归、随机森林、LightGBM等输出评估指标。预测与展示模块输出下一期高送转概率排名附带概率分布可视化。README写明环境依赖、运行步骤、复现结果。一个项目能不能拿高分不只看AUC高不高更看逻辑是否自洽、代码是否可复现、文档是否能把每一步的“为什么”讲清楚。很多人在代码上卷得很深但文档里连特征含义都解释不清这种项目在答辩时很容易被问倒。反过来只要把特征逻辑、数据对齐方式、防泄漏措施这几个关键讲明白天然就比同级项目高出一截。2. 数据获取、标签定义与特征工程2.1 数据源与数据对齐先解决“时间”问题做金融数据挖掘第一道坎不是模型而是数据对齐。高送转预测里最容易翻车的地方就是用了未来信息去预测过去也就是常说的“前视偏差Look-ahead Bias”。比如你想预测某公司在2023年报中会不会高送转那么你只能用2023年年度报告披露之前已经公开的数据通常是2023年三季报的财务数据、2023年12月31日的股本股价数据、以及过去几年的财务数据。如果错误地用了这家公司2024年才披露的年报数据去做特征模型看起来准确率很高但到了真实场景里完全失效因为那个时点上你根本拿不到这些数据。我建议的数据获取方案是财务数据从tushare pro或akshare获取“资产负债表、利润表”摘要提取资本公积、未分配利润、总股本、每股净资产、EPS、ROE等字段。股本数据获取报告期截止日的总股本、流通股本。行情数据获取报告期截止日的收盘价、区间涨跌幅、换手率。历史分配数据获取过去两年是否分红送转、送转比例用来构造“历史送转习惯”特征。数据对齐的核心原则是样本i的每一个特征都必须是t-1年报披露截止日或更早能拿到的数据。实际操作中我习惯把特征统一对齐到“预测期前最后一个财报截止日”比如预测2023年报那就用2023年三季报截止日9月30日的数据再补充2023年12月31日的行情和股本数据然后把所有特征拼在一张表里。这个时点约束必须写死在代码里我后面会讲具体实现。2.2 标签定义高送转的量化口径高送转的定义在不同语境下不完全一致。有的人按“每10股送转合计≥5股”算高送转有的按“≥10股”算还有的把“现金分红比例高”也纳入讨论。这个项目里我建议用主流定义每10股送红股与资本公积转增股本合计不低于5股。标签构造的逻辑是读取目标年度年报分红预案中的“送股比例”和“转增比例”送股股数加上转增股数除以10得到每10股送转比例。只要该比例≥5标签记为1否则记为0。这里有个容易被忽略的细节分红预案可能有多次修改比如先预案10转5后来改成10转7或者先预案10转8最后取消。稳妥的做法是取最终实施的方案或者取首次预案公告的方案。两种口径会略有差异我的经验是取“首次预案”更贴近真实预测场景因为在预案公告之前你本来就是在预测这个动作是否会发生。但为了数据一致性建议在文档里写清楚你用的到底是哪个口径。样本筛选规则也需要明确剔除ST、*ST公司这些公司财务异常高送转行为受监管严格限制。剔除上市不满一年的公司次新股高送转概率很高但预测这类公司的特征数据不完整。剔除金融行业可选银行、保险的资本结构和分红逻辑特殊和制造业差异大。每家公司每年作为一个独立样本。2.3 特征工程分红能力与扩张意愿特征工程是这个项目的灵魂。我把它拆成四个大方向来构造。第一个方向是分红能力。高送转需要“有货可分”。转增要看资本公积送股要看未分配利润。所以每股资本公积、每股未分配利润、资本公积/总股本、未分配利润/总股本、每股净资产这些都是核心特征。简单说这两个指标越高公司越有能力做高送转。注意这里用“每股”比用绝对额更合理因为同样一个亿的资本公积放在一个亿总股本的公司和放在十个亿总股本的公司意义完全不同。第二个方向是股本扩张意愿。通常小股本、高股价的公司更有动力高送转因为高送转能把股价“打低”降低交易门槛提升流动性。所以总股本、流通股本、股价、股价×总股本市值都是重要特征。实际操作中可以把总股本取对数把股价做分位数排名这样特征分布更平稳。第三个方向是成长性与盈利质量。虽然高送转本身不直接等于业绩好但业绩好的公司更有底气做高送转。可以加入营收同比增长率、净利润同比增长率、ROE、毛利率、经营现金流/营业收入这些指标。这里要注意高送转偏好的是“高成长高积累”的公司所以成长性特征的作用更多是辅助筛选。第四个方向是历史行为与市场关注度。公司过去是否连续多年未送转、过去是否有高送转习惯、近期是否有限售股解禁压力这些都会影响分配意愿。市场关注度可以用日均换手率、区间涨跌幅来替代。另外距离上市时间越短的公司扩张需求越强所以上市年限也是一个不可遗漏的特征。给一个可落地的特征清单参考特征类别具体特征业务含义分红能力每股资本公积、每股未分配利润、每股净资产、资本公积/总股本公司有没有能力送转股本特征总股本、流通股本、总股本对数值、流通市值公司存在多大的股本扩张需求股价特征报告期收盘价、过去一年股价分位、股价/每股净资产股价是否偏高是否有拆细动力成长性营收同比、净利润同比、ROE、毛利率公司基本面是否有支撑历史分配上年度是否送转、近三年送转次数公司历史分配习惯市场指标日均换手率、区间涨跌幅、上市年限市场关注度和公司生命周期位置特征数量控制在20到30个左右就够了不需要堆到上百个。这个场景里业务先验非常强几十个特征配合GBDT模型已经完全够用堆太多噪声特征反而容易过拟合。2.4 为什么这些特征有效很多人做特征工程只罗列指标不讲逻辑这是大忌。答辩时如果被问到“为什么要选这些特征”你要能说出背后的业务机制。高送转本质上是上市公司的一种“股本运作”行为。公司要做这件事至少要满足三个条件有能力、有意愿、有空间。“有能力”体现在资本公积和未分配利润充足。资本公积的来源主要是股本溢价比如公司IPO溢价发行、定增溢价这些资金计入资本公积可以用来转增股本。未分配利润是公司历年利润累积下来没分掉的部分可以用来送股。一个刚上市不久、刚做完再融资的公司资本公积往往非常充沛这就是次新股密集高送转的根本原因。“有意愿”体现在公司想不想通过送转来传递信号。高股价的公司希望降低交易门槛小股本的公司希望扩大股本规模以提升融资能力处于成长期的公司希望把利润留在账上不现金分红而是用送转代替这些都是真实存在的动因。“有空间”体现在监管环境的约束。监管对高送转的审查逐年趋严要求高送转与业绩增长挂钩这导致亏损公司、ST公司即便想做也做不了。所以财务健康度指标ROE、盈利增速在近两年样本里区分度越来越强。把这三个逻辑变成特征模型学到的就是“什么样的公司最有可能把能力变成实际行动”。这也是为什么在高送转预测里特征工程比模型选择更重要。3. 模型训练与评估不平衡样本下的取舍3.1 基模型选择GBDT优先高送转预测在大类上是个分类问题可选模型很多。我的建议是至少跑三组做对比逻辑回归可解释性强作为基线、随机森林抗过拟合能力强、LightGBM训练快、效果通常最好。这三个模型在中小数据集上都够用不需要上来就搬深度学习。我实测下来的排序是LightGBM ≥ XGBoost 随机森林 逻辑回归。逻辑回归最大的问题是特征之间的非线性关系很难刻画比如“小股本高资本公积高股价”这种组合只有在同时满足时才有强预测力逻辑回归的单特征加权结构捕捉不到这种交互效应。随机森林能捕捉交互但对高基数特征的切分不够细腻。LightGBM的直方图算法在这里训练速度优势明显几千个样本几十个特征几秒就能跑完一折交叉验证。LightGBM有两个参数在这个场景里特别值得注意。一个是max_depth建议设在6到8之间太深容易在小样本上过拟合太浅学不到财务特征之间的交互。另一个是feature_fraction也就是每次迭代随机选取的特征比例建议设在0.8附近既能增加随机性防止过拟合又不至于丢失重要特征。3.2 不平衡处理重采样、权重与阈值高送转是极端不平衡事件。全市场每年真正做高送转的公司占比通常在3%到8%之间视当年市场环境而定。如果直接训练模型会倾向把所有样本都预测为0准确率虽然很高但毫无意义。处理不平衡有三个常用手段我建议组合使用。第一个是负样本下采样。把不送转的样本随机抽到与正样本相近的数量让模型在训练时看到接近五五开的分布。这个方法简单粗暴缺点是丢弃了大量负样本信息。实际操作中可以尝试不同比例比如正负比1:5到1:2之间观察验证集AUC的变化。第二个是模型内置权重。LightGBM里有scale_pos_weight参数取值为负样本数除以正样本数。这个参数相当于给正样本的错误分类施加更大的惩罚不需要丢弃数据实现成本最低。我通常是先设一个初始值然后微调。第三个是阈值后处理。模型输出的概率本身不等于分类决策你可以不卡0.5的阈值而是在验证集上搜索一个让F1或者Top-K命中率最优的阈值。做预测类项目时这一步经常比调模型超参数更有效。我的建议路线是先用scale_pos_weight做基准再把负样本按比例下采样对比AUC和PR曲线选效果好的组合最后做阈值搜索。3.3 评估指标体系这个项目绝不能只用accuracy评估。原因很简单负样本占95%以上时模型全预测0也有95%的准确率看起来“很好”实际上什么都没做。更适合的评估指标有三个AUC衡量正负样本排名的区分能力0.7以上说明有基本预测力0.75以上在这个场景里已经算很好了。F1-score综合考虑精确率和召回率取决于你选的决策阈值。Top-K命中率把模型输出的概率从高到低排序取前50只或者前100只看其中有多少只真的高送转。这个指标非常贴近真实应用场景因为实际使用中你不会对所有股票做判断只会关注模型最确信的那一批。从业务落地角度看Top-K命中率才是最有说服力的指标。比如模型预测概率最高的50只股票里有20只真的高送转命中率40%而全市场基准比例只有5%这就说明模型真实提供了信息增益。答辩时把这个对比讲出来说服力远胜于报一个AUC数字。还有一点要强调一定要按时序划分训练集和验证集而不是随机划分。比如用前8年的数据训练用最近2年的数据验证。金融数据具有时间相关性随机划分会把未来信息混进训练过程导致评估结果虚高。4. 关键代码实现与调参过程4.1 数据加载与特征计算讲完理论直接上代码。以下我按实际项目里比较稳健的写法来拆解。import pandas as pd import numpy as np import lightgbm as lgb from sklearn.model_selection import TimeSeriesSplit from sklearn.metrics import roc_auc_score, f1_score, precision_score, recall_score from collections import defaultdict # 1. 数据加载 # 假设已经从数据源拉好了三张表 # fin_df: 财务数据字段包括 ts_code, ann_date, end_date, capital_reserve, retained_profit ... # share_df: 股本数据字段包括 ts_code, end_date, total_share, float_share # price_df: 行情数据字段包括 ts_code, trade_date, close, turnover_rate # dividend_df: 分红数据字段包括 ts_code, ann_date, end_date, send_share, transfer_share fin_df pd.read_csv(data/financial.csv) share_df pd.read_csv(data/share.csv) price_df pd.read_csv(data/price.csv) dividend_df pd.read_csv(data/dividend.csv)这里的核心逻辑不是把数据全都读进来就完事而是要做时点对齐。我的做法是先构造每个预测周期的样本列表再按照样本的预测截止日去关联财务、股本、行情数据。# 2. 构造样本表 # 每个样本的标识是 (ts_code, predict_year) # predict_year: 预测的年报年份比如2023 - 预测2023年报是否高送转 sample_list [] for year in range(2016, 2024): tmp all_stocks[[ts_code]].copy() tmp[predict_year] year sample_list.append(tmp) sample_df pd.concat(sample_list, ignore_indexTrue) # 3. 特征对齐 # 核心思想每个样本只允许使用 predict_year-10-31 之前已经披露的数据 # 为了方便演示,这里以年度为单位对齐到上年报数据 def align_feature(df, sample_df, key_date_colend_date): # 取每个股票每年最后一期已披露的财务数据 df df.sort_values([key_date_col]).drop_duplicates([ts_code, predict_year], keeplast) return sample_df.merge(df, on[ts_code, predict_year], howleft)注意这里我用了一个简化写法实际项目里最好把“截止日”的字段粒度细化到季度。为了不把篇幅拖太长我在演示里用年度对齐但你自己写代码时建议用季度对齐预测2023年年报时财务特征用2023年三季报截止日2023-09-30股本股价特征用2023-12-31。这部分逻辑在项目文档里写清楚会让项目显得特别严谨。4.2 训练与交叉验证特征构造完成之后就是训练环节。金融时序数据不适合用普通的KFlod随机交叉验证建议用按年份切分的时序验证。# 4. 标签构造 # 目标每10股送转合计5标签为1 sample_df[send_ratio] sample_df[send_share] / 10.0 sample_df[transfer_ratio] sample_df[transfer_share] / 10.0 sample_df[y] (sample_df[send_ratio] sample_df[transfer_ratio] 5).astype(int) # 5. 时序交叉验证 features [ bps, capital_reserve_ps, retained_profit_ps, roe, gross_profit_margin, net_profit_yoy, total_share, close_price, market_cap, turnover_rate, list_days, last_year_tsg ] X sample_df[features] y sample_df[y] tscv TimeSeriesSplit(n_splits5) auc_list [] f1_list [] for fold, (train_idx, valid_idx) in enumerate(tscv.split(X)): X_train, X_valid X.iloc[train_idx], X.iloc[valid_idx] y_train, y_valid y.iloc[train_idx], y.iloc[valid_idx] model lgb.LGBMClassifier( n_estimators300, learning_rate0.05, max_depth6, num_leaves31, scale_pos_weighty_train.value_counts()[0] / y_train.value_counts()[1], random_state42 ) model.fit( X_train, y_train, eval_set[(X_valid, y_valid)], callbacks[lgb.early_stopping(50)] ) y_pred model.predict_proba(X_valid)[:, 1] auc roc_auc_score(y_valid, y_pred) # 阈值0.3下计算F1 y_class (y_pred 0.3).astype(int) f1 f1_score(y_valid, y_class) auc_list.append(auc) f1_list.append(f1) print(fFold {fold1}, AUC{auc:.4f}, F1{f1:.4f}) print(fAverage AUC{np.mean(auc_list):.4f}, Average F1{np.mean(f1_list):.4f})这段代码里有几个地方值得展开讲。scale_pos_weight的计算方式是负样本数除以正样本数这个值在金融数据里可能高达20以上。设置这个参数之后模型会显著提升对正样本的召回率代价是误报增多。这没关系因为后续我们会用Top-K判断来做最后决策宁可多召回也不能漏掉真正的高送转公司。early_stopping设为50意思是50轮验证集指标不提升就停止训练。这在数据集不大时能有效防止过拟合。同时要注意early stopping的监控指标默认是二分类logloss不是AUC。如果你希望用AUC来选模型可以显式指定eval_metricauc。4.3 阈值搜索与Top-K效果模型训练完最关键的一步是找决策阈值。这里我用一个简单的搜索# 6. 阈值搜索与Top-K评估 thresholds np.arange(0.1, 0.7, 0.05) best_f1 0 best_th 0.5 f1_records [] y_valid_all np.concatenate([...]) # 交叉验证中的所有验证集标签 y_pred_all np.concatenate([...]) # 交叉验证中的所有预测概率 for th in thresholds: y_class (y_pred_all th).astype(int) precision precision_score(y_valid_all, y_class) recall recall_score(y_valid_all, y_class) f1 f1_score(y_valid_all, y_class) f1_records.append((th, precision, recall, f1)) if f1 best_f1: best_f1 f1 best_th th print(fBest threshold{best_th:.2f}, F1{best_f1:.4f}) # Top-K命中率 top_k 100 top_idx np.argsort(y_pred_all)[-top_k:] hit_rate y_valid_all[top_idx].mean() print(fTop-{top_k} hit rate{hit_rate:.4f})阈值和Top-K的底层逻辑是高送转预测并不要求对所有公司都给出准确判断而是希望能从几千家公司里尽量精准地圈出一批“最可能高送转”的名单。所以就算整体F1一般只要Top-100命中率显著高于全市场基准比例这个模型就有使用价值。报告里把基准比例写成“全市场高送转公司占比”然后对比模型的Top-K命中率效果一目了然。5. 常见问题排查与项目提分技巧5.1 数据泄漏最隐蔽也最致命这个项目里最常见的翻车原因就是数据泄漏。数据泄漏不是指数据本身错误而是指特征里混入了“当时拿不到”的信息。我在自己的项目里踩过一次很典型的坑我把“年报披露日期”当作特征里的一部分用来对齐数据和划分时间窗口结果发现模型在验证集上AUC从0.7飙升到0.85最后检查才发现我用的字段里包含了目标年报本身的分红公告日期相当于把答案带进了特征。排查数据泄漏的方法很简单就是自查每个特征的时间戳这个字段在预测时点是否已经存在如果不存在这个特征就必须剔掉。比如说预测2023年高送转那么2023年年报里的每股资本公积、未分配利润都还没披露不能用2024年的任何数据更不能用。如果是从数据库直接拉了一张宽表里面既有历史数据又有未来数据那你必须把时间过滤条件写清楚再合并特征。还有一个容易被忽略的细节是“幸存者偏差”。如果数据源是“当前在市的全部公司”那退市的公司通常是经营恶化的公司天然不包含在样本里模型会学到“市场上所有公司都还活着”这种偏置实际应用时遇到经营困难的公司就预测不准。处理方法很简单数据源里加一个“上市状态”字段把样本期内的全部公司都纳入包括后来退市的这样才符合真实的历史场景。5.2 正负样本失衡准确率陷阱高送转预测里正样本占比通常在5%左右如果你拿accuracy当主要指标模型全预测0都能拿95分。这属于典型的“指标陷阱”。我在给代码做基线评估时会强制打印出混淆矩阵confusion matrix看看模型到底预测了多少正样本如果预测出的正样本数量为零那基本可以断定是类不平衡处理没做好。处理类不平衡我总结的经验是先调scale_pos_weight再看是否需要下采样。下采样有一个副作用就是会让模型对概率的绝对值产生偏移输出的概率不再是真实的“高送转概率”但排序能力也就是AUC基本不受影响。如果你的业务场景只需要挑Top列表下采样完全可接受如果你需要输出一个具体的“高送转概率”作为决策依据那就要用全量数据训练或对下采样模型的概率做校正。另外如果某个年度高送转特别少比如监管收紧的年份正样本可能只有十几个这时候模型学到的规律基本不可靠。务必要用多年数据合并训练不要单年度训练否则验证集的正样本太少AUC波动会非常大。5.3 模型效果不好时先别急着调参很多人拿到项目第一反应就是疯狂调LightGBM参数但效果往往提升有限。我的经验是如果你的AUC在0.7以下先优先优化特征和数据而不是模型超参数。具体排查顺序是检查标签构造是否正确。送股比例、转增比例有没有算反单位是不是“每10股”而不是“每股”检查特征对齐有没有未来数据。把时间过滤条件重新审一遍。检查特征逻辑是否合理。比如“每股资本公积”如果是负数那说明公司资本公积为负这种公司不可能转增特征分布里要允许负值存在直接填充0反而不符合业务逻辑。检查样本筛选是否合适。ST公司、上市不满一年的公司是否被剔掉了。最后才去调模型参数。按这个顺序排查完大多数情况下模型效果会有明显改善。如果全部排查完AUC还在0.7附近那说明这个场景本身的信噪比有限你可以把注意力转到Top-K命中率上看模型在概率最高的一批样本里有没有真正捕捉到价值。5.4 高分交付文档与代码的规范性作为一个“高分项目”代码规范性和文档完整度比模型效果更重要。我见过不少学生项目模型AUC挺高但代码是一坨不可复现的notebook文档就写了几百字这种答辩很容易被老师挑出问题。我的建议是代码至少分四个模块data_fetch.py负责数据获取和存储保持原始数据不动。feature_engineering.py负责从原始数据生成特征表所有时间对齐逻辑都写在这里。train_model.py负责训练、交叉验证、阈值搜索结果以JSON或CSV输出。predict.py加载训练好的模型对最新一期数据做预测输出Top名单。文档部分至少包含三部分内容。第一部分是业务背景和问题定义说明什么是高送转、为什么预测、标签怎么定。第二部分是数据说明列出每个字段的来源、含义、时点。第三部分是实验与结论记录不同特征集合和模型的效果对比解释为什么最终方案有效。能把这三部分写清楚就算模型效果差一点答辩也能站得住。写在最后做完这个项目我最大的感受是数据挖掘项目里最值钱的部分不是模型调参而是对业务逻辑和数据口径的把控。高送转预测听起来是个金融问题但真正把“资本公积高、股本小、上市时间短”这些业务常识转化成特征、再把时间对齐的坑一个个填平之后模型效果自然就出来了。这个框架也不只是能预测高送转类似的比如业绩预告、股权激励公告、回购计划都可以用同一套流程去做。你只要把标签换一换、把特征重新梳理一遍一个可复用的事件预测模型就立起来了。本文还有配套的精品资源点击获取
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进