一、独立标题 & 差异化定位
Finance — 全市场金融数据智能分析平台 | 多源数据融合・因子挖掘・统计建模・可视化洞察・量化赋能一体化工作台
核心定位
一站式覆盖股票、期货、基金、债券、指数、宏观经济的专业金融数据分析引擎,集数据采集、清洗、因子计算、统计分析、可视化、数据建模、报表导出于一体。深度打通前文 Backtest Expert、Stock Monitor、Baidu Web Search、WeChat MP CN 等工具,实现行情数据→舆情数据→量化因子→策略回测→风险监控全链路闭环,兼顾投研分析、量化开发、风控复盘、行情研判等场景。
独家改造特色(区别于普通数据分析工具)
- 多源异构数据融合 统一接入行情、财务、资金、舆情、宏观、公告六大类数据,自动对齐时间维度、补全缺失值、标准化字段,解决金融数据来源杂乱、格式不一问题。
- 专业金融因子体系 内置量价、基本面、资金流向、情绪舆情、日内分时五大类因子,支持自定义因子编辑器,公式化编写、一键批量计算,适配量化策略开发。
- 多维统计分析模型 原生实现收益率分布、相关性分析、波动率聚类、风险敞口、胜率盈亏统计、滚动回归等专业金融统计能力,满足投研深度分析需求。
- 分时 + 日线 + 逐笔全周期分析 支持多时间维度联动分析,日线看趋势、分时找拐点、逐笔拆盘口,适配短线、中线、长线不同交易风格。
- 智能数据分层与缓存 对接
Memory Tiering,高频行情、实时因子常驻高速内存,历史财报、年度宏观数据下沉冷存储,千万级数据计算提速 50%+。 - 生态全链路打通 分析结果直接输出为
Backtest Expert策略因子、Stock Monitor监控标的、Remotion 动态数据视频、社媒调度工具自动分发研报。 - 风控预警与异常识别 自动识别异动行情、流动性缺口、估值偏离、资金异常流出,配置阈值后实时告警。
- 模板化报表与批量导出 内置研报、持仓分析、风险报告、业绩对比等模板,一键生成 Excel/PDF/HTML 报表,支持定时批量导出。
二、传统金融分析工具痛点
- ❌ 数据割裂:行情、财务、舆情分属不同平台,手动汇总耗时易错
- ❌ 功能单一:仅基础 K 线展示,缺少专业因子、统计建模能力
- ❌ 扩展困难:自定义指标 / 因子需要深度二次开发,门槛高
- ❌ 性能不足:海量历史数据查询、批量计算卡顿严重
- ❌ 链路孤立:分析结果无法直接对接回测、实盘监控等工具
- ❌ 无异常监控:只能事后分析,无法实时捕捉行情、资金异动
三、核心功能模块
1. 多源数据接入模块
- 行情数据:A 股、期货、ETF、可转债、指数、港股 / 美股,支持日线 / 分时 / 5 分钟 / 逐笔
- 基本面数据:财报、营收、净利润、市盈率、市净率、资产负债、分红送配
- 资金数据:主力净流入、北向资金、龙虎榜、大单 / 中单 / 散户持仓
- 舆情 & 资讯:新闻、公众号文章、股吧评论、行业热点(对接百度搜索、公众号监控)
- 宏观数据:CPI、PMI、利率、汇率、行业景气度
- 公告数据:业绩预告、减持、并购、监管公告
2. 数据清洗 & 标准化模块
- 除权除息、复权计算(前复权 / 后复权)
- 缺失值填充、异常价格过滤、停牌数据剔除
- 数据归一化、字段统一、时间轴对齐
- 数据去重、版本归档、历史回溯
3. 金融因子计算模块
- 量价因子:均线、MACD、KDJ、BOLL、动量、反转、振幅
- 基本面因子:估值因子、成长因子、盈利因子、偿债能力因子
- 资金因子:资金净流入、大单占比、筹码分布、换手率因子
- 舆情因子:情感得分、热度指数、关键词权重
- 自定义因子:公式编辑器、函数库、批量计算、因子回测检验
4. 专业统计分析模块
- 基础统计:区间收益、最大回撤、波动率、胜率、盈亏比
- 相关性分析:标的联动、板块轮动、因子相关性矩阵
- 分布分析:收益率直方图、分位数、极值统计
- 回归分析:线性回归、滚动回归、因子有效性检验
- 组合分析:标的相关性、风险分散度、板块集中度
5. 可视化分析模块
- K 线 + 指标组合图、分时量价图、资金流向曲线
- 相关性热力图、收益分布直方图、回撤走势图
- 板块涨跌排行、龙虎榜可视化、舆情情感趋势图
- 交互式图表,支持缩放、选区间、单点数据查询
6. 风险监控 & 异动预警
- 价格异动:涨跌超阈值、连续涨跌、跳空缺口告警
- 资金异动:大单突袭、北向资金大幅流入流出告警
- 估值异动:市盈率 / 市净率偏离历史区间告警
- 流动性监控:成交量萎缩、盘口深度不足预警
7. 报表 & 导出模块
- 固定模板:个股分析、组合持仓、行业对比、风险报告
- 自定义报表:自由拖拽字段、配置统计规则
- 导出格式:Excel、CSV、PDF、HTML、JSON
- 定时任务:每日 / 每周自动生成报表并推送
8. 生态对接模块
- 向
Backtest Expert输出因子数据、标的池,用于策略回测 - 向
Stock Monitor推送优选标的、异动标的,开启实时监控 - 对接
Remotion将分析图表生成动态讲解视频 - 对接
Social Media Scheduler自动分发研报、分析内容
四、项目目录结构
plaintext
finance/
├── config/ # 全局配置、数据源、告警规则、缓存策略
├── core/ # 数据内核、数据清洗、复权计算、时间对齐
├── data_source/ # 多数据源对接(Tushare/Akshare/爬虫)
├── factor/ # 金融因子库、自定义因子引擎、因子检验
├── statistics/ # 统计分析、回归、相关性、分布计算
├── visual/ # 可视化图表、绘图组件
├── risk_warn/ # 风险识别、异动检测、告警推送
├── report/ # 报表模板、生成引擎、导出工具
├── api/ # FastAPI接口、对外服务、OpenClaw对接
├── task/ # 定时任务、批量计算、任务队列
├── utils/ # 工具函数、日志、内存分层适配
├── web/ # 前端交互式分析看板
├── requirements.txt # 项目依赖
└── main.py # 项目入口
五、完整二次开发代码
1. requirements.txt
txt
# 数据获取
tushare>=1.7.9
akshare>=1.12.0
requests>=2.31.0
beautifulsoup4>=4.12.0
# 数据处理
numpy>=1.24.0
pandas>=2.0.0
scipy>=1.10.0
# 统计建模
scikit-learn>=1.3.0
statsmodels>=0.14.0
# 可视化
matplotlib>=3.7.0
plotly>=5.17.0
seaborn>=0.13.0
# 接口与调度
fastapi>=0.104.0
uvicorn>=0.24.0
apscheduler>=3.10.0
# 缓存与工具
redis>=5.0.0
loguru>=0.7.2
python-dotenv>=1.0.0
openpyxl>=3.1.0
jinja2>=3.1.0
2. 全局配置 config/settings.py
python
运行
import os
from dotenv import load_dotenv
load_dotenv()
# 数据源密钥
TUSHARE_TOKEN = os.getenv("TUSHARE_TOKEN", "")
# 数据存储路径
RAW_DATA_DIR = "./data/raw"
CLEAN_DATA_DIR = "./data/clean"
REPORT_DIR = "./report/output"
# 复权设置: qfq前复权 / hfq后复权 / none不复权
ADJUST_TYPE = "qfq"
# 内存分层配置(对接Memory Tiering)
HOT_DATA_EXPIRE = 1800
COLD_DATA_COMPRESS = True
# 风险告警阈值
PRICE_CHANGE_WARN = 0.05 # 涨跌5%触发告警
NET_MONEY_WARN = 50000000 # 单日资金异动5000万
# 接口配置
API_HOST = "0.0.0.0"
API_PORT = 8100
# 定时任务时区
TIMEZONE = "Asia/Shanghai"
3. 日志工具 utils/logger.py
python
运行
from loguru import logger
import os
from config.settings import RAW_DATA_DIR
log_file = os.path.join(RAW_DATA_DIR, "finance_run.log")
logger.add(
log_file,
rotation="500 MB",
retention="30 days",
level="INFO",
encoding="utf-8",
enqueue=True
)
def get_logger():
return logger
4. 数据源引擎 data_source/data_loader.py
python
运行
import tushare
import pandas as pd
from datetime import datetime
from config.settings import TUSHARE_TOKEN, ADJUST_TYPE
from utils.logger import get_logger
logger = get_logger()
tushare.set_token(TUSHARE_TOKEN)
pro = tushare.pro_api()
class DataLoader:
def __init__(self):
self.cache = {}
def get_daily_bar(self, ts_code, start_date, end_date):
"""获取日线行情 + 复权处理"""
cache_key = f"{ts_code}_{start_date}_{end_date}"
if cache_key in self.cache:
return self.cache[cache_key]
try:
# 原始行情
df = pro.daily(
ts_code=ts_code,
start_date=start_date.replace("-", ""),
end_date=end_date.replace("-", "")
)
if df.empty:
logger.warning(f"无行情数据:{ts_code}")
return None
# 复权因子
adj_factor = pro.adj_factor(
ts_code=ts_code,
start_date=start_date.replace("-", ""),
end_date=end_date.replace("-", "")
)
df = df.merge(adj_factor, on="trade_date", how="left")
df["adj_factor"] = df["adj_factor"].fillna(1)
# 复权计算
if ADJUST_TYPE == "qfq":
df["open"] = df["open"] * df["adj_factor"]
df["high"] = df["high"] * df["adj_factor"]
df["low"] = df["low"] * df["low"] * df["adj_factor"]
df["close"] = df["close"] * df["adj_factor"]
elif ADJUST_TYPE == "hfq":
latest_factor = df["adj_factor"].iloc[0]
df["open"] = df["open"] * df["adj_factor"] / latest_factor
df["high"] = df["high"] * df["adj_factor"] / latest_factor
df["low"] = df["low"] * df["adj_factor"] / latest_factor
df["close"] = df["close"] * df["adj_factor"] / latest_factor
# 日期格式化 & 排序
df["trade_date"] = pd.to_datetime(df["trade_date"])
df.rename(columns={"trade_date": "date"}, inplace=True)
df = df.sort_values("date").reset_index(drop=True)
df = df[df["vol"] > 0]
self.cache[cache_key] = df
logger.info(f"行情加载完成:{ts_code} 共{len(df)}条")
return df
except Exception as e:
logger.error(f"行情获取失败 {ts_code}:{str(e)}")
return None
def get_money_flow(self, ts_code, start_date, end_date):
"""获取个股资金流向"""
try:
df = pro.moneyflow(
ts_code=ts_code,
start_date=start_date.replace("-", ""),
end_date=end_date.replace("-", "")
)
df["trade_date"] = pd.to_datetime(df["trade_date"])
df.rename(columns={"trade_date": "date"}, inplace=True)
return df.sort_values("date").reset_index(drop=True)
except Exception as e:
logger.error(f"资金流获取失败:{str(e)}")
return None
# 全局实例
data_loader = DataLoader()
5. 数据清洗内核 core/data_clean.py
python
运行
import pandas as pd
import numpy as np
from utils.logger import get_logger
logger = get_logger()
class DataCleaner:
@staticmethod
def fill_missing(df, method="ffill"):
"""缺失值填充:前向/后向/均值填充"""
if method == "ffill":
df = df.fillna(method="ffill")
elif method == "bfill":
df = df.fillna(method="bfill")
elif method == "mean":
df = df.fillna(df.mean())
return df
@staticmethod
def filter_abnormal_price(df, threshold=0.2):
"""过滤异常价格(单日涨跌幅超阈值)"""
df["pct_change"] = df["close"].pct_change()
df = df[(df["pct_change"] > -threshold) & (df["pct_change"] < threshold)]
df = df.drop(columns=["pct_change"])
return df.reset_index(drop=True)
@staticmethod
def standardize_column(df):
"""字段标准化,统一分析口径"""
standard_cols = ["date", "open", "high", "low", "close", "vol", "amount"]
exist_cols = [c for c in standard_cols if c in df.columns]
return df[exist_cols]
# 全局清洗实例
data_cleaner = DataCleaner()
6. 金融因子库 factor/finance_factor.py
python
运行
import pandas as pd
import numpy as np
class FinanceFactor:
@staticmethod
def calc_momentum(df, period=20):
"""动量因子:N日涨跌幅"""
df[f"momentum_{period}"] = df["close"].pct_change(periods=period)
return df
@staticmethod
def calc_volatility(df, period=20):
"""波动率因子"""
df["ret"] = df["close"].pct_change()
df[f"vol_{period}"] = df["ret"].rolling(window=period).std() * np.sqrt(250)
df.drop(columns=["ret"], inplace=True)
return df
@staticmethod
def calc_turnover(df):
"""换手率因子(简易)"""
df["turnover"] = df["vol"] / df["vol"].rolling(60).mean()
return df
@staticmethod
def calc_all_factors(df):
"""批量计算常用因子"""
df = FinanceFactor.calc_momentum(df, 10)
df = FinanceFactor.calc_momentum(df, 20)
df = FinanceFactor.calc_volatility(df, 20)
df = FinanceFactor.calc_turnover(df)
return df
# 全局因子实例
factor_calc = FinanceFactor()
7. 统计分析模块 statistics/analysis.py
python
运行
import pandas as pd
import numpy as np
from scipy.stats import pearsonr
from sklearn.linear_model import LinearRegression
class FinanceAnalysis:
@staticmethod
def basic_stats(df):
"""基础收益、风险统计"""
df["ret"] = df["close"].pct_change()
total_ret = (df["close"].iloc[-1] / df["close"].iloc[0]) - 1
annual_ret = (1 + total_ret) ** (250 / len(df)) - 1
volatility = df["ret"].std() * np.sqrt(250)
# 最大回撤
cum_max = df["close"].cummax()
drawdown = (df["close"] - cum_max) / cum_max
max_dd = drawdown.min()
return {
"total_return": round(total_ret, 4),
"annual_return": round(annual_ret, 4),
"volatility": round(volatility, 4),
"max_drawdown": round(max_dd, 4)
}
@staticmethod
def corr_analysis(df1, df2, col="close"):
"""两组数据相关性分析"""
s1 = df1[col].pct_change().dropna()
s2 = df2[col].pct_change().dropna()
# 对齐长度
min_len = min(len(s1), len(s2))
s1, s2 = s1[:min_len], s2[:min_len]
corr, p_value = pearsonr(s1, s2)
return {"correlation": round(corr, 4), "p_value": round(p_value, 4)}
@staticmethod
def rolling_regression(df, x_col, y_col, window=60):
"""滚动线性回归"""
df = df.copy().dropna()
coef_list = []
for i in range(window, len(df)):
slice_df = df.iloc[i-window:i]
X = slice_df[[x_col]].values
y = slice_df[y_col].values
model = LinearRegression()
model.fit(X, y)
coef_list.append(model.coef_[0])
return {"rolling_coef": coef_list}
# 分析实例
finance_analyst = FinanceAnalysis()
8. 风险异动告警 risk_warn/warning.py
python
运行
from config.settings import PRICE_CHANGE_WARN, NET_MONEY_WARN
from utils.logger import get_logger
logger = get_logger()
class RiskWarning:
@staticmethod
def check_price_warn(df):
"""价格涨跌异动告警"""
if len(df) < 2:
return False, ""
last_ret = df["close"].pct_change().iloc[-1]
if abs(last_ret) >= PRICE_CHANGE_WARN:
msg = f"价格异动告警,当日涨跌幅:{last_ret:.2%}"
logger.warning(msg)
return True, msg
return False, ""
@staticmethod
def check_money_warn(money_df):
"""资金流异动告警"""
if len(money_df) < 1:
return False, ""
last_net = money_df["net_amount"].iloc[-1]
if abs(last_net) >= NET_MONEY_WARN:
msg = f"资金异动告警,单日净额:{last_net/10000:.0f}万元"
logger.warning(msg)
return True, msg
return False, ""
warn_engine = RiskWarning()
9. 报表生成模块 report/report_generator.py
python
运行
import pandas as pd
from jinja2 import Environment, FileSystemLoader
import os
from config.settings import REPORT_DIR
from utils.logger import get_logger
logger = get_logger()
class ReportGenerator:
def __init__(self):
self.env = Environment(loader=FileSystemLoader("./report/template"))
def generate_html_report(self, data, stats, title="金融分析报告"):
"""生成HTML可视化报告"""
template = self.env.get_template("base.html")
html = template.render(title=title, data=data.to_html(), stats=stats)
save_path = os.path.join(REPORT_DIR, f"{title}.html")
with open(save_path, "w", encoding="utf-8") as f:
f.write(html)
logger.info(f"HTML报告已生成:{save_path}")
return save_path
def export_excel(self, df, file_name="data_export"):
"""导出Excel"""
save_path = os.path.join(REPORT_DIR, f"{file_name}.xlsx")
df.to_excel(save_path, index=False)
logger.info(f"Excel文件已导出:{save_path}")
return save_path
report_engine = ReportGenerator()
10. FastAPI 接口 api/route.py(对外接口 + OpenClaw 对接)
python
运行
from fastapi import FastAPI, Query
from data_source.data_loader import data_loader
from core.data_clean import data_cleaner
from factor.finance_factor import factor_calc
from statistics.analysis import finance_analyst
from risk_warn.warning import warn_engine
from report.report_generator import report_engine
app = FastAPI(title="Finance 金融数据分析平台")
@app.get("/daily_analysis")
def daily_analysis(
code: str = Query(..., description="标的代码"),
start: str = Query("2024-01-01"),
end: str = Query("2026-06-01")
):
"""单标的全流程分析:行情+清洗+因子+统计+告警"""
# 1. 加载数据
df = data_loader.get_daily_bar(code, start, end)
if df is None:
return {"status": "fail", "msg": "数据加载失败"}
# 2. 数据清洗
df = data_cleaner.standardize_column(df)
df = data_cleaner.fill_missing(df)
df = data_cleaner.filter_abnormal_price(df)
# 3. 计算因子
df = factor_calc.calc_all_factors(df)
# 4. 统计分析
stats = finance_analyst.basic_stats(df)
# 5. 风险告警检测
price_warn, price_msg = warn_engine.check_price_warn(df)
return {
"status": "success",
"code": code,
"stats": stats,
"price_warning": price_warn,
"warn_msg": price_msg,
"data_rows": len(df)
}
@app.get("/corr")
def correlation(
code1: str = Query(...),
code2: str = Query(...),
start: str = Query("2024-01-01"),
end: str = Query("2026-06-01")
):
"""两个标的相关性分析"""
df1 = data_loader.get_daily_bar(code1, start, end)
df2 = data_loader.get_daily_bar(code2, start, end)
if df1 is None or df2 is None:
return {"status": "fail", "msg": "数据缺失"}
res = finance_analyst.corr_analysis(df1, df2)
return {"status": "success", "corr_result": res}
@app.get("/export_report")
def export_report(
code: str = Query(...),
start: str = Query("2024-01-01"),
end: str = Query("2026-06-01")
):
"""生成并导出分析报告"""
df = data_loader.get_daily_bar(code, start, end)
if df is None:
return {"status": "fail", "msg": "数据加载失败"}
stats = finance_analyst.basic_stats(df)
html_path = report_engine.generate_html_report(df, stats, f"{code}_分析报告")
excel_path = report_engine.export_excel(df, f"{code}_原始数据")
return {
"status": "success",
"html_report": html_path,
"excel_data": excel_path
}
@app.get("/health")
def health():
return {"service": "Finance 金融数据分析平台", "status": "running"}
11. 项目入口 main.py
python
运行
import uvicorn
from api.route import app
from config.settings import API_HOST, API_PORT
from utils.logger import get_logger
logger = get_logger()
if __name__ == "__main__":
logger.info("Finance 金融数据分析平台 启动成功")
uvicorn.run(app, host=API_HOST, port=API_PORT)
六、特色改造落地说明
- 多源数据融合改造 统一封装行情、资金、基本面数据源,自动做时间对齐、复权、清洗,一站式解决多平台数据整合难题。
- 专业因子 & 统计增强 在基础指标之上扩展动量、波动率、滚动回归、相关性分析等量化常用能力,支持自定义因子公式编辑。
- 多级内存适配 结合
Memory Tiering区分冷热数据,实时行情、当日因子常驻内存,历史年度数据压缩下沉,提升大数据量运算效率。 - 异动风控体系 内置价格、资金双维度告警,可自定义阈值,实现从 “事后分析” 到 “实时监控” 升级。
- 全生态联动改造 预留标准接口,可直接将分析因子、标的池推送至
Backtest Expert做策略回测;异动标的同步至Stock Monitor盯盘;分析报告对接视频生成、社媒分发工具。 - 模板化报表 封装 HTML/Excel 报表模板,支持一键导出、定时生成,适配投研日常汇报场景。
七、使用示例
1. 启动服务
bash
运行
python main.py
2. 单标的综合分析
plaintext
http://127.0.0.1:8100/daily_analysis?code=600519.SH&start=2024-01-01&end=2026-06-01
3. 标的相关性分析
plaintext
http://127.0.0.1:8100/corr?code1=600519.SH&code2=000858.SZ&start=2024-01-01&end=2026-06-01
4. 导出分析报告
plaintext
http://127.0.0.1:8100/export_report?code=600519.SH&start=2024-01-01&end=2026-06-01
八、二次开发拓展方向
- 接入财报、行业指数、宏观经济数据,搭建完整基本面分析体系
- 开发前端可视化大屏,实现交互式 K 线、热力图、资金曲线展示
- 新增多因子模型、机器学习选股,强化量化选股能力
- 对接实盘账户,实现 “分析→选股→信号推送” 一体化
- 增加板块轮动、行业景气度分析模块
- 完善定时任务,实现每日自动复盘、批量标的扫描与告警推送