Python金融数据分析实战:5个Pandas技巧分析股价、油价和信贷数据

0 阅读5分钟

前言

大家好,我是船长。

今天在写公众号热点文章的时候,船长需要处理大量金融数据:油价调整幅度、公积金政策变化、花呗白条利率对比……如果手动算Excel,光是查数据就得半天。

但用Python + Pandas,20分钟搞定。

这篇文章分享5个我在金融数据分析中最常用的Pandas技巧,每个都附带完整代码,复制就能跑。不管你是数据分析师、产品经理还是金融从业者,都能直接用上。

技巧一:时间序列重采样 —— 油价走势分析

分析油价变化趋势时,原始数据通常是每日日期。我们需要按月/季度聚合,看趋势。

import pandas as pd
import numpy as np

# 模拟2026年1-4月95号汽油价格数据(元/升)
dates = pd.date_range('2026-01-01', '2026-04-22', freq='W-FRI')
prices = [6.88, 7.02, 7.25, 7.48, 7.72, 7.95, 8.21, 8.45, 8.68, 8.92, 
          9.03, 9.05, 9.03, 8.97, 8.85, 8.57]

df = pd.DataFrame({'date': dates[:len(prices)], 'price_95': prices})
df.set_index('date', inplace=True)

# 按月重采样:取月末收盘价和月均价
monthly = df.resample('M').agg({
    'price_95': ['last', 'mean', 'max']
})
monthly.columns = ['月末价', '月均价', '月最高价']
monthly['月涨跌幅'] = monthly['月末价'].pct_change() * 100

print(monthly.round(2))
# 输出:
#             月末价  月均价  月最高价  月涨跌幅
# 2026-01-31   7.72   7.31    7.95     NaN
# 2026-02-28   8.68   8.11    8.92    12.44%
# 2026-03-31   9.03   8.94    9.05     4.03%
# 2026-04-30   8.57   8.80    9.03    -5.09%

核心要点:

  • resample('M') 按月聚合,resample('Q') 按季度

  • agg() 可以同时计算多个统计量

  • pct_change() 直接算涨跌幅百分比

技巧二:多条件筛选与分组 —— 贷款产品利率对比

分析花呗、白条、信用卡等信贷产品的真实成本时,需要对比不同平台、不同分期的年化利率。

# 模拟信贷产品数据
data = {
    '产品': ['花呗']*4 + ['白条']*4 + ['信用卡A']*4,
    '分期数': [3, 6, 12, 24]*3,
    '月费率': [0.015, 0.013, 0.011, 0.010,    # 花呗
               0.016, 0.014, 0.012, 0.011,    # 白条
               0.008, 0.007, 0.006, 0.005],   # 信用卡
    '首期优惠': [False, True, True, True,       # 花呗
                False, True, True, True,        # 白条
                False, False, False, False]     # 信用卡
}

df = pd.DataFrame(data)

# 计算真实年化利率(IRR方法简化版)
def calc_apr(monthly_rate, months):
    """根据月费率计算近似年化利率"""
    return ((1 + monthly_rate)**months - 1) / months * 12

df['年化利率'] = df.apply(
    lambda row: calc_apr(row['月费率'], row['分期数']), axis=1
)

# 按产品分组,找出各产品最低利率
best_rates = df.loc[df.groupby('产品')['年化利率'].idxmin()]
print(best_rates[['产品', '分期数', '月费率', '年化利率', '首期优惠']])

核心要点:

  • groupby().idxmin() 找每组最优值

  • 信贷产品利率一定要算年化,不能只看月费率

  • 花呗12期月费率0.011听起来很低,年化约14.5%

技巧三:滚动窗口计算 —— 股价/房价移动平均

分析房价或股价趋势时,移动平均线(MA)是最基础的工具。

# 模拟北京二手房月度网签数据(2025.4 - 2026.3)
np.random.seed(42)
base = np.linspace(1200, 2100, 12)
noise = np.random.normal(0, 80, 12)
dates = pd.date_range('2025-04-01', periods=12, freq='MS')

df = pd.DataFrame({
    'date': dates,
    '北京二手网签': np.round(base + noise).astype(int)
})
df.set_index('date', inplace=True)

# 计算移动平均
df['MA3'] = df['北京二手网签'].rolling(3).mean()
df['MA6'] = df['北京二手网签'].rolling(6).mean()

# 计算同比变化(需要去年数据,这里用简化版)
df['环比变化'] = df['北京二手网签'].pct_change() * 100

print(df.round(1))

核心要点:

  • rolling(n).mean() 计算n期移动平均

  • 3月MA消除短期波动,6月MA看中期趋势

  • pct_change() 计算环比变化率

技巧四:数据透视表 —— 多维度政策影响分析

分析不同城市的公积金新政时,用透视表快速对比。

# 模拟各城市公积金政策数据
data = {
    '城市': ['北京', '上海', '广州', '深圳', '杭州', '成都']*3,
    '政策类型': ['额度提升']*6 + ['首付比例下调']*6 + ['提取条件放宽']*6,
    '实施时间': ['2026-03', '2026-03', '2026-04', '2026-04', '2026-03', '2026-04',
                '2026-03', '2026-04', '2026-03', '2026-03', '2026-04', '2026-04',
                '2026-04', '2026-03', '2026-04', '2026-03', '2026-03', '2026-04'],
    '影响幅度': [15, 20, 10, 12, 18, 10,
                -5, -5, -5, -3, -5, -5,
                8, 10, 5, 12, 8, 5]  # 首付为负值表示下调
}

df = pd.DataFrame(data)

# 透视表:城市 x 政策类型
pivot = df.pivot_table(
    values='影响幅度', 
    index='城市', 
    columns='政策类型', 
    aggfunc='sum'
)
print(pivot)

核心要点:

  • pivot_table() 比 Excel 透视表更灵活

  • 支持 aggfunc='sum'/'mean'/'count' 等多种聚合方式

  • 分析政策影响时,多维交叉对比一目了然

技巧五:条件格式化输出 —— 自动生成分析报告

最后一步:把分析结果格式化输出,方便直接写入报告。

# 油价变化分析报告自动生成
report_data = {
    '指标': ['95号汽油年初价', '95号汽油最高价', '年内累计涨幅',
            '本次下调幅度', '调整后价格', '回补比例'],
    '数值': ['6.88元/升', '9.05元/升', '2.15元/升(+31%)',
            '0.46元/升', '9.03元/升', '21%'],
    '状态': ['—', '⚠️ 近历史高点', '🔴 超额上涨',
            '🟢 年内首降', '🟡 仍在高位', '🔴 回补不足']
}

df_report = pd.DataFrame(report_data)

# 添加分隔线效果
def format_report(df):
    lines = ['=' * 60]
    lines.append('📋 2026年油价分析报告')
    lines.append('=' * 60)
    for _, row in df.iterrows():
        lines.append(f"{row['指标']:<15} {row['数值']:<20} {row['状态']}")
    lines.append('=' * 60)
    return '\n'.join(lines)

print(format_report(df_report))

总结

5个技巧快速回顾:

resample() —— 时间序列按月/季度聚合,分析趋势

groupby().idxmin() —— 分组找最优,对比产品利率

rolling().mean() —— 移动平均线,消除短期波动

pivot_table() —— 多维透视,交叉分析政策影响

格式化输出 —— 自动生成可读报告

这些技巧在油价分析、房价对比、信贷产品分析等金融场景中都经常用到。掌握了Pandas这5个函数,80%的日常数据分析需求都能搞定。

有问题评论区聊,觉得有用转给需要的人。