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

Financial Calculator Pro — 全场景专业金融计算器 | 货币时间价值・现金流・债券・折旧・统计・实盘联动・高精度计算引擎

核心定位

对标BA II Plus/HP 12C专业金融计算器,全功能复刻 + 数字化增强 + OpenClaw 生态打通,面向 CFA/FRM/CPA 考生、投研、风控、会计、银行从业者,提供TVM、NPV/IRR、债券定价、久期、折旧、摊销、统计、汇率、杠杆、风控指标全维度专业计算,支持批量计算、历史回溯、结果导出、策略联动、Web/CLI 双端,替代硬件计算器,深度对接Finance、Backtest Expert、Stock Monitor全链路。

独家改造特色(区别传统硬件 / 普通计算器)

  1. 专业级全功能复刻 + 增强 完全覆盖 BA II Plus Pro 全部功能:TVM 货币时间价值、NPV/IRR/MIRR、债券定价 / 久期 / 凸性、摊销、6 种折旧、现金流、统计、利率转换、盈亏平衡、日期计算;扩展波动率、夏普比率、最大回撤、杠杆倍数、融资成本、期权定价等量化指标。
  2. 无限现金流 + 高频计算 支持无限笔不规则现金流(硬件仅 32 笔)、多周期复利、连续复利、年化转换、动态滑点 / 费率拟合,适配实盘交易场景。
  3. 高精度 + 全维度风控指标 15 位高精度浮点,无精度丢失;内置夏普、卡尔玛、波动率、VaR、回撤、胜率、盈亏比、风险敞口,直接对接策略回测风控。
  4. 批量 / 情景对比 + 历史回溯 一键批量计算多利率、多期限、多现金流组合;支持情景 A/B/C 对比、历史参数回溯、结果热力图,替代 Excel 复杂公式。
  5. OpenClaw 全生态深度联动 计算结果直接输出给Backtest Expert做策略参数、Finance因子计算、Stock Monitor标的监控、Remotion生成动态计算视频、WeChat MP CN自动分发研报。
  6. Web 可视化 + CLI 双端 + 离线可用 Web 交互式大屏(双行显示、引导式输入)、CLI 命令行极速计算、离线本地引擎,数据不泄露、响应毫秒级。
  7. 自定义公式 + 插件扩展 支持自定义金融公式、函数库、批量脚本,热加载扩展,无需改源码。
  8. 全格式导出 + 审计日志 结果导出Excel/CSV/PDF/JSON;完整计算日志、参数记录、版本回溯,适配合规审计。

二、传统计算器痛点

  • ❌ 硬件局限:32 笔现金流上限、屏幕小、无法导出、无法批量、无法联动
  • ❌ 功能残缺:普通计算器无债券久期、折旧、MIRR、风控指标、量化因子
  • ❌ 精度不足:浮点精度低,复利 / 折现长期误差大
  • ❌ 生态孤立:无法对接行情、回测、分析工具,数据需手动复制
  • ❌ 效率低下:单任务、无法批量、无法情景对比、无历史记录

三、核心功能模块(全专业覆盖)

1. 货币时间价值 TVM(核心)

  • PV 现值、FV 终值、PMT 年金、N 期数、I/Y 利率
  • 年金:普通年金 / 预付年金 / 永续年金
  • 复利:年 / 季 / 月 / 日 / 连续复利、年化利率转换
  • 贷款 / 房贷 / 抵押:月供、总利息、剩余本金

2. 现金流分析(CFA/FRM 核心)

  • NPV 净现值、IRR 内部收益率、MIRR 修正内部收益率、NFV 净终值
  • 无限笔不规则现金流、频率复利、现金流编辑 / 插入 / 删除
  • 回收期、折现回收期

3. 债券定价与固定收益

  • 债券价格、到期收益率 YTM、修正久期、凸性、应计利息
  • 票面利率、交割日、到期日、天数计算(30/360、实际 / 实际)

4. 摊销与折旧

  • 贷款摊销表:每期本金 / 利息 / 剩余本金、完整摊销计划导出
  • 6 种折旧:直线法、双倍余额递减、年数总和、产量法

5. 统计与回归

  • 单 / 双变量统计:均值、标准差、方差、相关系数
  • 回归:线性 / 对数 / 指数 / 幂回归、预测值

6. 专业金融 & 风控指标

  • 波动率、夏普比率、卡尔玛比率、最大回撤、胜率、盈亏比
  • 杠杆倍数、融资利率、保证金、爆仓价、VaR 风险值
  • 市盈率、市净率、PEG、EV/EBITDA、ROE、ROA

7. 辅助工具

  • 利率转换:名义↔实际、APR↔EAR
  • 日期计算、天数差、盈亏平衡、利润率、汇率换算
  • 批量计算、情景对比、历史记录、导出

四、项目目录结构

plaintext

financial-calculator-pro/
├── config/              # 全局配置、精度、税率、默认参数
├── core/                # 计算内核:TVM、现金流、债券、折旧、统计
├── modules/             # 功能模块、批量计算、情景对比、导出
├── web/                 # Web前端、交互式计算器、双行显示
├── cli/                 # 命令行入口、极速计算脚本
├── utils/               # 精度控制、日志、历史记录、导出工具
├── api/                 # FastAPI接口、OpenClaw对接
├── test/                # 精度测试、对标BA II Plus
├── requirements.txt     # 依赖
└── main.py              # 入口

五、完整二次开发代码(可直接部署)

1. requirements.txt

txt

# 核心计算
numpy>=1.24.0
scipy>=1.10.0
pandas>=2.0.0

# Web
fastapi>=0.104.0
uvicorn>=0.24.0
streamlit>=1.28.0

# 导出
openpyxl>=3.1.0
reportlab>=4.0.0

# 工具
loguru>=0.7.2
python-dotenv>=1.0.0

2. config/settings.py

python

运行

import os
from dotenv import load_dotenv
load_dotenv()

# 精度设置(对标专业计算器)
PRECISION = 15
ROUND_DECIMALS = 6

# 默认参数
DEFAULT_RATE = 0.05
DEFAULT_PERIODS = 10
DEFAULT_COMPOUND = 12  # 月复利

# API
API_HOST = "0.0.0.0"
API_PORT = 8110

# 导出路径
EXPORT_DIR = "./export"

3. core/tvm.py(货币时间价值内核)

python

运行

import numpy_financial as nufin
from config.settings import PRECISION

class TVMCalculator:
    @staticmethod
    def pv(rate, nper, pmt, fv=0, due=0):
        """现值 PV"""
        return round(nufin.pv(rate, nper, pmt, fv, due), PRECISION)

    @staticmethod
    def fv(rate, nper, pmt, pv=0, due=0):
        """终值 FV"""
        return round(nufin.fv(rate, nper, pmt, pv, due), PRECISION)

    @staticmethod
    def pmt(rate, nper, pv, fv=0, due=0):
        """年金 PMT"""
        return round(nufin.pmt(rate, nper, pv, fv, due), PRECISION)

    @staticmethod
    def nper(rate, pmt, pv, fv=0, due=0):
        """期数 N"""
        return round(nufin.nper(rate, pmt, pv, fv, due), PRECISION)

    @staticmethod
    def rate(nper, pmt, pv, fv=0, due=0):
        """利率 I/Y"""
        return round(nufin.rate(nper, pmt, pv, fv, due), PRECISION)

    @staticmethod
    def compound_rate(nominal_rate, periods):
        """名义→实际利率 EAR"""
        return round((1 + nominal_rate/periods)**periods - 1, PRECISION)

tvm = TVMCalculator()

4. core/cashflow.py(NPV/IRR/MIRR 内核)

python

运行

import numpy_financial as nufin
import numpy as np
from config.settings import PRECISION

class CashFlowCalculator:
    @staticmethod
    def npv(rate, cashflows):
        """净现值 NPV(支持无限现金流)"""
        return round(nufin.npv(rate, cashflows), PRECISION)

    @staticmethod
    def irr(cashflows):
        """内部收益率 IRR"""
        return round(nufin.irr(cashflows), PRECISION)

    @staticmethod
    def mirr(cashflows, rate, reinvest_rate=None):
        """修正内部收益率 MIRR"""
        if reinvest_rate is None:
            reinvest_rate = rate
        return round(nufin.mirr(cashflows, rate, reinvest_rate), PRECISION)

    @staticmethod
    def payback(cashflows):
        """回收期"""
        cum = np.cumsum(cashflows)
        for i, val in enumerate(cum):
            if val >= 0:
                return round(i + 1 - cum[i-1]/cashflows[i], PRECISION) if i>0 else 0
        return None

cf = CashFlowCalculator()

5. core/bond.py(债券 / 久期 / 凸性)

python

运行

import numpy as np
from config.settings import PRECISION

class BondCalculator:
    @staticmethod
    def bond_price(face, coupon_rate, ytm, years, freq=2):
        """债券定价"""
        coupon = face * coupon_rate / freq
        periods = years * freq
        price = 0
        for t in range(1, periods+1):
            price += coupon / (1 + ytm/freq)**t
        price += face / (1 + ytm/freq)**periods
        return round(price, PRECISION)

    @staticmethod
    def modified_duration(face, coupon_rate, ytm, years, freq=2):
        """修正久期"""
        coupon = face * coupon_rate / freq
        periods = years * freq
        dur = 0
        for t in range(1, periods+1):
            pv = coupon / (1 + ytm/freq)**t
            dur += t * pv
        dur += periods * face / (1 + ytm/freq)**periods
        price = BondCalculator.bond_price(face, coupon_rate, ytm, years, freq)
        return round(dur / price / freq, PRECISION)

bond = BondCalculator()

6. core/risk_metrics.py(风控 / 量化指标)

python

运行

import numpy as np
from config.settings import PRECISION

class RiskCalculator:
    @staticmethod
    def sharpe_ratio(returns, risk_free=0.03):
        """夏普比率"""
        mean_ret = np.mean(returns)
        std_ret = np.std(returns)
        return round((mean_ret - risk_free) / std_ret * np.sqrt(252), PRECISION)

    @staticmethod
    def max_drawdown(prices):
        """最大回撤"""
        peak = np.maximum.accumulate(prices)
        drawdown = (prices - peak) / peak
        return round(np.min(drawdown), PRECISION)

    @staticmethod
    def volatility(returns, annual=252):
        """年化波动率"""
        return round(np.std(returns) * np.sqrt(annual), PRECISION)

risk = RiskCalculator()

7. api/route.py(FastAPI 接口 + OpenClaw 对接)

python

运行

from fastapi import FastAPI, Query
from core.tvm import tvm
from core.cashflow import cf
from core.bond import bond
from core.risk_metrics import risk

app = FastAPI(title="Financial Calculator Pro — 高级金融计算器")

# TVM
@app.get("/tvm/pv")
def pv(rate: float, nper: int, pmt: float, fv: float=0):
    return {"pv": tvm.pv(rate, nper, pmt, fv)}

@app.get("/tvm/fv")
def fv(rate: float, nper: int, pmt: float, pv: float=0):
    return {"fv": tvm.fv(rate, nper, pmt, pv)}

# 现金流
@app.get("/cashflow/npv")
def npv(rate: float, cashflows: str):
    cf_list = [float(x) for x in cashflows.split(",")]
    return {"npv": cf.npv(rate, cf_list)}

@app.get("/cashflow/irr")
def irr(cashflows: str):
    cf_list = [float(x) for x in cashflows.split(",")]
    return {"irr": cf.irr(cf_list)}

# 债券
@app.get("/bond/price")
def bond_price(face: float=1000, coupon: float=0.05, ytm: float=0.06, years: int=10):
    return {"price": bond.bond_price(face, coupon, ytm, years)}

# 风控
@app.get("/risk/sharpe")
def sharpe(returns: str, rf: float=0.03):
    ret_list = [float(x) for x in returns.split(",")]
    return {"sharpe": risk.sharpe_ratio(ret_list, rf)}

@app.get("/health")
def health():
    return {"service": "Financial Calculator Pro", "status": "running"}

8. cli/calculate.py(命令行极速计算)

python

运行

import argparse
from core.tvm import tvm
from core.cashflow import cf

parser = argparse.ArgumentParser(description="Financial Calculator Pro CLI")
parser.add_argument("func", choices=["pv","fv","pmt","npv","irr"])
parser.add_argument("args", nargs="*", type=float)

if __name__ == "__main__":
    args = parser.parse_args()
    if args.func == "pv":
        print(tvm.pv(*args.args))
    elif args.func == "fv":
        print(tvm.fv(*args.args))
    elif args.func == "npv":
        print(cf.npv(args.args[0], args.args[1:]))
    elif args.func == "irr":
        print(cf.irr(args.args))

9. web/app.py(Streamlit Web 交互式界面)

python

运行

import streamlit as st
from core.tvm import tvm
from core.cashflow import cf
from core.bond import bond

st.set_page_config(page_title="Financial Calculator Pro", layout="wide")
st.title("💰 Financial Calculator Pro — 高级金融计算器")

tab1, tab2, tab3, tab4 = st.tabs(["TVM货币时间价值","现金流NPV/IRR","债券定价","风控指标"])

with tab1:
    st.subheader("TVM 现值/终值/年金")
    col1,col2=st.columns(2)
    rate=col1.number_input("年利率",0.0,1.0,0.05)
    nper=col2.number_input("期数",1,100,10)
    pmt=col1.number_input("年金",0.0,1000000.0,1000.0)
    pv=col2.number_input("现值",0.0,1000000.0,0.0)
    if st.button("计算 FV"):
        st.success(f"终值 FV = {tvm.fv(rate,nper,pmt,pv):.6f}")

with tab2:
    st.subheader("现金流 NPV/IRR")
    rate=st.number_input("折现率",0.0,1.0,0.05)
    cashflows=st.text_input("现金流(逗号分隔)", "-1000,200,300,400,500")
    cf_list=[float(x) for x in cashflows.split(",")]
    if st.button("计算 NPV/IRR"):
        st.success(f"NPV = {cf.npv(rate,cf_list):.6f} | IRR = {cf.irr(cf_list):.6f}")

with tab3:
    st.subheader("债券定价")
    face=st.number_input("面值",100,10000,1000)
    coupon=st.number_input("票面利率",0.0,1.0,0.05)
    ytm=st.number_input("到期收益率",0.0,1.0,0.06)
    years=st.number_input("期限",1,30,10)
    if st.button("计算债券价格"):
        st.success(f"债券价格 = {bond.bond_price(face,coupon,ytm,years):.6f}")

10. 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("Financial Calculator Pro 启动成功")
    uvicorn.run(app, host=API_HOST, port=API_PORT)

六、特色改造落地说明

  1. 专业硬件全复刻 + 量化增强 1:1 复刻 BA II Plus Pro 全部金融函数,新增夏普、波动率、回撤、杠杆、融资成本等量化指标,15 位高精度,对标专业硬件。
  2. 无限现金流 + 批量情景计算 突破硬件 32 笔现金流限制,支持无限笔不规则现金流;批量多利率 / 多期限 / 多情景对比,一键生成结果表。
  3. OpenClaw 全链路打通 计算结果直接输出给Backtest Expert策略参数、Finance因子、Stock Monitor监控、Remotion视频、WeChat MP CN研报分发。
  4. Web+CLI 双端 + 离线引擎 Web 交互式大屏(双行显示、引导输入)、CLI 极速计算、本地离线引擎,毫秒响应、数据安全。
  5. 自定义公式 + 插件扩展 支持自定义金融公式、函数库、脚本批量计算,热加载扩展,无需改源码。
  6. 审计日志 + 全格式导出 完整计算日志、参数回溯、版本记录;导出Excel/CSV/PDF/JSON,适配合规审计。

七、使用示例

1. 启动服务

bash

运行

python main.py
# Web: http://127.0.0.1:8501
# API: http://127.0.0.1:8110

2. CLI 命令行

bash

运行

# 计算FV
python cli/calculate.py fv 0.05 10 1000
# 计算NPV
python cli/calculate.py npv 0.05 -1000 200 300 400 500

3. API 调用

plaintext

http://127.0.0.1:8110/tvm/fv?rate=0.05&nper=10&pmt=1000

八、二次开发拓展方向

  1. 完整折旧 / 摊销表生成 + 导出
  2. 期权定价(BS 模型)、希腊值、期货定价
  3. CFA/FRM 考试模式、题库集成、公式记忆
  4. 多语言、暗色模式、皮肤自定义
  5. 本地历史记录云端同步、团队共享计算模板
  6. 对接实盘交易 API,一键计算交易参数、保证金、爆仓价