一、独立标题 & 差异化定位

Finance — 全市场金融数据智能分析平台 | 多源数据融合・因子挖掘・统计建模・可视化洞察・量化赋能一体化工作台

核心定位

一站式覆盖股票、期货、基金、债券、指数、宏观经济的专业金融数据分析引擎,集数据采集、清洗、因子计算、统计分析、可视化、数据建模、报表导出于一体。深度打通前文 Backtest ExpertStock MonitorBaidu Web SearchWeChat MP CN 等工具,实现行情数据→舆情数据→量化因子→策略回测→风险监控全链路闭环,兼顾投研分析、量化开发、风控复盘、行情研判等场景。

独家改造特色(区别于普通数据分析工具)

  1. 多源异构数据融合 统一接入行情、财务、资金、舆情、宏观、公告六大类数据,自动对齐时间维度、补全缺失值、标准化字段,解决金融数据来源杂乱、格式不一问题。
  2. 专业金融因子体系 内置量价、基本面、资金流向、情绪舆情、日内分时五大类因子,支持自定义因子编辑器,公式化编写、一键批量计算,适配量化策略开发。
  3. 多维统计分析模型 原生实现收益率分布、相关性分析、波动率聚类、风险敞口、胜率盈亏统计、滚动回归等专业金融统计能力,满足投研深度分析需求。
  4. 分时 + 日线 + 逐笔全周期分析 支持多时间维度联动分析,日线看趋势、分时找拐点、逐笔拆盘口,适配短线、中线、长线不同交易风格。
  5. 智能数据分层与缓存 对接 Memory Tiering,高频行情、实时因子常驻高速内存,历史财报、年度宏观数据下沉冷存储,千万级数据计算提速 50%+。
  6. 生态全链路打通 分析结果直接输出为 Backtest Expert 策略因子、Stock Monitor 监控标的、Remotion 动态数据视频、社媒调度工具自动分发研报。
  7. 风控预警与异常识别 自动识别异动行情、流动性缺口、估值偏离、资金异常流出,配置阈值后实时告警。
  8. 模板化报表与批量导出 内置研报、持仓分析、风险报告、业绩对比等模板,一键生成 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)

六、特色改造落地说明

  1. 多源数据融合改造 统一封装行情、资金、基本面数据源,自动做时间对齐、复权、清洗,一站式解决多平台数据整合难题。
  2. 专业因子 & 统计增强 在基础指标之上扩展动量、波动率、滚动回归、相关性分析等量化常用能力,支持自定义因子公式编辑。
  3. 多级内存适配 结合 Memory Tiering 区分冷热数据,实时行情、当日因子常驻内存,历史年度数据压缩下沉,提升大数据量运算效率。
  4. 异动风控体系 内置价格、资金双维度告警,可自定义阈值,实现从 “事后分析” 到 “实时监控” 升级。
  5. 全生态联动改造 预留标准接口,可直接将分析因子、标的池推送至 Backtest Expert 做策略回测;异动标的同步至 Stock Monitor 盯盘;分析报告对接视频生成、社媒分发工具。
  6. 模板化报表 封装 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

八、二次开发拓展方向

  1. 接入财报、行业指数、宏观经济数据,搭建完整基本面分析体系
  2. 开发前端可视化大屏,实现交互式 K 线、热力图、资金曲线展示
  3. 新增多因子模型、机器学习选股,强化量化选股能力
  4. 对接实盘账户,实现 “分析→选股→信号推送” 一体化
  5. 增加板块轮动、行业景气度分析模块
  6. 完善定时任务,实现每日自动复盘、批量标的扫描与告警推送