你的第一个量化分析项目:从efinance抓取茅台股价到用Pandas做可视化分析

发布时间:2026/6/9 4:12:05

你的第一个量化分析项目:从efinance抓取茅台股价到用Pandas做可视化分析 从零构建茅台股价分析系统Python量化实战指南在金融科技蓬勃发展的今天掌握基础量化分析技能已成为职场人士的加分项。本文将带您用Python搭建完整的股价分析系统从数据获取到可视化呈现全程采用项目驱动式学习方法。不同于传统教程的碎片化知识灌输我们将以贵州茅台600519.SH为分析对象通过真实场景串联efinance数据抓取、Pandas数据处理和Matplotlib可视化三大核心技能。1. 环境配置与数据获取工欲善其事必先利其器。我们首先需要搭建Python数据分析环境。推荐使用Anaconda发行版它预装了数据分析所需的绝大多数依赖包。conda create -n stock_analysis python3.8 conda activate stock_analysis pip install efinance pandas matplotlib seabornefinance是一个免费的中国金融市场数据接口库支持股票、基金、债券等多种金融产品。获取茅台历史行情数据仅需几行代码import efinance as ef import pandas as pd def fetch_stock_data(stock_code, start_date, end_date): 获取指定日期范围内的股票历史数据 参数 stock_code: 股票代码如600519 start_date: 开始日期格式YYYYMMDD end_date: 结束日期格式YYYYMMDD 返回 包含历史行情数据的DataFrame df ef.stock.get_quote_history( stock_code, begstart_date, endend_date ) # 数据清洗 df df.iloc[:, :9] df.columns [name, code, date, open, close, high, low, volume, turnover] df.index pd.to_datetime(df[date]) return df.drop([name, code, date], axis1) # 示例获取茅台2023年数据 maotai_2023 fetch_stock_data(600519, 20230101, 20231231)注意首次使用efinance时可能会遇到SSL证书错误可通过pip install --upgrade certifi更新证书库解决。2. 数据清洗与特征工程原始数据往往包含噪音和缺失值需要进行预处理才能用于分析。Pandas提供了强大的数据清洗工具链。2.1 基础清洗流程# 检查缺失值 print(maotai_2023.isnull().sum()) # 处理异常值例如价格为0的记录 maotai_2023 maotai_2023[maotai_2023[close] 0] # 添加涨跌幅特征 maotai_2023[pct_change] maotai_2023[close].pct_change() * 100 # 添加5日、20日均线 maotai_2023[ma5] maotai_2023[close].rolling(5).mean() maotai_2023[ma20] maotai_2023[close].rolling(20).mean()2.2 关键指标计算金融分析中常用技术指标的计算方法指标名称计算公式市场意义收益率(当日收盘价-前日收盘价)/前日收盘价单日投资回报率波动率收益率的标准差股票风险程度RSI相对强弱指数100 - (100 / (1 平均上涨幅度/平均下跌幅度))超买超卖信号# 计算20日波动率 maotai_2023[volatility] maotai_2023[pct_change].rolling(20).std() # 计算14日RSI delta maotai_2023[close].diff() gain delta.where(delta 0, 0) loss -delta.where(delta 0, 0) avg_gain gain.rolling(14).mean() avg_loss loss.rolling(14).mean() rs avg_gain / avg_loss maotai_2023[rsi] 100 - (100 / (1 rs))3. 数据可视化分析可视化是量化分析的关键环节能直观揭示数据规律。我们使用Matplotlib和Seaborn构建专业级图表。3.1 K线图绘制import matplotlib.pyplot as plt from mplfinance.original_flavor import candlestick_ohlc import matplotlib.dates as mdates # 准备数据 plot_data maotai_2023.reset_index()[[date, open, high, low, close]] plot_data[date] plot_data[date].map(mdates.date2num) # 创建画布 fig, ax plt.subplots(figsize(12, 6)) candlestick_ohlc(ax, plot_data.values, width0.6, colorupr, colordowng) # 添加均线 ax.plot(maotai_2023.index, maotai_2023[ma5], label5日均线, linewidth1) ax.plot(maotai_2023.index, maotai_2023[ma20], label20日均线, linewidth1) # 图表装饰 ax.xaxis_date() ax.grid(True) plt.title(贵州茅台2023年K线图) plt.legend() plt.show()3.2 交易量热力图import seaborn as sns # 创建月交易量热力图 maotai_2023[month] maotai_2023.index.month volume_pivot maotai_2023.pivot_table( indexmonth, columnsmaotai_2023.index.day, valuesvolume, aggfuncsum ) plt.figure(figsize(12, 6)) sns.heatmap(volume_pivot, cmapYlOrRd) plt.title(茅台2023年月度交易量分布热力图) plt.xlabel(日期) plt.ylabel(月份) plt.show()4. 深入分析技巧掌握了基础分析流程后我们可以进一步挖掘数据价值。4.1 相关性分析# 计算各指标相关系数 corr_matrix maotai_2023[[close, volume, pct_change, volatility, rsi]].corr() # 绘制热力图 plt.figure(figsize(8, 6)) sns.heatmap(corr_matrix, annotTrue, cmapcoolwarm, center0) plt.title(股价指标相关性分析) plt.show()4.2 事件影响分析重大事件往往会对股价产生显著影响。我们可以标记特定日期分析事件前后股价变化# 假设2023年6月15日有重大公告 event_date pd.to_datetime(2023-06-15) window 10 # 分析前后10个交易日 # 提取事件窗口数据 event_period maotai_2023.loc[ (maotai_2023.index event_date - pd.Timedelta(dayswindow)) (maotai_2023.index event_date pd.Timedelta(dayswindow)) ] # 绘制事件影响图 plt.figure(figsize(10, 5)) plt.plot(event_period.index, event_period[close], markero) plt.axvline(xevent_date, colorr, linestyle--, label事件日) plt.title(重大公告对茅台股价的影响) plt.legend() plt.grid(True) plt.show()5. 策略回测基础量化分析最终要服务于投资决策。下面演示一个简单的均线交叉策略# 生成交易信号 maotai_2023[signal] 0 maotai_2023.loc[maotai_2023[ma5] maotai_2023[ma20], signal] 1 maotai_2023.loc[maotai_2023[ma5] maotai_2023[ma20], signal] -1 # 计算策略收益 maotai_2023[strategy_return] maotai_2023[signal].shift(1) * maotai_2023[pct_change] # 绘制收益曲线 cumulative_returns (1 maotai_2023[[pct_change, strategy_return]]/100).cumprod() plt.figure(figsize(10, 5)) cumulative_returns.plot() plt.title(均线交叉策略 vs 买入持有策略) plt.ylabel(累计收益率) plt.grid(True) plt.show()在实际项目中我经常发现新手容易忽略交易成本的影响。一个看似盈利的策略考虑0.1%的交易费用后可能就变得不可行。建议在初步策略验证后务必加入交易成本、滑点等现实因素进行更严谨的测试。

相关新闻