4、数据准备与获取:个人财务数据整理与公开金融数据源

构建AI金融助手的第一个关键步骤,是解决“数据从哪里来、如何整理、如何让机器读懂”的问题。个人财务数据(收入、支出、资产、负债)与公开金融数据(行情、净值、利率、汇率)在格式、粒度、更新频率上差异巨大。本章将系统讲解数据获取渠道、清洗标准化方法,以及如何将零散数据转化为可供AI模型直接使用的结构化特征。

个人财务数据与公开金融数据融合链路 个人财务数据源 银行流水 信用卡账单 投资账户 贷款/负债 现金/电子钱包 预算/报销 数据清洗与标准化 去重/去空 格式统一 分类映射 时间对齐 异常值处理 单位换算 公开金融数据源 股票行情 基金净值 利率/汇率 宏观指标 债券/期货 另类数据 统一特征数据集(Feature Store) 个人财务画像 收支结构/资产负债/储蓄率 市场环境特征 行情趋势/利率水平/汇率波动 AI模型输入 特征向量/时间序列/标签

4.1 个人财务数据整理:从原始流水到结构化账本

核心原理:个人财务数据的“三张表”思维

个人财务数据本质上可以映射为企业的三张财务报表:现金流量表(收入与支出)、资产负债表(资产与负债)、损益表(投资收益与利息支出)。AI金融助手需要同时理解流量(Flow)与存量(Stock)数据。流量数据反映一段时间内的变化,如月收入、月支出;存量数据反映某一时点的状态,如当前存款余额、房贷剩余本金。整理数据时,必须明确每条记录的时间戳、金额方向(流入/流出)、分类标签和账户来源。

操作流程:五步完成个人财务数据整理

  1. 数据导出:从银行APP、支付宝/微信账单、券商APP、公积金中心等渠道导出CSV或Excel文件。注意选择“含交易备注”的完整导出,而非仅汇总。
  2. 字段标准化:统一日期格式(YYYY-MM-DD)、金额格式(保留两位小数)、交易类型(收入/支出/转账/投资)。
  3. 分类映射:建立“原始商户名→标准分类”的映射表。例如“美团外卖”映射到“餐饮”,“滴滴出行”映射到“交通”。
  4. 去重与校验:同一笔交易可能同时出现在信用卡账单和支付宝账单中,需通过“金额+日期+商户名”三重匹配去重。
  5. 生成汇总表:按日/周/月维度生成收支汇总,计算储蓄率、负债收入比等关键指标。
数据维度原始数据示例标准化后用途
收入工资入账 ¥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)} 个交易日")
风险提示:免费数据源存在“未来函数”风险——即某些指标在T日发布,但数据源可能用T+1日修正后的值覆盖T日数据。回测时必须使用“当时可得数据”(point-in-time data),否则AI模型会因数据泄漏而高估收益。建议对关键数据源做延迟校验,例如对比Tushare和AkShare的同一日收盘价是否一致。

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”字段(消费/转账/投资/还款),并建立跨账户关联规则。

标准化输出格式建议:所有清洗后的数据统一存储为Parquet或Feather格式(列式存储,压缩率高),并附带元数据文件(数据源、抓取时间、清洗规则版本)。这样当清洗规则更新时,可以追溯历史数据是否受影响。

4.4 常见误区与总结复盘

误区一:过度追求数据精度

个人理财场景中,金额精确到“分”意义不大,反而增加计算复杂度。建议将金额四舍五入到“元”,日期精确到“日”即可。对于AI模型,更重要的是数据的相对变化趋势而非数值。

误区二:忽略数据的时间属性

很多用户把“当前总资产”当作一个静态数字,但AI助手需要的是时间序列。例如,判断“是否该提前还贷”需要知道未来现金流分布,而非仅看当前余额。务必为每条数据打上时间戳,并保持时间粒度一致。

误区三:混合使用不同口径的数据

例如,股票价格有前复权、后复权、不复权三种口径。计算收益率时必须统一使用前复权数据;计算持仓成本时则需使用不复权数据。基金净值有“单位净值”和“累计净值”之分,分红方式不同会导致净值差异。建议在数据表中增加“adjust_type”字段。

总结:数据准备的核心原则

  • 自动化优先:手动整理数据不可持续,应编写脚本定期抓取和清洗。
  • 可追溯性:每条数据都应能追溯到原始来源和清洗过程。
  • 分层存储:原始数据(Raw)、清洗后数据(Clean)、特征数据(Feature)分开存储。
  • 持续监控:建立数据质量监控看板,当数据源接口变更或数据异常时及时告警。

完成本章的数据准备工作后,AI金融助手就拥有了“干净的食材”。下一阶段将进入特征工程与模型设计,但请记住:数据质量决定了模型性能的上限,而模型算法只是在逼近这个上限。建议读者按照本章流程,先整理自己最近6个月的财务数据,再接入公开数据源,构建一个最小可用的数据管道。