会计决策分析方法
帮助会计人员解决企业资金运动过程中的问题、把握机会,制定和选择活动方案,核心围绕成本分析、本量利分析、预测分析、财会机器人四大模块展开,全程使用Python实现实操分析。
三、边际值分析
3.1 边际成本计算
前言
边际值:自变量发生1个微小单位变化时,因变量的变化值,核心计算边际成本、边际收益、边际利润、需求价格弹性。
核心知识点
边际成本:每多生产1 件产品所新增的总成本,用来判断增产是否划算,边际成本<售价 就值得扩产,反之则会越产越亏。
实操案例1:计算产量1000件时的总成本、平均成本
成本函数:(为产量)
实现代码
# 定义成本函数
def cost(c):
return 1000 + c**2/1500
quantity=1000
# 计算总成本和平均成本
print("总成本为:%f"%cost(quantity))
print("平均成本为:%f"%(cost(quantity)/ quantity))运行结果
总成本为:1666.666667
平均成本为:1.666667代码运行后解说
运行代码后输出总成本1666.67元、平均成本1.67元/件,结果解读:
- 总成本包含固定成本1000元(x=0时的成本)和变动成本666.67元(1000²/1500);
- 平均成本是总成本除以产量,反映每件产品的平均成本,可用于定价参考(定价需高于平均成本才能盈利);
- 若修改产量为1500件,总成本=1000+1500²/1500=2500元,平均成本=2500/1500≈1.67元/件,说明产量增加后平均成本未变(此成本函数的平均成本在x=1224时达到最低)。👈

可以修改上面的代码,用可视化的方式展示产量和成本的关系
实操案例2:计算总成本平均变化率
背景: 计算产量从1000件到1200件时,总成本的平均变化率
实现代码
def cost(c):
return 1000 + c**2/1500
quantity1=1200
quantity2 = 1000
# 平均变化率 = 成本变化量 / 产量变化量
print("总成本平均变化率为:%f"%((cost(quantity1)-cost(quantity2))/(quantity1-quantity2)))运行结果
总成本平均变化率为:1.466667代码运行后解说
运行代码后输出平均变化率1.47元/件,结果解读:
- 平均变化率反映产量从1000到1200件时,每增加1件产品,总成本平均增加1.47元 ;
- 平均变化率是“区间内的平均边际成本”,与边际成本(某一点的瞬时变化率)不同,适用于产量变动较大时的成本分析;
- 若产量变动区间缩小(如1000到1001件),平均变化率会趋近于边际成本(4/3≈1.33元/件)。
实操案例3:用sympy计算边际成本(对总成本函数求一阶导数)
- 总成本: ,产量为 时的总成本
- 边际成本 MC:产量增加一单位时,总成本的变化率
也就是总成本对产量的一阶导数。
实现代码
from sympy import *
# 定义符号变量(x为产量,正数)
x=symbols('x',positive=True)
# 定义成本函数
cost=1000+x**2/1500
# 对x求导(边际成本函数)
cost_d=diff(cost,x)
# 计算x=1000时的边际成本
print(cost_d.subs(x,1000))运行结果
4/3代码说明
from sympy import *:导入符号计算库symbols('x',positive=True):定义符号变量x,指定为正数diff(cost,x):对成本函数cost关于x求一阶导数subs(x,1000):将x=1000代入导数函数,得到具体边际成本值
代码运行后解说
运行代码后输出边际成本4/3≈1.33元/件,结果解读:
- 边际成本是成本函数的导数(cost’=2x/1500),x=1000时,cost’=2000/1500=4/3,反映产量1000件时,每多生产1件产品,总成本增加1.33元;
- 平均成本 AC:每一件产品平均花了多少钱 ; 边际成本 MC:再多生产这一件要花多少钱
- 边际成本1.33元 < 平均成本1.67元,说明此时增加产量会降低平均成本(边际成本 < 平均成本 ⇒ 平均成本正在下降 );
- 若x=1500,边际成本=2×1500/1500=2元 > 平均成本1.67元,此时增加产量会提高平均成本,因此存在一个平均成本最低的产量(最优生产规模)。

3.2 边际收益计算
前言
核心知识点
收益 = 销售量 × 价格,边际收益是总收益函数对销售量的导数,反映每增加1单位销售量,总收益的增加量,通俗说:每多卖 1 件产品,企业能多赚的钱。

实操案例1:计算销售量100件时的总收益、边际收益
价格函数:(为销售量),
说明:SciPy 版本 ≥1.14.0 的最新版本,该版本已彻底移除 derivative 函数(无论 scipy.misc 还是 scipy.optimize 都没有),因此唯一可行的方案是使用手动实现的导数函数
实现代码
# 手动实现一阶导数计算函数(适配 SciPy 1.16.3,无任何依赖)
def derivative(func, x0, dx=1e-6):
"""
中心差分法计算一阶数值导数,完全替代 SciPy 的 derivative 函数
:param func: 要求导的函数(如总收益函数)
:param x0: 求导的点(如销售量100)
:param dx: 微小步长(默认1e-6,保证精度)
:return: 函数在x0处的一阶导数
"""
return (func(x0 + dx) - func(x0 - dx)) / (2 * dx)
# 定义价格函数
def price(q):
return 200 + q/4
# 定义总收益函数
def totalRevenue(q):
return price(q)*q
quantity = 100
# 计算总收益和边际收益
total_rev = totalRevenue(quantity)
marginal_rev = derivative(totalRevenue, quantity)
# 输出结果
print("总收益为%f" % total_rev)
print("边际收益为%f" % marginal_rev)运行结果
总收益为22500.000000
边际收益为249.999999代码运行后解说
运行代码后输出总收益22500元、边际收益250元/件,结果解读:
- 总收益=价格×销售量,q=100时,价格=200+100/4=225元,总收益=225×100=22500元;
- 边际收益是总收益函数的导数(totalRevenue’=200 + q/2),q=100时,边际收益=200+50=250元,反映销售量100件时,每多卖1件产品,总收益增加250元;
- 此价格函数中价格随销售量增加而上升(特殊市场场景,如稀缺商品 ),因此边际收益高于当前价格。
实操案例2:计算总收益平均变化率
计算销售量从100件到200件时,总收益的平均变化率
实现代码
def price(q):
return 200+q/4
def totalRevenue(q):
return price(q)*q
quantity1 =200
quantity2 = 100
# 平均变化率 = 收益变化量 / 销售量变化量
print("总收益平均变化率为%f"%((totalRevenue(quantity1)-totalRevenue(quantity2))/(quantity1-quantity2)))运行结果
总收益平均变化率为275.0代码运行后解说
运行代码后输出平均变化率275元/件,结果解读:
- 平均变化率反映销售量从100到200件时,每增加1件产品,总收益平均增加275元;
- 对比边际收益(q=100时250元,q=200时300元),平均变化率是区间内的平均值((250+300)/2=275),符合线性收益函数的特征;
- 若价格函数为递减(如price(q)=200-q/4),边际收益会随销售量增加而降低,需结合边际成本判断最优销售量(边际收益=边际成本时利润最大)。
3.3 边际利润计算
前言
核心知识点
边际利润是利润函数对销售量的导数,反映每增加1单位销售量,利润的变化量,用散点图可直观展示边际利润随销售量的变化趋势。
实操案例:散点图展示销售量10-50的边际利润
利润函数:(为销售量)
实现代码
import matplotlib.pyplot as plt
import math
# 中文正常显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 数值求导(中心差分)
def derivative(func, x0, dx=1e-6):
return (func(x0 + dx) - func(x0 - dx)) / (2 * dx)
# 利润函数
def profit(q):
return (25000 * q - 5 * q**3) / math.sqrt(q)
# 准备数据
qs = list(range(10, 51))
profits = [profit(q) for q in qs]
margins = [derivative(profit, q) for q in qs]
# 创建上下两个子图
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(8, 8))
# 上图:利润
ax1.plot(qs, profits, 'b-', linewidth=2, label='利润')
ax1.set_title('利润曲线')
ax1.set_xlabel('销售量 q')
ax1.set_ylabel('利润')
ax1.grid(True)
ax1.legend()
# 下图:边际利润
ax2.plot(qs, margins, 'r-', linewidth=2, label='边际利润')
ax2.set_title('边际利润曲线')
ax2.set_xlabel('销售量 q')
ax2.set_ylabel('边际利润')
ax2.grid(True)
ax2.legend()
# 自动调整布局
plt.tight_layout()
plt.show()代码运行后解说
运行代码后弹出散点图窗口,横轴为销售量(10-50),纵轴为边际利润,结果解读:
- 散点图中边际利润随销售量增加先上升后下降,存在一个最大值点(x=32,利润最大化的销售量),;
- 边际利润为正时,利润增加;边际利润为负时,利润减少;边际利润为0时,利润达到最大值;
- 说明:SciPy 版本 ≥1.14.0 的最新版本,该版本已彻底移除 derivative 函数(无论 scipy.misc 还是 scipy.optimize 都没有),因此唯一可行的方案是使用手动实现的导数函数

3.4 需求价格弹性计算
前言
核心知识点
需求价格弹性:需求量对价格变动的反应程度,弹性函数为 (y为需求量,x为价格,y=f(x) ),需求量与价格呈减函数关系,弹性值为负。
= 需求函数对价格求导= 价格变动一点点,需求会变多少
价格涨一点,销量就明显减少,说明需求对价格反应敏感、弹性大;
价格怎么涨,销量都差不多,就是弹性小。
实操案例:计算价格50/100/150时的需求价格弹性
需求函数:(x为价格,e为自然常数)
实现代码
import matplotlib.pyplot as plt
import math
# 数值求导(中心差分)
def derivative(func, x0, dx=1e-6):
return (func(x0 + dx) - func(x0 - dx)) / (2 * dx)
# 定义需求函数
def demand(p):
return math.e **(-p/100)
# 计算不同价格下的需求价格弹性
price1=50
price2=100
price3 =150
print(derivative(demand,price1)*price1/demand(price1)) #需求的价格点弹性
print((derivative(demand,price2)*price2/demand(price2)))
print((derivative(demand,price3)*price3/demand(price3)))运行结果
-0.4999999948618223
-0.9999999989878123
-1.4999999908951311代码运行后解说
运行代码后输出三个价格对应的弹性值:-0.5、-1.0、-1.5,结果解读:
- 弹性值为负,符合“价格上涨,需求量下降”的需求定律,实际分析中通常关注绝对值;
- 价格50时弹性绝对值0.5(缺乏弹性),说明价格变动1%,需求量变动0.5%,此时提价会增加总收益;
- 价格100时弹性绝对值1.0(单位弹性),价格变动1%,需求量变动1%,总收益不变;
- 价格150时弹性绝对值1.5(富有弹性),价格变动1%,需求量变动1.5%,此时降价会增加总收益; 👈
四、预测分析
4.1 销售预测
前言
基于历史数据,预测企业未来的销售、成本、利润、资金,
常用方法:移动加权平均法、指数平滑法、回归分析法、高低点法、销售百分比法等。
方法1:移动加权平均法1️⃣
核心知识点
对过去若干期销售额按时间远近加权(近期权数大,远期权数小),计算加权平均数,结合销售变动趋势值,预测未来销售额,是时间序列预测里最简单、最常用的一种。

核心步骤
- 按时间单位(如3个月=1季度)计算各季度月平均销售额
- 计算平均每月销售变动趋势值 =(最后季度月均 - 初始季度月均)/ 时间单位
- 对最后一季度销售额按权数加权求和
- 预测销售额 = 加权和 + 平均每月销售变动趋势值
实操案例1:对企业销售额进行移动加权平均法预测
数据基础:7-12月销售额[520,480,500,560,600,620](万元),权数[0.2,0.3,0.5]
实现代码
sales =[520,480,500,560,600,620]
# 初始季度(7-9月)月平均销售额
avg1=0
for i in range(3):
avg1 +=sales[i]
avg1= avg1/3
# 最后季度(10-12月)月平均销售额
avg2=0
for i in range(3):
avg2+=sales[-i-1]
avg2=avg2/3
# 平均每月销售变动趋势值
increment=(avg2 -avg1)/3
# 预测未来一个月销售额
print(sales[-3]*0.2+sales[-2]*0.3+sales[-1]*0.5+increment)运行结果
633.1111111111111代码运行后解说
结果解读:
- 初始季度(7-9月)月均销售额=(520+480+500)/3=500万元,最后季度(10-12月)月均=(560+600+620)/3=593.33万元;
- 平均每月变动趋势值=(593.33-500)/3≈31.11万元,反映销售额每月平均增长31.11万元;
- 最后一季度加权和=560×0.2+600×0.3+620×0.5=602万元,加趋势值后得到预测值633.11万元;
- 加权平均法通过“近期权数大”突出最新数据的影响,预测结果更贴合近期趋势。
实操案例2:对企业销售额进行移动加权平均法预测(适配任意时间单位/权数)
实现代码
sales=[520, 480,500,560,600,620]#各个月的销售量
weights=[0.2,0.3,0.5]#移动权值
size=len(weights)#时间单位(权数长度)
# 计算各季度月平均销售额
avg=[0]*(len(sales)// size)
for i in range(len(avg)):
sum=0
for j in range(size):
sum +=sales[i*size+j]
avg[i]= sum/size
# 平均每月销售变动趋势值
increment =(avg[-1]- avg[0])/size
# 加权求和并预测
result=0
for i in range(size):
result +=sales[i-size] *weights[i]
print(result + increment)运行结果
633.1111111111111代码运行后解说
运行代码后输出与基础版一致的预测值633.11万元,结果解读:
- 通用版代码通过变量
size适配任意权数长度(如权数长度4则按4个月为一个周期),无需修改核心逻辑; - 若将权数改为[0.1,0.2,0.7](更侧重最新数据),预测值=560×0.1+600×0.2+620×0.7+31.11=635.11万元,更接近最新月份的销售额;
- 权数之和需为1(0.2+0.3+0.5=1),否则需归一化处理(如权数[2,3,5]需转换为[0.2,0.3,0.5])。
实操案例3:函数封装版(支持用户交互式输入)
实现代码
# 移动加权平均预测函数
def predict(sales, weights):
size = len(weights)
avg=[0]*(len(sales)// size)
for i in range(len(avg)):
sum=0
for j in range(size):
sum +=sales[i*size+j]
avg[i]= sum/size
increment=(avg[-1] -avg[0])/size
result=0
for i in range(size):
result +=sales[i-size]* weights[i]
return result +increment
# 输入序列函数(输入0结束)
def inputSeries(title):
arrays =[]
while True:
num = float(input(title))
if num==0:
break
arrays.append(num)
return arrays
# 主程序(交互式运行)
while True:
strs=input('开始计算,确认吗(Y/N)?')
if strs.upper()=="Y":
arrays1=inputSeries("请输入各月销售额:")
arrays2=inputSeries("请输入各个权值系数:")
print(predict(arrays1, arrays2))
else:
break运行示例
开始计算,确认吗(Y/N)?y
请输入各月销售额:520
请输入各月销售额:480
请输入各月销售额:500
请输入各月销售额:560
请输入各月销售额:600
请输入各月销售额:620
请输入各月销售额:0
请输入各个权值系数:0.2
请输入各个权值系数:0.3
请输入各个权值系数:0.5
请输入各个权值系数:0
633.1111111111111
开始计算,确认吗(Y/N)?n代码运行后解说
运行代码后进入交互式界面,用户输入销售额和权数后输出预测值,使用说明:
- 输入销售额时,按月份顺序输入,输入0结束;权数需按“远期到近期”顺序输入,输入0结束;
- 若输入的销售额数量不是权数长度的整数倍(如销售额输入7个,权数3个),代码会取前6个销售额计算(len(sales)//size=7//3=2个周期);
- 输入权数时需确保长度与时间单位一致,且之和为1,否则预测结果会偏离实际;
- 输入
N可退出程序,适合非编程人员快速使用。
方法2:指数平滑法 2️⃣
核心知识点
指数式递减加权的移动平均,越近期数据权重越高,分为:一次指数平滑(无趋势)、二次指数平滑(线性趋势,霍尔特平滑法)、三次指数平滑(非线性/季节性趋势),使用statsmodels库实现。
- 一次(简单)指数平滑
只适合:平稳、没趋势、没季节 → 预测一条水平线 - 二次(Holt)指数平滑
适合:有上升/下降趋势,但没有季节 → 预测一条斜线 - 三次(Holt-Winters)指数平滑
它把时间序列拆成 3 部分:
1. 水平项:数据整体在什么位置
2. 趋势项:整体是涨还是跌、涨多快
3. 季节项:周期性起伏(比如夏天高、冬天低)
适合:有趋势 + 有季节波动 → 预测波浪形曲线
实操案例1:一次指数平滑预测
实现代码
# 导入:简单指数平滑法(用来预测无趋势、无季节的平稳数据)
from statsmodels.tsa.holtwinters import SimpleExpSmoothing
# 历史销量数据(12个月/12期)
sales = [520, 480, 500, 560, 570, 580, 590, 595, 600, 560, 600, 620]
# 1. 构建简单指数平滑模型
# 适合:数据没有明显上升/下降大趋势、没有季节波动的销量预测
model = SimpleExpSmoothing(sales)
# 2. 拟合模型(让模型学习历史数据的规律,自动计算最优平滑系数α)
r1 = model.fit()
# 3. 预测未来4个时期的销量
# start=len(sales) → 从“历史数据最后一条的下一条”开始预测
# end=len(sales)+3 → 连续预测4个值(+0、+1、+2、+3)
pred1 = r1.predict(start=len(sales), end=len(sales) + 3)
# 输出预测结果
print("未来4期销量预测:")
print(pred1)运行结果
[619.9999997 619.9999997 619.9999997 619.9999997]代码运行后解说
运行代码后输出未来4个月的预测销售额均为620万元左右,结果解读:
- 一次指数平滑适用于无明显趋势、无季节性的时间序列,预测值围绕最新值波动;
- 模型默认使用最优平滑系数(α),无需手动设置,拟合效果优于简单移动平均;
- 预测值全部相同,说明一次指数平滑认为未来销售额无增长趋势,仅维持当前水平;
- 若运行时提示“ModuleNotFoundError: No module named 'statsmodels'”,需执行
pip install statsmodels安装时间序列库。

实操案例2:三次指数平滑预测(考虑趋势/季节性)
什么时候必须用三次指数平滑?
- 超市月度销量:旺季高、淡季低 + 整体逐年上涨
- 气温、用电、旅游数据
- 只要你看到波浪形 + 整体往上/往下,就用三次
实现代码
from statsmodels.tsa.holtwinters import ExponentialSmoothing
sales=[520,480,500,560,570,580,590,595,600,560,600,620]
# 构建模型(加法趋势+加法季节性,季节周期4)
model=ExponentialSmoothing(sales,trend="add",seasonal='add', seasonal_periods=4)
r1=model.fit()
# 预测未来6个值
pred1=r1.predict(start=len(sales),end=len(sales)+5)
print(pred1)运行结果
[629.40714887 606.07272147 629.40514569 657.73836198 666.44558167 643.11115427]代码运行后解说
运行代码后输出未来6个月的预测销售额(629.41、606.07、629.41、657.74、666.45、643.11万元),结果解读:
- 三次指数平滑(霍尔特-温特斯法)考虑了趋势和季节性,预测值随季节周期波动且整体呈上升趋势;
seasonal_periods=4表示季节周期为4个月,模型会识别历史数据中的4个月周期规律;trend="add"表示加法趋势(趋势值固定),若数据趋势递增,曲线越来越陡峭,可改为trend="mul"(乘法趋势);- 对比一次指数平滑,三次指数平滑的预测值更贴合实际销售的季节波动,适合有季节性的行业(如零售、制造业)。

方法3:回归分析法 3️⃣
核心知识点
假设销售量与时间呈线性函数关系,用线性回归拟合历史数据,预测未来销售额,使用sklearn库的线性回归模型实现。
实操案例:线性回归预测销售额
实现代码
from sklearn import linear_model
import numpy as np
sales =[520,480,500,560,570,580,590,595,600,560,600,620]
# 构建线性回归模型
model =linear_model.LinearRegression()
# 构造自变量x(时间序列),转换为二维数组
x=np.arange(len(sales))
x=x.reshape(-1, 1) # 等价于x.resize((len(sales),1))
# 拟合模型
model.fit(x, sales)
# 构造未来6个时间点的自变量
newX=np.arange(len(sales),len(sales)+6)
newX=newX.reshape(-1, 1)
# 预测未来销售额
predict_outcome = model.predict(newX)
print(predict_outcome)
# 输出回归方程 y=kx+b
print("y={}x+{}".format(model.coef_[0],model.intercept_))运行结果
[630.15151515 640.23892774 650.32634033 660.41375291 670.5011655 680.58857809]
y=10.087412587412583x+509.10256410256414代码运行后解说
运行代码后输出未来6个月的预测销售额(630.15、640.24、650.33、660.41、670.50、680.59万元)和回归方程,结果解读:
- 回归方程
y=10.09x+509.10表示:时间每增加1个月(x+1),销售额平均增长10.09万元; - 预测值呈线性上升趋势,适合销售额稳定增长的企业,若数据有波动(如10月销售额560万元),模型会自动拟合整体趋势;
- 可通过
model.score(x, sales)计算拟合优度R²,R²越接近1,拟合效果越好; - 若运行时提示“ModuleNotFoundError: No module named 'sklearn'”,需执行
pip install scikit-learn安装机器学习库。

4.2 成本预测
前言
核心方法:高低点法
核心知识点
选择产量最高和产量最低的两组数据,拟合成本与产量的线性关系 ,预测未来产量对应的总成本。
核心步骤
- 计算总成本 = 固定成本总额 + 产量 × 单位变动成本
- 确定高低点:高点(max_x, max_y)、低点(min_x, min_y)
- 计算斜率a =(max_y - min_y)/(max_x - min_x)
- 计算截距b = min_y - a×min_x
- 预测总成本 = a×预测产量 + b,单位成本 = 预测总成本 / 预测产量
实操案例:高低点法预测产量60件时的成本
数据基础:8-12月产量、固定成本总额、单位变动成本数据

实现代码
import pandas as pd
# 读取数据
data=pd.read_csv("./data/产品产量与成本.csv",encoding='GBK')
# 计算总成本
data["总成本"]=data["固定成本总额(元)"]+data["产量(件)"]*data["单位变动成本(元)"]
# 按产量降序排序,确定高低点
data.sort_values(by='产量(件)',ascending=False,inplace=True)
max_x=data.head(1)['产量(件)'].values[0]
min_x=data.tail(1)["产量(件)"].values[0]
max_y=data.head(1)["总成本"].values[0]
min_y=data.tail(1)["总成本"].values[0]
# 拟合线性方程
a=(max_y-min_y)/(max_x-min_x)
b=min_y-a*min_x
# 预测产量60件时的成本
volume =60
totalCost= a* volume +b
print("总成本为:{},单位成本为:{}".format(totalCost, totalCost/ volume))运行结果
总成本为:25268.571428571428,单位成本为:421.1428571428571代码运行后解说
运行代码后输出预测总成本25268.57元、单位成本421.14元/件,结果解读:
- 高低点法通过产量最高和最低的两组数据拟合成本线,计算简单、适合快速预测;
- 斜率a是单位变动成本(每增加1件产量,总成本增加a元),截距b是固定成本(产量为0时的成本);
- 若实际成本与拟合成本偏差较大(如高点/低点为异常值),需改用回归法或移动平均法;
- 预测的单位成本421.14元可用于报价、成本控制等决策,若实际单位成本高于此值,需分析成本超支原因。

4.3 利润预测
前言
核心方法:本量利法
利润 = 卖东西赚的 “纯增量钱” − 不管卖不卖都要花的固定钱
边际贡献率= 每卖 1 块钱收入里,能留下来覆盖固定成本、最后变成利润的比例。
公式:
比如:卖 100 元,变动成本 60 元→ 边际贡献率 = 40% → 每卖 1 块钱收入,留下 0.4 元用来覆盖房租、设备等固定成本。
总边际贡献= 所有产品一共留下了多少钱,就是把每个产品的“留下来的钱”加总。
公式:
预测利润公式:
逻辑顺序是这样的: 👈
- 先卖货,产生销售收入
- 扣掉变动成本(材料、包装等),剩下的就是边际贡献
- 用这些边际贡献先去覆盖固定成本
- 覆盖完剩下的,就是利润
实操案例:预测多产品(A/B)的利润
数据基础:A/B产品的预测销售量、销售收入、销售比重、边际贡献率;固定成本85万元
实现代码
import pandas as pd
# 读取数据
data=pd.read_csv('./data/产品销售资料.csv',encoding="GBK")
fixedCost = 850000
# 计算各产品边际贡献
data["边际贡献"]=data['预测销售收入(元)']*data["边际贡献率"]
# 预测利润 = 边际贡献总和 - 固定成本
print("预测利润为:{}".format(data["边际贡献"].sum()-fixedCost))运行结果
预测利润为:434871.5代码运行后解说
运行代码后输出预测利润434871.5元(43.49万元),结果解读:
- 总边际贡献=A产品边际贡献+B产品边际贡献,是覆盖固定成本后的盈利潜力;
- 预测利润=总边际贡献-固定成本85万元,若结果为负,说明企业需提高销售收入或降低固定成本才能盈利;
- 可通过调整产品销售比重(增加高边际贡献率产品的销售)提高预测利润,例如A产品边际贡献率40%,B产品30%,可优先推广A产品;
- 若实际利润低于预测值,需分析“销售收入未达标”或“边际贡献率低于预期”等原因。
4.4 资金预测
前言
核心方法:销售百分比法
核心知识点
根据销售额的变动,预测企业需要追加的资金金额,考虑随销售额变动的资产/负债、折旧、留存收益、零星资金需求。
核心步骤
- 计算销售额变动额 = 计划期销售额 - 基期销售额
- 计算敏感资产/负债占销售额的百分比(敏感资产:货币资金、应收账款、存货、固定资产;敏感负债:应付账款、应交税费)
- 计算资产变动额 = 销售额变动额 × 敏感资产占比
- 计算负债变动额 = 销售额变动额 × 敏感负债占比
- 计算留存收益增加额 = 计划期销售额 × 销售净利率 ×(1-股利发放率)
- 计算可动用折旧 = 折旧总额 ×(1-设备改造比例)
- 追加资金额 = 资产变动额 - 负债变动额 - 留存收益增加额 - 可动用折旧 + 零星资金需求
- 追加资金额:企业为了扩大产销,需从外部额外筹措的资金总额。
- 资产变动额:因销售增长而需追加占用的流动资产与长期资产资金。
- 负债变动额:销售增长中自动产生的应付账款等无息负债,可抵减资金需求。
- 留存收益增加额:企业通过经营内部积累形成的留存利润,可用于补充资金。
- 可动用折旧:前期计提的非现金支出,折旧摊销后可作为当期的内部资金来源。
- 零星资金需求:除上述预算外,为应对突发情况或零星开支而预留的应急资金。
实操案例:预测企业追加资金金额
已知条件
- 基期销售额1.2亿元,计划期1.5亿元;基期净利润480万元,股利发放率50%
- 折旧60万元,50%用于设备改造;零星资金需求30万元
- 敏感资产:7960万元(无无形资产);敏感负债:900万元(应付账款600+应交税费300)

核心计算
- 销售额变动额 = 15000 - 12000 = 3000万元
- 销售净利率 = 480/12000 = 4%
- 敏感资产占比 = 7960/12000 ≈ 0.6633;
- 敏感负债占比 = 900/12000 = 0.075
- 资产变动额 = 3000×0.6633 = 1989.9万元;
- 负债变动额 = 3000×0.075 = 225万元
- 留存收益增加额 = 15000×4%×(1-50%) = 300万元
- 可动用折旧 = 60×(1-50%) = 30万元
- 追加资金额 = 1989.9 - 225 - 300 - 30 + 30 = 1464.9万元
代码
# 销售百分比法资金预测
# 基期数据
base_sales = 12000 # 基期销售额(万元)
plan_sales = 15000 # 计划期销售额(万元)
base_profit = 480 # 基期净利润(万元)
dividend_rate = 0.5 # 股利发放率
depreciation = 60 # 折旧总额(万元)
depreciation_ratio = 0.5 # 设备改造比例
misc_fund = 30 # 零星资金需求(万元)
sensitive_asset = 7960 # 敏感资产(万元)
sensitive_debt = 900 # 敏感负债(万元)
# 计算核心指标
sales_change = plan_sales - base_sales # 销售额变动额
profit_rate = base_profit / base_sales # 销售净利率
asset_ratio = sensitive_asset / base_sales # 敏感资产占比
debt_ratio = sensitive_debt / base_sales # 敏感负债占比
# 计算各项变动额
asset_change = sales_change * asset_ratio # 资产变动额
debt_change = sales_change * debt_ratio # 负债变动额
retained_earnings = plan_sales * profit_rate * (1 - dividend_rate) # 留存收益增加额
available_depreciation = depreciation * (1 - depreciation_ratio) # 可动用折旧
# 计算追加资金额
additional_fund = asset_change - debt_change - retained_earnings - available_depreciation + misc_fund
print(f"需追加资金金额:{additional_fund:.1f}万元")运行结果
需追加资金金额:1464.9万元代码运行后解说
- 追加资金额为正,说明企业销售额增长需要额外投入1464.9万元资金,可通过银行借款、发行股票等方式筹集;
- 资产变动额1989.9万元是销售额增长所需的资产投入,负债变动额225万元是自动增加的应付账款等(无需主动筹资);
- 留存收益增加额300万元和可动用折旧30万元是企业内部可动用的资金,减少了外部筹资需求;
- 零星资金需求30万元是额外的资金需求(如临时采购、费用支出),需纳入筹资计划;
- 若计划期销售额改为1.4亿元,追加资金额= (14000-12000)×0.6633 - 2000×0.075 - 14000×4%×0.5 - 30 +30 = 1326.6-150-280-30+30=996.6万元,销售额增长放缓,筹资需求减少。
五、财会机器人 🚀 自行学习
5.1 基于键盘鼠标模拟的实现方法
前言
利用Python程序自动化处理财务工作,替代人工操作,核心两种实现方法:键盘鼠标模拟、直接读写财务文件。
核心知识点
使用pyautogui库模拟人工的点击、复制、粘贴、按键操作,pyperclip库实现剪贴板交互,自动填写财务表单(如记账凭证),核心需求:将阿拉伯数字金额转换为中文大写金额。
实操案例:自动填写记账凭证(金额大写转换+鼠标模拟)
实现代码
import pyautogui
import pyperclip
import time
# 定义函数:阿拉伯数字转中文大写金额
def daxie(number):
numchar=["零","壹","贰","叁","肆","伍","陆","柒","捌","玖"]
pr=["圆整","拾","佰","仟","萬","拾","佰","仟","亿"]
length=len(str(number))
result=""
for i in str(number):
length -=1
result +=("%s%s"%(numchar[int(i)],pr[length]))
# 清洗多余的零
result =result.replace("零萬","萬")
result =result.replace("零仟","")
result =result.replace("零佰","")
result =result.replace("零拾","")
result=result.replace("零圆","圆")
return result
# 测试大写转换
print(daxie(10000)) # 输出:壹萬圆整
# 鼠标模拟操作(填写3张记账凭证)
time.sleep(5) # 预留5秒打开Excel文件
pyautogui.PAUSE=0.5 # 每次操作间隔0.5秒
pyautogui.FAILSAFE = True # 鼠标移到屏幕角落触发终止,防止程序失控
for i in range(3):
pyautogui.click(800,780) # 点击阿拉伯数字金额单元格
pyautogui.hotkey('ctrl','c') # 复制金额
# 转换为大写并粘贴
pyperclip.copy(daxie(int(float(pyperclip.paste().replace(",","")))))
pyautogui.doubleClick(490,780) # 双击大写金额单元格
pyautogui.hotkey('ctrl','v') # 粘贴大写金额
pyautogui.hotkey('ctrl',"pagedown") # 切换到下一张凭证
pyautogui.hotkey('ctrl','home') # 回到凭证顶部代码说明
daxie(number):核心函数,实现阿拉伯数字到中文大写金额的转换,通过replace清洗多余的“零”pyautogui.click(x,y):点击坐标为(x,y)的位置(需根据自己的Excel界面调整坐标)pyautogui.hotkey:模拟快捷键操作(ctrl+c复制,ctrl+v粘贴,pagedown下翻)pyperclip:实现Python程序与系统剪贴板的交互,传递金额数据time.sleep(5):预留时间打开记账凭证Excel文件,确保程序操作有效
代码运行后解说
运行代码后执行以下操作:
- 首先测试大写转换函数,输出“壹萬圆整”,验证转换功能正常;
- 预留5秒时间,需在此期间打开记账凭证Excel文件并切换到该窗口;
- 自动点击阿拉伯数字金额单元格(坐标800,780),复制金额后转换为大写;
- 双击大写金额单元格(坐标490,780),粘贴大写金额;
- 切换到下一张凭证,重复操作3次,完成3张凭证的大写金额填写;
使用注意:
- 坐标需根据自己的屏幕分辨率和Excel窗口位置调整(可通过
pyautogui.position()获取鼠标当前坐标); - 若Excel单元格有千分位分隔符(如10,000),代码中
replace(",","")会自动去除,避免转换错误; - 运行时若操作错误,将鼠标移到屏幕左上角(坐标0,0)可触发
FAILSAFE终止程序。
5.2 基于文件读写的实现方法
前言
核心知识点
使用openpyxl库直接读写Excel文件,无需模拟鼠标操作,效率更高、更稳定,直接修改Excel单元格的数值,实现记账凭证的自动填写。
实操案例:直接读写Excel,自动填写大写金额
实现代码
import openpyxl
# 阿拉伯数字转中文大写金额函数
def daxie(number):
numchar=["零","壹","贰","叁","肆","伍","陆","柒","捌","玖"]
pr=["圆整","拾","佰","仟","萬","拾","佰","仟","亿"]
length=len(str(number))
result =""
for i in str(number) :
length -=1
result +=("%s%s"%(numchar[int(i)],pr[length]))
result=result.replace("零萬","萬")
result =result.replace("零仟","")
result =result.replace("零佰","")
result =result.replace("零拾","")
result =result.replace("零圆","圆")
return result
# 读取记账凭证Excel文件
wb=openpyxl.load_workbook("记账凭证.xlsx", data_only=True)
# 遍历3张工作表(凭证)
for i in range(1,4):
sheet =wb[str(i)]
value1 =sheet.cell(11,2).value # 读取大写金额单元格原值
value2 =sheet.cell(11, 3).value # 读取阿拉伯数字金额
sheet.cell(11,2).value=value1+daxie(value2) # 填写大写金额
# 保存新的记账凭证文件
wb.save("记账凭证New.xlsx")代码说明
openpyxl.load_workbook:读取Excel文件,data_only=True表示读取单元格的数值而非公式sheet.cell(row,col).value:读取/修改指定行、列的单元格数值(行/列从1开始计数)wb.save:将修改后的内容保存为新的Excel文件,避免覆盖原文件- 优势:无需调整鼠标坐标,直接操作Excel数据,适配大批量凭证处理,稳定性远高于鼠标模拟。
代码运行后解说
运行代码后自动完成以下操作:
- 读取
记账凭证.xlsx文件,该文件包含3张工作表(命名为1、2、3,对应3张凭证); - 遍历每张工作表,读取第11行第3列的阿拉伯数字金额(如10000),转换为中文大写(壹萬圆整);
- 将大写金额填写到第11行第2列的单元格(追加到原有值后);
- 保存为新文件
记账凭证New.xlsx,原文件保持不变;
结果验证:

