4、数据准备与获取:个人财务数据整理与公开金融数据源
构建AI金融助手的第一个关键步骤,是解决“数据从哪里来、如何整理、如何让机器读懂”的问题。个人财务数据(收入、支出、资产、负债)与公开金融数据(行情、净值、利率、汇率)在格式、粒度、更新频率上差异巨大。本章将系统讲解数据获取渠道、清洗标准化方法,以及如何将零散数据转化为可供AI模型直接使用的结构化特征。
4.1 个人财务数据整理:从原始流水到结构化账本
核心原理:个人财务数据的“三张表”思维
个人财务数据本质上可以映射为企业的三张财务报表:现金流量表(收入与支出)、资产负债表(资产与负债)、损益表(投资收益与利息支出)。AI金融助手需要同时理解流量(Flow)与存量(Stock)数据。流量数据反映一段时间内的变化,如月收入、月支出;存量数据反映某一时点的状态,如当前存款余额、房贷剩余本金。整理数据时,必须明确每条记录的时间戳、金额方向(流入/流出)、分类标签和账户来源。
操作流程:五步完成个人财务数据整理
- 数据导出:从银行APP、支付宝/微信账单、券商APP、公积金中心等渠道导出CSV或Excel文件。注意选择“含交易备注”的完整导出,而非仅汇总。
- 字段标准化:统一日期格式(YYYY-MM-DD)、金额格式(保留两位小数)、交易类型(收入/支出/转账/投资)。
- 分类映射:建立“原始商户名→标准分类”的映射表。例如“美团外卖”映射到“餐饮”,“滴滴出行”映射到“交通”。
- 去重与校验:同一笔交易可能同时出现在信用卡账单和支付宝账单中,需通过“金额+日期+商户名”三重匹配去重。
- 生成汇总表:按日/周/月维度生成收支汇总,计算储蓄率、负债收入比等关键指标。
| 数据维度 | 原始数据示例 | 标准化后 | 用途 |
|---|---|---|---|
| 收入 | 工资入账 ¥23,500.00 | {"date":"2025-03-10","amount":23500.00,"category":"salary","source":"bank"} | 现金流预测 |
| 支出 | 京东商城 ¥899.00 | {"date":"2025-03-12","amount":899.00,"category":"shopping","source":"credit_card"} | 消费分析 |
| 资产 | 股票账户市值 | {"date":"2025-03-15","market_value":158000,"type":"equity"} | 资产配置 |
| 负债 | 房贷剩余本金 | {"date":"2025-03-01","principal":1250000,"rate":3.85,"term":28} | 负债管理 |
4.2 公开金融数据源:获取与选择策略
核心原理:公开数据的层级与可靠性
公开金融数据可分为三个层级:权威官方数据(央行、交易所、证监会发布)、专业金融终端数据(Wind、Bloomberg,通常收费)、互联网开放数据(Yahoo Finance、Tushare、AkShare等)。对于个人AI助手项目,优先推荐使用AkShare(开源Python库)和Tushare Pro(需注册获取),它们覆盖股票、基金、债券、期货、外汇、宏观指标等全品类数据,且接口稳定。
判断方法:选择数据源的五个评估维度
- 时效性:实时行情(毫秒级)还是日线数据(收盘后更新)?个人理财助手通常日线足够。
- 历史深度:是否提供5年、10年甚至更长的历史数据?回测需要至少3年。
- 字段完整性:是否包含前复权/后复权价格、成交量、换手率等衍生字段?
- 访问限制:是否需要付费?是否有调用频率限制(如每分钟最多200次)?
- 数据质量:是否有除权除息调整?是否有停牌标记?是否有数据缺失说明?
实战场景:搭建一个多源数据获取脚本
假设我们需要构建一个“个人理财仪表盘”,需要同时获取:自选股行情、基金净值、LPR利率、美元兑人民币汇率。以下是一个基于AkShare的示例代码框架:
import akshare as ak
import pandas as pd
from datetime import datetime
# 1. 获取股票日线数据(前复权)
stock_df = ak.stock_zh_a_hist(symbol="600519", period="daily",
start_date="20240101", end_date="20250301",
adjust="qfq")
# 2. 获取基金净值
fund_df = ak.fund_open_fund_info_em(symbol="110022", indicator="单位净值走势")
# 3. 获取LPR利率(贷款市场报价利率)
lpr_df = ak.macro_china_lpr()
# 4. 获取美元兑人民币汇率(在岸)
fx_df = ak.currency_boc_sina(symbol="美元", start_date="20240101", end_date="20250301")
# 统一日期格式
for df in [stock_df, fund_df, lpr_df, fx_df]:
df['date'] = pd.to_datetime(df['date']).dt.strftime('%Y-%m-%d')
# 合并到统一时间轴
all_dates = sorted(set(stock_df['date']) | set(fund_df['date']) |
set(lpr_df['date']) | set(fx_df['date']))
print(f"数据合并完成,共 {len(all_dates)} 个交易日")
4.3 数据清洗与标准化:让机器读懂财务语言
核心原理:清洗的四个层次
数据清洗不是简单的“删掉空值”,而是系统性的质量治理。第一层是完整性处理——缺失值填充(前向填充、插值或删除);第二层是一致性处理——统一单位(万元/元)、币种(人民币/美元)、频率(日/周/月);第三层是准确性处理——异常值检测(如单笔消费超过月收入10倍)、重复记录识别;第四层是时效性处理——确保时间戳对齐,避免“未来数据”混入。
操作流程:标准化流水线设计
| 步骤 | 操作 | 示例 | 工具/方法 |
|---|---|---|---|
| 1 | 格式统一 | "2024/3/5" → "2024-03-05" | pandas.to_datetime() |
| 2 | 单位换算 | 美元→人民币(乘以汇率) | 自定义函数 |
| 3 | 分类标准化 | "餐饮美食"→"food" | 映射字典 |
| 4 | 异常值标记 | 支出金额为负或超过阈值 | IQR方法 / Z-score |
| 5 | 时间对齐 | 日频数据重采样为周频 | df.resample('W').sum() |
| 6 | 特征工程 | 计算月储蓄率、负债收入比 | 滚动窗口计算 |
案例拆解:一个真实的“数据打架”场景
背景:某用户同时使用招商银行信用卡和支付宝花呗,2024年12月账单显示“双12购物”支出共计12,800元。但AI助手在汇总时发现,招商银行账单中有3笔“支付宝-淘宝”交易(合计8,200元),支付宝账单中有2笔“招行信用卡还款”记录(合计8,200元)。如果简单相加,总支出会虚增8,200元。
分析过程:通过“金额+日期+商户名”三重匹配,识别出这8,200元是同一笔消费在两个平台上的重复记录。进一步检查发现,支付宝的“招行信用卡还款”属于资金转移而非消费支出,应从支出中剔除。
处理方案:建立“账户间转账”白名单规则——当A账户的支出与B账户的还款金额一致且时间差在3天内时,自动标记为“内部转账”,不计入消费支出。同时,在分类映射表中增加“还款”关键词的优先级。
结果对比:清洗前,12月总支出被高估约35%;清洗后,实际消费支出为9,600元,储蓄率从错误的-2%修正为8.5%。
复盘经验:个人财务数据清洗的核心不是“删除”,而是“识别交易本质”。建议为每笔交易增加“transaction_type”字段(消费/转账/投资/还款),并建立跨账户关联规则。
4.4 常见误区与总结复盘
误区一:过度追求数据精度
个人理财场景中,金额精确到“分”意义不大,反而增加计算复杂度。建议将金额四舍五入到“元”,日期精确到“日”即可。对于AI模型,更重要的是数据的相对变化趋势而非数值。
误区二:忽略数据的时间属性
很多用户把“当前总资产”当作一个静态数字,但AI助手需要的是时间序列。例如,判断“是否该提前还贷”需要知道未来现金流分布,而非仅看当前余额。务必为每条数据打上时间戳,并保持时间粒度一致。
误区三:混合使用不同口径的数据
例如,股票价格有前复权、后复权、不复权三种口径。计算收益率时必须统一使用前复权数据;计算持仓成本时则需使用不复权数据。基金净值有“单位净值”和“累计净值”之分,分红方式不同会导致净值差异。建议在数据表中增加“adjust_type”字段。
总结:数据准备的核心原则
- 自动化优先:手动整理数据不可持续,应编写脚本定期抓取和清洗。
- 可追溯性:每条数据都应能追溯到原始来源和清洗过程。
- 分层存储:原始数据(Raw)、清洗后数据(Clean)、特征数据(Feature)分开存储。
- 持续监控:建立数据质量监控看板,当数据源接口变更或数据异常时及时告警。
完成本章的数据准备工作后,AI金融助手就拥有了“干净的食材”。下一阶段将进入特征工程与模型设计,但请记住:数据质量决定了模型性能的上限,而模型算法只是在逼近这个上限。建议读者按照本章流程,先整理自己最近6个月的财务数据,再接入公开数据源,构建一个最小可用的数据管道。