前置:收入、财富与不平等 · 国内生产总值与国民收入
银行给你发放 60 的贷款,账户余额立刻多了 60。它是不是先把另一位储户的 60 取走再交给你?等你转账给另一家银行的商户,那笔贷款是否又跟着消失?要回答,必须同时看银行、借款人和收款人的账。
本篇用一笔贷款、一次跨行购买和一条本金偿还分支,区分存款、准备金、贷款资产与净财富。金额为教学单位,忽略手续费、利息和税;银行 B 仅展示本次业务的变化,不假设真实银行原本没有其他资产负债。
先给“钱”找到持有者和发行者
家庭持有的银行存款是家庭的资产,也是商业银行对家庭的负债。银行在中央银行持有的准备金,则是银行的资产、中央银行的负债。二者的持有主体和使用场景不同:家庭通常用存款支付,银行之间的结算可以涉及准备金转移。
现金、银行存款和其他高流动性工具可能进入不同货币统计指标,具体范围随国家和指标变化。这里把日常可支付银行存款作为讨论对象,不把所有金融资产都叫成可以直接买早餐的钱。
所有账都遵守 资产=负债+权益。权益是扣除负债后的净资产,不是一袋被单独放在柜台里的现金。
第一步:贷款和存款一起出现
银行 A 初始有准备金资产 100、存款负债 80、权益 20。原有 80 存款归其他客户,借款人初始没有存款和债务;商户持有成本价值 60 的待售商品。
当 A 发放贷款 60 并记入借款人存款:
| 主体 | 资产变化 | 负债或权益变化 |
| 银行 A | 贷款资产 +60 | 对借款人的存款负债 +60 |
| 借款人 | 存款资产 +60 | 贷款负债 +60 |
| 原有储户 | 无变化 | 无变化 |
银行 A 现在资产 100+60=160,负债加权益 140+20=160。不需要在这笔记账动作中先扣掉原储户的 60。贷款创造了对应存款,却没有给借款人创造 60 的净财富:他的可支付资产与还款义务同时增加。
这也没有直接创造新的机器、食物或住房。借款人的新增购买能力如何影响实际产出或价格,取决于他购买什么、企业有没有闲置资源,以及其他主体怎样反应。
第二步:买东西与跨行结算
借款人用这 60 购买商户的现有商品,商户账户在银行 B。简化为立即完成的跨行结算:
| 主体 | 资产变化 | 负债变化 |
| 银行 A | 准备金 −60 | 借款人存款 −60 |
| 银行 B | 准备金 +60 | 商户存款 +60 |
| 借款人 | 存款 −60,商品 +60 | 贷款仍为 60 |
| 商户 | 商品 −60,存款 +60 | 无新增债务 |
转账后 A 的准备金为 40、贷款 60、存款 80、权益 20,仍然平衡。B 因这笔业务增加准备金 60 与存款负债 60。两家银行的存款合计仍为 140:它从借款人名下移到商户名下,没有因为跨行支付而销毁。
两家银行准备金合计仍为 100,也只是转移。借款人的贷款仍记在 A 的资产侧,购买商品并不等于归还贷款。把贷款余额与付款账户余额混为一谈,会在这里同时读错三张账。
正在呈现知识画面
改变条件,核对结果初始 A 资产 100、存款 80、权益 20。贷款 60 同增贷款与存款;转账把准备金和存款转至 B;偿还分支从尚未消费的贷款状态出发。
{"id":"economics-20","title":"改变条件,核对结果","summary":"初始 A 资产 100、存款 80、权益 20。贷款 60 同增贷款与存款;转账把准备金和存款转至 B;偿还分支从尚未消费的贷款状态出发。","height":750,"html":"<div class=\"controls\"><label for=\"scenario\"><span data-i18n=\"scenario\"></span><select id=\"scenario\"><option value=\"0\" selected data-i18n=\"before\"></option><option value=\"1\" data-i18n=\"lend\"></option><option value=\"2\" data-i18n=\"pay\"></option><option value=\"3\" data-i18n=\"repay\"></option></select></label></div><button id=\"reset\" type=\"button\" data-i18n=\"reset\"></button><div id=\"graphic\"></div><div id=\"results\" class=\"results\" role=\"status\" aria-live=\"polite\" data-i18n-label=\"result\"></div><p class=\"scope\" data-i18n=\"scope\"></p>","css":"body{padding:20px}h2{font-size:19px;margin:0 0 14px}.controls{display:grid;gap:16px}label{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:6px;font-size:15px}select,input{grid-column:1/-1;width:100%;min-width:0;font:inherit}select{padding:10px;background:var(--paper);color:var(--ink);border:1px solid var(--rule);border-radius:6px;white-space:normal}input{accent-color:var(--accent)}button{min-height:44px;margin:16px 0;font:inherit}.plot{display:block;width:100%;max-width:560px;height:auto;margin:auto}.plot text{fill:var(--ink);font-size:14px}.legend{display:flex;gap:12px;flex-wrap:wrap;margin:8px 0;font-size:14px}.legend i{display:inline-block;width:16px;height:3px;margin-right:5px;vertical-align:middle}.results{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;margin-top:16px}.metric{border:1px solid var(--rule);padding:10px;border-radius:6px;min-width:0}.metric span{display:block;font-size:14px;min-height:3.5em;overflow-wrap:anywhere}.metric strong{font-size:22px;font-weight:600}.barrow{margin:14px 0;font-size:15px}.barlabel{display:flex;justify-content:space-between;gap:10px}.bar{height:16px;background:var(--surface);margin-top:5px}.bar i{display:block;height:100%;background:var(--accent)}.stack{display:flex;height:35px;margin:15px 0}.stack span{display:flex;align-items:center;justify-content:center;color:var(--paper);font-size:13px}.scope{font-size:14px;color:var(--muted);margin:14px 0 0;line-height:1.65}@media(max-width:380px){body{padding:14px 10px}.results{gap:6px}.metric{padding:8px}.metric strong{font-size:19px}}.accounts{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}.account{border:1px solid var(--rule);border-radius:8px;padding:12px;min-width:0}.account h3{font-size:16px;margin:0 0 12px}.account dl{margin:0}.account dt{font-size:13px;overflow-wrap:anywhere}.account dd{margin:2px 0 12px;font-variant-numeric:tabular-nums}.account .changed{font-weight:700;color:var(--accent)}.area-legend{font-size:14px;line-height:1.7}.area-legend span{display:block}.area-legend i{display:inline-block;width:12px;height:12px;margin-right:6px}@media(max-width:480px){.accounts{grid-template-columns:1fr}}","js":"const N=20,DEFAULTS={\"scenario\": 0};\n/* Pure, deterministic teaching models. Values are synthetic, not estimates. */\nfunction economy(n,p){\n if(n===6){const q=p.remaining,P0=10,P1=12,Q0=100;return{metrics:{oldRevenue:P0*Q0,newRevenue:P1*q,retainedGain:(P1-P0)*q,lostRevenue:P0*(Q0-q),elasticity:Math.abs(((q-Q0)/((q+Q0)/2))/((P1-P0)/((P1+P0)/2)))},revenueAreas:{remaining:q,oldPrice:P0,newPrice:P1,oldQuantity:Q0}};}\n if(n===5){const shift=p.scenario===1?20:0,supply=p.scenario===2?-20:0,P=(100+shift-supply)/20,Q=20+supply+10*P;return{metrics:{price:P,quantity:Q},plot:{xmax:140,ymax:14,x:'quantity',y:'price',lines:[{key:'demand',points:[[0,(120+shift)/10],[120+shift,0]]},{key:'supply',points:[[Math.max(0,20+supply),0],[140,(120-supply)/10]]},{key:'base',points:[[0,5],[140,5]],dash:true}],dot:[Q,P]}};}\n if(n===8){const b=p.response,bs=10,t=p.tax,Pb=5+bs*t/(b+bs),Ps=5-b*t/(b+bs),Q=70-b*bs*t/(b+bs);return{metrics:{buyer:Pb,seller:Ps,quantity:Q,revenue:t*Q,loss:.5*t*(70-Q)},plot:{xmax:100,ymax:20,x:'quantity',y:'price',areas:[{key:'revenue',points:[[0,Ps],[Q,Ps],[Q,Pb],[0,Pb]]},{key:'loss',points:[[Q,Ps],[Q,Pb],[70,5]]}],lines:[{key:'demand',points:[[0,5+70/b],[Math.min(100,70+5*b),Math.max(0,5+(70-100)/b)]]},{key:'supply',points:[[20,0],[100,8]]},{key:'base',points:[[0,5],[100,5]],dash:true},{key:'wedge',points:[[Q,Ps],[Q,Pb]]}],dot:[Q,Pb]}};}\n if(n===18){let index=100+p.weight*p.rise/100;return{metrics:{index,inflation:index-100},bars:[{key:'base',v:100},{key:'new',v:index}],max:180};}\n if(n===19){let E=60,U=10,N=30;if(p.scenario===1){E+=5;U-=5;}if(p.scenario===2){U-=5;N+=5;}if(p.scenario===3){U+=5;N-=5;}return{metrics:{employment:E,unemployment:U,participation:100*(E+U)/100,urate:100*U/(E+U),erate:E},stack:[E,U,N],stackKeys:['employment','unemployment','outside']};}\n if(n===20){const step=p.scenario;let reserves=100,loan=0,deposit=80,equity=20,br=0,bd=0;if(step!==0){loan=60;deposit=140;}if(step===2){reserves-=60;deposit-=60;br=60;bd=60;}if(step===3){loan=40;deposit=120;}const vals={reserves,loan,deposit,equity,bankBreserves:br,bankBdeposits:bd,borrowerDeposit:step===2?0:loan,borrowerGoods:step===2?60:0,borrowerDebt:loan,merchantDeposit:bd,merchantGoods:step===2?0:60};const prev=step>1?economy(20,{scenario:1}).accounts:economy20initial();return{metrics:{reserves,loan,deposit,equity,bankBreserves:br,bankBdeposits:bd,assets:reserves+loan,liabilities:deposit+equity},accounts:vals,ledger:[['bankA',['reserves','loan','deposit','equity']],['bankB',['bankBreserves','bankBdeposits']],['borrower',['borrowerDeposit','borrowerGoods','borrowerDebt']],['merchant',['merchantDeposit','merchantGoods']]].map(([title,keys])=>({title,items:keys.map(key=>({key,value:vals[key],delta:vals[key]-prev[key]}))}))};}\n if(n===22){const c=p.consume,shock=p.shock,rounds=Array.from({length:8},(_,k)=>shock*c**k);return{metrics:{total:shock/(1-c),shown:rounds.reduce((a,b)=>a+b,0),multiplier:1/(1-c)},bars:rounds.map((v,k)=>({label:String(k+1),v})),max:100,rounds};}\n if(n===25){const e=p.rate;return{metrics:{importBill:10*e,exportBill:70/e,debtBill:100*e},bills:true};}\n if(n===26){const A=p.tech,s=p.save/100,d=.1,k=(s*A/d)**2,y=A*Math.sqrt(k),trajectory=[];let current=25;for(let t=0;t<=60;t++){const output=A*Math.sqrt(current),investment=s*output,depreciation=d*current;trajectory.push({t,k:current,y:output,consumption:(1-s)*output,investment,depreciation});current+=investment-depreciation;}return{metrics:{capital:k,output:y,consumption:(1-s)*y},trajectory,plot:{xmax:60,ymax:Math.max(10,...trajectory.map(a=>a.y))*1.1,x:'period',y:'perPersonFlow',lines:[{key:'baselineConsumption',points:[[0,7.5],[60,7.5]],dash:true},{key:'outputPath',points:trajectory.map(a=>[a.t,a.y])},{key:'consumptionPath',points:trajectory.map(a=>[a.t,a.consumption])}]}};}\n throw Error('Unknown lesson');\n}\nfunction economy20initial(){return{reserves:100,loan:0,deposit:80,equity:20,bankBreserves:0,bankBdeposits:0,borrowerDeposit:0,borrowerGoods:0,borrowerDebt:0,merchantDeposit:0,merchantGoods:60};}\nif(typeof module!=='undefined')module.exports={economy};\n\nfunction renderTeachingView(r,el){\n if(r.ledger){\n el.innerHTML='<div class=\"accounts\">'+r.ledger.map(a=>'<section class=\"account\"><h3>'+escape(viz.t(a.title))+'</h3><dl>'+a.items.map(v=>`<dt>${escape(viz.t(v.key))}</dt><dd class=\"${v.delta?'changed':''}\">${viz.number(v.value)} (${v.delta>0?'+':''}${viz.number(v.delta)})</dd>`).join('')+'</dl></section>').join('')+'</div><p class=\"scope\">'+escape(viz.t('delta'))+'</p>';\n $('#results').hidden=true;\n }\n if(r.revenueAreas){const a=r.revenueAreas,x=q=>45+q*2.65,y=p=>213-p*14,q=a.remaining;\n let s=`<svg class=\"plot\" viewBox=\"0 0 360 270\" role=\"img\" aria-label=\"${escape(viz.t('figure'))}\"><path d=\"M45 28V213H322\" fill=\"none\" stroke=\"var(--rule)\"/>`;\n const rect=(x0,x1,p0,p1,c)=>`<rect x=\"${x(x0)}\" y=\"${y(p1)}\" width=\"${(x1-x0)*2.65}\" height=\"${(p1-p0)*14}\" fill=\"${c}\" fill-opacity=\".48\" stroke=\"${c}\"/>`;\n s+=rect(0,q,0,10,'#5277ab')+rect(0,q,10,12,'#247756')+rect(q,100,0,10,'#b56838');\n for(const p of[0,10,12])s+=`<text x=\"37\" y=\"${y(p)+4}\" text-anchor=\"end\">${p}</text>`;\n for(const v of[0,50,100])s+=`<text x=\"${x(v)}\" y=\"235\" text-anchor=\"middle\">${v}</text>`;\n s+=`<text x=\"45\" y=\"20\">${escape(viz.t('price'))}</text><text x=\"310\" y=\"261\" text-anchor=\"end\">${escape(viz.t('quantity'))}</text></svg>`;\n el.innerHTML=s+'<div class=\"area-legend\">'+[['retainedBase','#5277ab'],['retainedGain','#247756'],['lostRevenue','#b56838']].map(([k,c])=>`<span><i style=\"background:${c}\"></i>${escape(viz.t(k))}</span>`).join('')+'</div>';\n }\n}\n\nconst $=s=>document.querySelector(s),col=['var(--accent)','var(--second)','#7581ae','#b36b47'];\nconst escape=s=>String(s).replace(/[&<>\"']/g,c=>({'&':'&','<':'<','>':'>','\"':'"',\"'\":'''}[c]));\nfunction render(){\n let p={};for(const k of Object.keys(DEFAULTS)){p[k]=Number($('#'+k).value);let o=$('#out-'+k);if(o)o.textContent=viz.number(p[k]);}\n const r=economy(N,p);document.body.dataset.result=JSON.stringify(r.metrics);document.body.dataset.params=JSON.stringify(p);\n $('#results').innerHTML=Object.entries(r.metrics).map(([k,v])=>`<div class=\"metric\"><span>${escape(viz.t(k))}</span><strong data-metric=\"${k}\">${viz.number(v,2)}</strong></div>`).join('');\n const el=$('#graphic');el.replaceChildren();\n if(r.plot){const a=r.plot,x=q=>48+q/a.xmax*278,y=v=>205-v/a.ymax*164;\n let svg=`<svg class=\"plot\" viewBox=\"0 0 360 258\" role=\"img\" aria-label=\"${escape(viz.t('figure'))}\"><path d=\"M48 30V205H333\" fill=\"none\" stroke=\"var(--rule)\"/>`;\n for(const q of [0,a.xmax/2,a.xmax])svg+=`<text x=\"${x(q)}\" y=\"226\" text-anchor=\"middle\">${viz.number(q,1)}</text>`;\n for(const v of [0,a.ymax/2,a.ymax])svg+=`<text x=\"39\" y=\"${y(v)+4}\" text-anchor=\"end\">${viz.number(v,1)}</text>`;\n svg+=`<text x=\"48\" y=\"20\">${escape(viz.t(a.y))}</text><text x=\"326\" y=\"251\" text-anchor=\"end\">${escape(viz.t(a.x))}</text>`;\n (a.areas||[]).forEach((region,j)=>{svg+=`<polygon points=\"${region.points.map(([xx,yy])=>x(xx)+','+y(yy)).join(' ')}\" fill=\"${j===0?'#4c8c9d':'#bd7446'}\" fill-opacity=\".30\"/>`;});\n a.lines.forEach((l,j)=>{svg+=`<polyline fill=\"none\" stroke=\"${col[j]}\" stroke-width=\"${l.key==='wedge'?5:2.5}\" ${l.dash?'stroke-dasharray=\"5 4\"':''} points=\"${l.points.map(([xx,yy])=>x(xx)+','+y(yy)).join(' ')}\"/>`;});\n if(a.dot)svg+=`<circle cx=\"${x(a.dot[0])}\" cy=\"${y(a.dot[1])}\" r=\"5\" fill=\"var(--ink)\"/>`;\n el.innerHTML=svg+'</svg><div class=\"legend\">'+a.lines.map((l,j)=>`<span><i style=\"background:${col[j]}\"></i>${escape(viz.t(l.key))}</span>`).join('')+(a.areas||[]).map((a,j)=>`<span><i style=\"height:10px;background:${j===0?'#4c8c9d':'#bd7446'}\"></i>${escape(viz.t(a.key))}</span>`).join('')+'</div>';\n }else if(r.bars){el.innerHTML=r.bars.map(b=>`<div class=\"barrow\"><div class=\"barlabel\"><span>${escape(b.key?viz.t(b.key):viz.t('round')+' '+b.label)}</span><strong>${viz.number(b.v)}</strong></div><div class=\"bar\"><i style=\"width:${Math.abs(b.v)/Math.max(r.max,...r.bars.map(a=>Math.abs(a.v)))*100}%\"></i></div></div>`).join('')+(N===22?`<p class=\"scope\">${escape(viz.t('negative'))}</p>`:'');\n }else if(r.stack){el.innerHTML='<div class=\"stack\">'+r.stack.map((v,j)=>`<span style=\"width:${v}%;background:${col[j]}\">${v}</span>`).join('')+'</div><div class=\"legend\">'+r.stackKeys.map((k,j)=>`<span><i style=\"background:${col[j]}\"></i>${escape(viz.t(k))}</span>`).join('')+'</div>';}\nrenderTeachingView(r,el);\n}\nfor(const k of Object.keys(DEFAULTS))$('#'+k).addEventListener('input',render);\n$('#reset').addEventListener('click',()=>{for(const[k,v]of Object.entries(DEFAULTS))$('#'+k).value=v;render();});render();\n","audio":false,"strings":{"assets":"A:资产合计","bankA":"银行 A:简化完整账","bankB":"银行 B:本次业务变动账","bankBdeposits":"B:存款变动","bankBreserves":"B:准备金变动","before":"发贷前","borrower":"借款人","borrowerDebt":"贷款负债","borrowerDeposit":"存款资产","borrowerGoods":"购入商品资产","delta":"括号为相对上一业务步骤的变化;偿还从未支付分支出发。","deposit":"A:存款负债","equity":"A:权益","figure":"当前参数下的模型图;准确值见下方结果。","lend":"发放贷款 60","liabilities":"A:负债加权益","loan":"A:贷款资产","merchant":"商户","merchantDeposit":"存款资产","merchantGoods":"待售商品资产","pay":"发贷后跨行支付 60","repay":"未支付,偿还本金 20","reserves":"A:准备金资产","reset":"恢复基准","result":"计算结果","scenario":"选择一种变化","scope":"初始 A 资产 100、存款 80、权益 20。贷款 60 同增贷款与存款;转账把准备金和存款转至 B;偿还分支从尚未消费的贷款状态出发。"}}
按“发贷前 → 发放贷款 → 跨行支付”顺序看四方账,变化项显示与上一业务步骤相比增加或减少多少。银行 B 是变动账,商户商品按本例交易价等于账面价值处理;其他活动不在模型内。
第三步是另一条分支:用未花掉的存款还本金
回到贷款刚发放、还没购买商品的时点。借款人决定立即偿还本金 20,A 同时减少对他的贷款资产 20 和存款负债 20;借款人的存款与贷款负债也各减 20。
于是 A 的贷款从 60 到 40、存款从 140 到 120,准备金仍为 100、权益仍为 20;借款人剩存款 40、债务 40。本金偿还在这一分支中缩减了银行贷款创造的存款。
交互的“偿还本金”从尚未支付的贷款状态出发,不是商户已经收款后借款人又凭空多出 20。若在跨行购买后还款,需要先说明借款人从工资、出售资产或其他来源取得资金,再补齐相关银行之间的转账。
利息是另一种支付,它影响银行收入和各方权益,不能机械套用“本金和对应贷款余额同额减少”的分录。贷款减记也不同:若 A 认定贷款有 10 无法收回,贷款资产和权益各减 10,存款负债不会因此自动减少 10。
既然可以记账,为什么不能无限放贷
第一步只展示发贷分录,不意味着后续约束消失。借款人把存款转出时,银行需要可用的结算资产或融资来源;准备金不足可能需要同业融资、出售资产或符合条件的央行融资,而这些有价格、抵押品和资格约束。
银行还要承担贷款违约风险、资本和流动性要求,并判断未来收入是否覆盖融资与经营成本。借款人也需要有偿还能力并愿意借款。账能记平是必要条件,不是这笔贷款经济上可行或监管上可做的充分条件。
一个只把准备金反复乘固定倍数的故事,省略了借款需求、贷款决策、结算、资本与价格之间的互动。特定准备金制度下的乘数算式可以描述某些假设关系,但不能把它当作现代银行每笔业务必然遵循的操作顺序。
也要分清流动性与偿付能力:有价值资产却暂时缺结算资金,是流动性问题;资产损失超过权益则涉及偿付能力。两者可能相互恶化,但借到短期现金不等于资产损失已经修复。
银行信用怎样连接实体经济
贷款可以支持企业买新设备、家庭买商品,也可能用于购买既有资产。前者可能与新增生产相连,后者主要改变资产持有者和价格,不能把所有新增信贷都直接加进 GDP。
当很多人急于减少债务,新增贷款少于本金偿还,存款与支出可能承受收缩压力;如果同时削减消费和投资,就会影响企业订单与收入。这是需要继续分析的传导链,并非从一笔分录就能推导出固定倍数的经济衰退。
中央银行影响结算体系和融资条件,但商业银行准备金增加不会自动变成家庭消费。需要继续追问贷款、利率、资产交易和支出决策的具体环节;利率与政策两课会分别展开。
用四方账排除错觉
借款人贷款 60 后全部转给 B 的商户,有人说“A 的客户存款减少 60,所以银行体系货币减少了 60”。遗漏了什么?
展开推理
遗漏了 B 对商户增加的存款负债 60。A 的客户存款下降只是一家银行的变化,银行体系合计仍为 140;准备金从 A 转到 B,借款人的贷款留在 A。先固定银行体系边界,再合计各家的同一项目。
A 对刚发出的贷款确认损失 10。有人说“借款人不用还这 10,其他储户账户也应减 10,银行就平账了”。正确的基本分录是什么?
展开推理
在本例直接核销的简化账中,A 的贷款资产减 10、权益减 10,已有存款负债不随之自动减少。实际减值、拨备和法律债务处理有各自程序,资产减记也不自动等于借款人的法律义务被豁免。损失先影响谁、能否继续经营,要进一步看权益和相关规则,而不能随意改储户余额。
资料与延伸阅读
以下资料用于核对概念与统计口径;本文数字、算例和图形为原创教学设定。
Bank of England · Money Creation in the Modern Economy