从零构建你的第一个股票量化分析项目数据获取到可视化实战最近两年身边越来越多的朋友开始关注量化投资——用数据和算法辅助投资决策。但很多初学者在迈出第一步时就遇到了难题如何快速获取可靠的金融数据怎样用Python进行基础分析本文将带你完整实现一个迷你量化分析项目从安装工具到生成专业图表全程只需不到50行代码。这个项目特别适合已经掌握Python和Pandas基础想要尝试金融数据分析的开发者。我们将使用efinance这个轻量级金融数据接口获取贵州茅台和宁德时代等明星股票的历史行情通过Pandas进行数据清洗和特征计算最终用Matplotlib生成包含价格走势和成交量的专业图表。整个过程就像搭积木一样把各个技术模块有机组合起来。1. 环境准备与工具安装工欲善其事必先利其器。我们需要配置一个干净的Python环境推荐3.8版本并安装几个核心工具库pip install efinance pandas matplotlib这三个库各司其职efinance获取股票、基金等金融数据的轻量级接口pandas数据处理和分析的核心工具matplotlib生成专业可视化图表提示如果安装速度慢可以尝试使用国内镜像源如pip install -i https://pypi.tuna.tsinghua.edu.cn/simple package_name验证安装是否成功import efinance as ef import pandas as pd import matplotlib.pyplot as plt print(ef.__version__, pd.__version__, plt.__version__)2. 股票数据获取实战金融数据分析的第一步是获取可靠的数据源。efinance提供了简洁的API接口可以获取A股、港股、美股等多种市场数据。我们先定义一个通用函数来获取股票历史行情def fetch_stock_data(stock_code, start_date20230101, end_date20231231): 获取股票历史行情数据 参数 stock_code: 股票代码如600519 start_date: 开始日期格式YYYYMMDD end_date: 结束日期格式YYYYMMDD 返回 处理好的DataFrame df ef.stock.get_quote_history( stock_code, begstart_date, endend_date ) # 数据清洗与格式化 df df[[日期, 开盘, 收盘, 最高, 最低, 成交量]] df.columns [date, open, close, high, low, volume] df[date] pd.to_datetime(df[date]) df.set_index(date, inplaceTrue) return df获取茅台(600519)和宁德时代(300750)2023年的数据maotai fetch_stock_data(600519) catl fetch_stock_data(300750)查看数据样例dateopenclosehighlowvolume2023-01-031760.01771.01782.01755.033843682023-01-041775.01765.01788.01760.031900353. 数据清洗与特征工程原始数据往往需要经过处理才能用于分析。常见的操作包括处理缺失值、计算衍生指标等。处理缺失值检查并填充缺失数据print(maotai.isnull().sum()) # 检查缺失值 maotai.fillna(methodffill, inplaceTrue) # 前向填充计算技术指标添加涨跌幅和移动平均线# 日涨跌幅 maotai[pct_change] maotai[close].pct_change() * 100 # 5日均线 maotai[ma5] maotai[close].rolling(5).mean() # 20日均线 maotai[ma20] maotai[close].rolling(20).mean()处理后的数据样例dateclosepct_changema5ma202023-01-031771.0NaNNaNNaN2023-01-041765.0-0.34NaNNaN2023-01-051789.01.36NaNNaN4. 专业级可视化分析金融数据分析的最终目的是从数据中获取洞见。我们将使用Matplotlib创建包含多个子图的专业图表plt.figure(figsize(12, 8)) # 价格走势子图 plt.subplot(2, 1, 1) plt.plot(maotai.index, maotai[close], label收盘价, colorblue) plt.plot(maotai.index, maotai[ma5], label5日均线, linestyle--, colororange) plt.plot(maotai.index, maotai[ma20], label20日均线, linestyle:, colorgreen) plt.title(贵州茅台2023年股价走势, fontsize14) plt.ylabel(价格(元), fontsize12) plt.legend() # 成交量子图 plt.subplot(2, 1, 2) plt.bar(maotai.index, maotai[volume], colorgray) plt.title(成交量, fontsize14) plt.ylabel(成交量(手), fontsize12) plt.tight_layout() plt.show()这段代码会生成一个包含两个子图的专业图表上部显示价格走势和均线下部显示成交量变化5. 多股票对比分析量化分析的优势之一是可以轻松进行跨资产比较。让我们对比茅台和宁德时代的走势# 标准化价格以首日收盘价为基准 maotai[norm_price] maotai[close] / maotai[close].iloc[0] catl[norm_price] catl[close] / catl[close].iloc[0] plt.figure(figsize(10, 6)) plt.plot(maotai.index, maotai[norm_price], label贵州茅台) plt.plot(catl.index, catl[norm_price], label宁德时代) plt.title(标准化价格走势对比(2023), fontsize14) plt.ylabel(相对收益, fontsize12) plt.legend() plt.grid(True) plt.show()这种标准化处理消除了价格绝对值的差异让我们能更公平地比较不同股票的表现。6. 扩展应用与进阶方向完成基础分析后你可以进一步探索更多技术指标计算# 计算RSI(14) delta maotai[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[rsi] 100 - (100 / (1 rs))数据存储与回测# 保存数据到CSV maotai.to_csv(maotai_2023.csv) # 从CSV加载数据 df pd.read_csv(maotai_2023.csv, parse_dates[date], index_coldate)交互式可视化import plotly.graph_objects as go fig go.Figure(data[go.Candlestick( xmaotai.index, openmaotai[open], highmaotai[high], lowmaotai[low], closemaotai[close] )]) fig.update_layout(title贵州茅台K线图(2023)) fig.show()在实际项目中我通常会先运行这样的小规模分析验证数据质量然后再扩展到更复杂的策略。记得定期保存你的分析结果——金融数据获取有时并不稳定有了本地备份可以避免重复工作。
你的第一个量化分析项目:从efinance获取股票数据到用Pandas进行可视化分析
从零构建你的第一个股票量化分析项目数据获取到可视化实战最近两年身边越来越多的朋友开始关注量化投资——用数据和算法辅助投资决策。但很多初学者在迈出第一步时就遇到了难题如何快速获取可靠的金融数据怎样用Python进行基础分析本文将带你完整实现一个迷你量化分析项目从安装工具到生成专业图表全程只需不到50行代码。这个项目特别适合已经掌握Python和Pandas基础想要尝试金融数据分析的开发者。我们将使用efinance这个轻量级金融数据接口获取贵州茅台和宁德时代等明星股票的历史行情通过Pandas进行数据清洗和特征计算最终用Matplotlib生成包含价格走势和成交量的专业图表。整个过程就像搭积木一样把各个技术模块有机组合起来。1. 环境准备与工具安装工欲善其事必先利其器。我们需要配置一个干净的Python环境推荐3.8版本并安装几个核心工具库pip install efinance pandas matplotlib这三个库各司其职efinance获取股票、基金等金融数据的轻量级接口pandas数据处理和分析的核心工具matplotlib生成专业可视化图表提示如果安装速度慢可以尝试使用国内镜像源如pip install -i https://pypi.tuna.tsinghua.edu.cn/simple package_name验证安装是否成功import efinance as ef import pandas as pd import matplotlib.pyplot as plt print(ef.__version__, pd.__version__, plt.__version__)2. 股票数据获取实战金融数据分析的第一步是获取可靠的数据源。efinance提供了简洁的API接口可以获取A股、港股、美股等多种市场数据。我们先定义一个通用函数来获取股票历史行情def fetch_stock_data(stock_code, start_date20230101, end_date20231231): 获取股票历史行情数据 参数 stock_code: 股票代码如600519 start_date: 开始日期格式YYYYMMDD end_date: 结束日期格式YYYYMMDD 返回 处理好的DataFrame df ef.stock.get_quote_history( stock_code, begstart_date, endend_date ) # 数据清洗与格式化 df df[[日期, 开盘, 收盘, 最高, 最低, 成交量]] df.columns [date, open, close, high, low, volume] df[date] pd.to_datetime(df[date]) df.set_index(date, inplaceTrue) return df获取茅台(600519)和宁德时代(300750)2023年的数据maotai fetch_stock_data(600519) catl fetch_stock_data(300750)查看数据样例dateopenclosehighlowvolume2023-01-031760.01771.01782.01755.033843682023-01-041775.01765.01788.01760.031900353. 数据清洗与特征工程原始数据往往需要经过处理才能用于分析。常见的操作包括处理缺失值、计算衍生指标等。处理缺失值检查并填充缺失数据print(maotai.isnull().sum()) # 检查缺失值 maotai.fillna(methodffill, inplaceTrue) # 前向填充计算技术指标添加涨跌幅和移动平均线# 日涨跌幅 maotai[pct_change] maotai[close].pct_change() * 100 # 5日均线 maotai[ma5] maotai[close].rolling(5).mean() # 20日均线 maotai[ma20] maotai[close].rolling(20).mean()处理后的数据样例dateclosepct_changema5ma202023-01-031771.0NaNNaNNaN2023-01-041765.0-0.34NaNNaN2023-01-051789.01.36NaNNaN4. 专业级可视化分析金融数据分析的最终目的是从数据中获取洞见。我们将使用Matplotlib创建包含多个子图的专业图表plt.figure(figsize(12, 8)) # 价格走势子图 plt.subplot(2, 1, 1) plt.plot(maotai.index, maotai[close], label收盘价, colorblue) plt.plot(maotai.index, maotai[ma5], label5日均线, linestyle--, colororange) plt.plot(maotai.index, maotai[ma20], label20日均线, linestyle:, colorgreen) plt.title(贵州茅台2023年股价走势, fontsize14) plt.ylabel(价格(元), fontsize12) plt.legend() # 成交量子图 plt.subplot(2, 1, 2) plt.bar(maotai.index, maotai[volume], colorgray) plt.title(成交量, fontsize14) plt.ylabel(成交量(手), fontsize12) plt.tight_layout() plt.show()这段代码会生成一个包含两个子图的专业图表上部显示价格走势和均线下部显示成交量变化5. 多股票对比分析量化分析的优势之一是可以轻松进行跨资产比较。让我们对比茅台和宁德时代的走势# 标准化价格以首日收盘价为基准 maotai[norm_price] maotai[close] / maotai[close].iloc[0] catl[norm_price] catl[close] / catl[close].iloc[0] plt.figure(figsize(10, 6)) plt.plot(maotai.index, maotai[norm_price], label贵州茅台) plt.plot(catl.index, catl[norm_price], label宁德时代) plt.title(标准化价格走势对比(2023), fontsize14) plt.ylabel(相对收益, fontsize12) plt.legend() plt.grid(True) plt.show()这种标准化处理消除了价格绝对值的差异让我们能更公平地比较不同股票的表现。6. 扩展应用与进阶方向完成基础分析后你可以进一步探索更多技术指标计算# 计算RSI(14) delta maotai[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[rsi] 100 - (100 / (1 rs))数据存储与回测# 保存数据到CSV maotai.to_csv(maotai_2023.csv) # 从CSV加载数据 df pd.read_csv(maotai_2023.csv, parse_dates[date], index_coldate)交互式可视化import plotly.graph_objects as go fig go.Figure(data[go.Candlestick( xmaotai.index, openmaotai[open], highmaotai[high], lowmaotai[low], closemaotai[close] )]) fig.update_layout(title贵州茅台K线图(2023)) fig.show()在实际项目中我通常会先运行这样的小规模分析验证数据质量然后再扩展到更复杂的策略。记得定期保存你的分析结果——金融数据获取有时并不稳定有了本地备份可以避免重复工作。