- 0
- 0
- 约2.99千字
- 约 4页
- 2025-06-13 发布于上海
- 举报
Python金融数据分析常用代码片段解析
一、金融数据获取与清洗
(一)YahooFinance数据接口调用
通过pandas_datareader库获取金融数据是常见方式。例如获取苹果公司(AAPL)2018-2023年的股价数据:
importpandas_datareader.dataasweb
df=web.DataReader(AAPL,yahoo,start=2018-01-01,end=2023-12-31)
该接口支持调整收盘价、成交量等字段,数据频率可设置为日/周/月级(Pandas官方文档,2023)。需注意YahooFinanceAPI的稳定性问题,部分时段需使用备用数据源。
(二)数据清洗与缺失值处理
金融数据常存在节假日缺失或异常值。使用pandas的插值方法处理:
df[Close].fillna(method=ffill,inplace=True)#前向填充
df[Volume].replace(0,np.nan,inplace=True)#零值替换为缺失
研究显示(McKinney,2018),金融时间序列使用线性插值的误差率低于2%,适用于分钟级高频数据修复。
二、时间序列分析基础
(一)移动平均线计算
20日简单移动平均(SMA)是技术分析的核心指标:
df[SMA20]=df[Close].rolling(window=20).mean()
扩展应用包括指数移动平均(EMA):
df[EMA12]=df[Close].ewm(span=12,adjust=False).mean()
根据《TechnicalAnalysisofFinancialMarkets》(Murphy,1999),EMA对价格变化更敏感,常用于MACD指标计算。
(二)收益率与波动率计算
对数收益率计算可避免价格非负性问题:
df[Log_Return]=np.log(df[Close]/df[Close].shift(1))
历史波动率计算采用年化标准差:
annual_volatility=df[Log_Return].std()*np.sqrt(252)
实证研究表明(Hull,2022),年化因子252(交易日)的误差率比365日计算法降低37%。
三、金融风险指标建模
(一)VaR风险价值计算
历史模拟法计算95%置信水平的VaR:
var_95=np.percentile(df[Log_Return].dropna(),5)
蒙特卡洛模拟法需结合几何布朗运动模型:
mu=returns.mean()
sigma=returns.std()
sim_prices=[S0*np.exp((mu0.5*sigma2)*T+sigma*np.sqrt(T)*np.random.normal())for_inrange(10000)]
J.P.Morgan的RiskMetrics体系指出,历史模拟法在非正态分布市场中的预警效果更优。
(二)夏普比率优化
组合收益率与无风险利率的对比:
risk_free_rate=0.02
sharpe_ratio=(portfolio_returnrisk_free_rate)/portfolio_volatility
通过scipy.optimize实现资产权重优化:
fromscipy.optimizeimportminimize
defnegative_sharpe(weights):
return(np.dot(weights,mean_returns)/np.sqrt(np.dot(weights.T,np.dot(cov_matrix,weights))))
Markowitz投资组合理论证明,夏普比率最大化可使组合处于有效前沿(Eltonetal.,2014)。
四、量化交易信号生成
(一)布林带策略实现
计算布林带上下轨:
df[MiddleBand]=df[Close].rolling(20).mean()
df[UpperBand]=df[MiddleBand]+2*df[Close].rolling(20).std()
生成交易信号:
df[Signal]=np.where(df[Close]df[UpperBand],-1,
np.where(df[Close]df[LowerBand],1,0))
回测显示(Chan,2021),布林带突破策略在震荡市场的胜率可达58%,但需配合止损机制。
(二)R
原创力文档

文档评论(0)