用Python+SQLite+Plotly搭建你的第一个A股数据分析工具(附完整源码)

张开发
2026/4/19 7:53:14 15 分钟阅读

分享文章

用Python+SQLite+Plotly搭建你的第一个A股数据分析工具(附完整源码)
用PythonSQLitePlotly搭建你的第一个A股数据分析工具附完整源码在数据驱动的投资时代掌握基础量化分析能力已成为个人投资者的必修课。本文将带你用最轻量的技术栈PythonSQLitePlotly构建一个功能完整的A股分析工具无需复杂框架即可实现从数据获取到可视化的全流程。这个工具特别适合想入门量化分析但被vnPy等专业框架吓退的开发者——我们只用不到200行代码就能实现专业级的K线图表与数据分析功能。1. 环境准备与工具设计工欲善其事必先利其器。我们选择的工具组合兼顾了轻量化与专业性Python 3.8数据分析的事实标准SQLite单文件数据库零配置Plotly交互式可视化利器Pandas数据处理核心库安装依赖只需一行命令pip install pandas plotly requests sqlite3整个工具的工作流设计为四个关键模块数据获取通过公开API抓取股票历史数据数据存储使用SQLite建立本地数据库数据分析计算技术指标如均线数据可视化生成交互式K线图这种模块化设计使得每个部分都可以独立优化。比如未来想更换数据源只需修改数据获取模块其他部分完全不受影响。2. 数据获取实战技巧获取A股历史数据有多种渠道我们选择腾讯财经API因其稳定性和免费特性。关键点在于处理以下问题股票代码规范沪市股票代码前加SH深市加SZ复权处理使用qfq参数获取前复权数据分块下载大数据量时按年分段请求增量更新只获取本地没有的新数据核心函数fetch_stock_data的实现要点def fetch_stock_data(symbol, exchangeSZ, start_date2010-01-01): # 分块下载逻辑 while current_date end_date: chunk_end min(current_date timedelta(days365), end_date) url fhttp://web.ifzq.gtimg.cn/appstock/app/fqkline/get?param{exchange_code}{symbol},day,{start_str},{end_str},2000,qfq # 错误处理与数据解析 try: response requests.get(url, timeout10) data response.json() for record in data[data][f{exchange_code}{symbol}][qfqday]: bar_data.append({ symbol: symbol, exchange: exchange, datetime: datetime.strptime(record[0], %Y-%m-%d), open: float(record[1]), high: float(record[3]), low: float(record[4]), close: float(record[2]), volume: float(record[5]) }) except Exception as e: print(f获取数据出错: {e})实际使用中发现三个常见问题及解决方案网络不稳定增加重试机制和超时设置数据格式变化添加字段校验逻辑请求频率限制添加适当的延时3. 数据存储优化策略SQLite虽简单但用好需要一些技巧。我们的数据库设计考虑了几个关键因素字段类型说明symbolTEXT股票代码exchangeTEXT交易所(SH/SZ)datetimeTEXT日期(主键部分)openREAL开盘价highREAL最高价lowREAL最低价closeREAL收盘价volumeREAL成交量性能优化点使用复合主键防止重复数据PRIMARY KEY (symbol, exchange, datetime)采用批量写入代替逐条插入定期执行VACUUM命令压缩数据库初始化数据库时特别要注意版本兼容性def init_database(): conn sqlite3.connect(DB_FILE) cursor conn.cursor() # 智能判断表结构是否需要更新 cursor.execute(PRAGMA table_info(stock_daily)) columns [col[1] for col in cursor.fetchall()] required_columns [symbol, exchange, datetime, open, high, low, close, volume] if not all(col in columns for col in required_columns): cursor.execute(DROP TABLE IF EXISTS stock_daily) conn.commit() # 创建新表 cursor.execute( CREATE TABLE IF NOT EXISTS stock_daily ( symbol TEXT NOT NULL, exchange TEXT NOT NULL, datetime TEXT NOT NULL, open REAL NOT NULL, high REAL NOT NULL, low REAL NOT NULL, close REAL NOT NULL, volume REAL NOT NULL, PRIMARY KEY (symbol, exchange, datetime) ) )4. 数据分析与可视化呈现数据分析的核心是技术指标计算。我们以移动平均线为例展示如何用Pandas高效计算def calculate_technical_indicators(df): # 计算5日和20日均线 df[ma5] df[close].rolling(5, min_periods1).mean() df[ma20] df[close].rolling(20, min_periods1).mean() # 添加更多指标... return df可视化部分使用Plotly的subplots功能创建专业K线图def visualize_stock_data(df, symbol, exchange): fig make_subplots(rows2, cols1, shared_xaxesTrue, vertical_spacing0.05, row_heights[0.7, 0.3]) # K线主图 fig.add_trace( go.Candlestick(xdf.index, opendf[open], highdf[high], lowdf[low], closedf[close], nameK线), row1, col1) # 均线 fig.add_trace(go.Scatter(xdf.index, ydf[ma5], linedict(colorblue, width1), name5日均线), row1, col1) # 成交量 fig.add_trace(go.Bar(xdf.index, ydf[volume], name成交量, marker_colorgray), row2, col1) # 交互功能配置 fig.update_layout( xaxis_rangeslider_visibleFalse, hovermodex unified )实际使用中Plotly的交互功能非常实用鼠标悬停查看详细数值拖动选择特定时间范围双击重置视图保存为PNG或HTML5. 项目扩展与实战建议完成基础版本后可以考虑以下增强功能数据层面添加更多技术指标MACD、KDJ等支持多股票对比分析增加基本面数据抓取功能层面实现自动化定期更新添加异常波动检测构建简单的回测框架工程化建议将配置参数外置到config文件添加更完善的日志系统使用Python Fire添加命令行接口一个特别实用的技巧是缓存机制优化。我们发现反复从API获取相同数据既低效又容易被限制因此改进后的版本会优先检查本地数据完整性def check_data_gaps(symbol, exchange): 检查数据是否存在缺失日期 conn sqlite3.connect(DB_FILE) query SELECT datetime FROM stock_daily WHERE symbol? AND exchange? ORDER BY datetime dates pd.read_sql_query(query, conn, params(symbol, exchange))[datetime] if len(dates) 0: return None date_series pd.to_datetime(dates) full_range pd.date_range(startdate_series.min(), enddate_series.max()) missing full_range.difference(date_series) return missing在三个月实际使用中这个工具成功帮助发现了某只股票的异常波动模式。最令人惊喜的是整个项目不到200行代码就实现了专业软件80%的核心功能而且完全可控、可定制。

更多文章