德国开元华人社区 开元周游

标题: 自编买房贷款小程序 [打印本页]

作者: quantum    时间: 25.4.2003 12:23
租房子住总有一种漂泊的感觉。最近就跟夫人一商量,做个买房的计划吧,反正凡是做个计划总不是坏事。

我们计算了我们的收入和花销及房租,发现参考我们的能力,以及我们所在地方的房价,大约可以计划在2008年买一个价格约30万欧元的不大的Haus. 具体做法是到那时我们能存大约8万,然后从银行贷款22万,以后每月还一笔钱给银行。

怎样存这8万块,以及怎样贷这22万,有很多种选择和技巧。一般常用的,也是银行推荐的,有存一个“建房存款合同”(Bausparvertrag),利用这个Bausparvertrag,可以从银行低息贷一些钱;另外自己分散存几笔,有定期储蓄和类似投资性质的存款。

但是怎样合理地分配这些存款,就大有文章啦。这个真的需要编程序计算的。

开始银行给我推荐每月存500欧元的Bausparvertrag,持续5年,这期间有2%的利息;大约连本带利加上政府的407欧元的补贴,减去银行收取500欧元的手续费,总共有约3万2千欧元;然后银行以2.75%的利息贷出1万8千欧元。这1万8千欧元以每月400欧元四年整付清。

另外从银行以2.75%的利息贷出20万欧元,比方说每月付993.33殴元。等那1万8千欧元付清后,400欧元也可以并入付这20万。

表面上看来,也是银行方面坚持认为,以2.75%的利息贷出1万8千欧元无论如何也是一件极划算的事情。我当时也这样认为的啊。

实际上,我回来用我的程序计算之后发现,如果我直接从银行贷款22万欧元,而不要那个Bausparvertrag,可以提前一年还清贷款!一年付的钱大约是一万六千欧元!

问题就出在Bausparvertrag的钱必须在最先4年内还完。后来我马上就再去银行,将Bausparvertrag的金额降低至每月仅存85欧元。其它的钱另做别处。

呵呵,我差点就被银行晃点了,要不是我有自己的程序的话。

作者: quantum    时间: 25.4.2003 12:30
下面附上用Matlab编的源程序。当然很多人大概机器上没有Matlab;我也可以用Visual Basic 或 C 编写,不过肯定还是有很多人大概机器上没有 Visual Basic 或 C。没关系,有想要咨询的直接把具体情况用email告诉我就可以了,我可以帮你计算。


程序一:假定贷款利率为5%,最初还本金为1%, 1.5%, 2%, 2.5%, 3%的情形
算出来5条曲线,横坐标为月数,纵坐标为剩余本金的百分比


function loan1()

% the program to calculate the loan Zinsen and time to pay the loan

Zinsen=0.05;
tilgung0=[0.01 0.015 0.02 0.025 0.03];

for jj=1:5
rest(jj,1)=1;
for ii=1:600
rest(jj,ii+1)=rest(jj,ii)-((Zinsen+tilgung0(jj))/12-rest(jj,ii)*Zinsen/12);
if rest(jj,ii+1)<=0
iii(jj)=ii+1;
break;
end
end

average_Zinsen(jj)=0;
for ii=1:iii(jj)
average_Zinsen(jj)=average_Zinsen(jj)+rest(jj,ii);
end
average_Zinsen(jj)=average_Zinsen(jj)/iii(jj)*Zinsen;
average_Zinsen(jj)
end


fp=fopen('loan1.out','w');
fprintf(fp,'%1 %1.5 %2 %2.5 %3\n');
for ii=1:iii(1)
fprintf(fp,'%f %f %f %f %f %f\n',ii,rest(1,ii),rest(2,ii),rest(3,ii),rest(4,ii),rest(5,ii));
end
fclose(fp);

作者: quantum    时间: 25.4.2003 12:32
程序二:一个目前的实际情况例子,贷款利率为4.96%,贷款22万,每月付1393.33欧元
算出来横坐标为月数,纵坐标为剩余本金的百分比


function loan2()

% the program to calculate the loan interest and time to pay the loan

interest=0.0496;
month_pay=1393.33;
total_loan=220000;
tilgung0=(month_pay*12-total_loan*interest)/total_loan;
tilgung0

rest(1)=1;

for ii=1:600
rest(ii+1)=rest(ii)-((interest+tilgung0)/12-rest(ii)*interest/12);
if rest(ii+1)<=0
iii=ii+1;
break;
end
end

s=0;
for ii=1:iii
s=s+rest(ii);
end
s=s/iii*interest;
s



fp=fopen('loan2.out','w');
for ii=1:iii
fprintf(fp,'%f %fn',ii,rest(ii));
end
fclose(fp);
作者: quantum    时间: 25.4.2003 12:42
虽然银行也有推荐,自己计算一下是很有必要的,因为:
1。银行有它自己的利益打算
2。银行不可能有时间给你做详细的计算
3。银行即使给我做详细的计算,也很可能不是最优的;一般银行职员不可能有我这样的数理功底

我幸亏自己算了一下,省了1万6千欧元!(假设利率不变的话)

要买房的同志,不妨签订合同之前让我帮忙算一算哦。

假设你的选择已经是最优的,不在乎再检验一次;你的选择哪怕能有一丝的改进,在买房贷款上那省下来的少说也是数千欧元了,可以买一辆旧车了。

您可以把具体情况发给我,我能就具体情况编程序计算。很快的,几分钟功夫。

最重要的是,所有的计算都绝对是免费的!不过多一个朋友,说不定有幸旅游到了的时候蹭一宿而已。
作者: quantum    时间: 25.4.2003 12:47
鸿客给M一下吧。
倒不是偶想要什么好处,不过万一以后有人真想找偶计算时好找一些罢了。 smile.gif
作者: 鸿客    时间: 25.4.2003 13:03
QUOTE (quantum @ Apr 25 2003, 01:47 PM)
鸿客给M一下吧。
倒不是偶想要什么好处,不过万一以后有人真想找偶计算时好找一些罢了。 smile.gif

这么精彩的帖子,当然要M,至于通宝宝先欠着,到时候可以用你的程序算算利息,一并给你。
作者: quantum    时间: 25.4.2003 13:22
谢了。
通宝宝俺是不要的啦,怎么好意思跟你们抢钱啊。

不过那个程序虽然短小,却真管用;不算一下,还真不知道在高息贷款到达一定数目后,那个低息贷款能坑人呢。
作者: leilei    时间: 25.4.2003 17:32
恩,强烈支持,,,精彩的解析。。。。
作者: 开洋    时间: 27.4.2003 14:42
好啊,最近正在用matlab,不错的程序,就是有点大,作业要求. teeth_smile.gif
作者: 开洋    时间: 27.4.2003 14:46
Zinsen=0.05;
tilgung0=[0.01 0.015 0.02 0.025 0.03];

for jj=1:5
rest(jj,1)=1;
for ii=1:600
rest(jj,ii+1)=rest(jj,ii)-((Zinsen+tilgung0(jj))/12-rest(jj,ii)*Zinsen/12);
if rest(jj,ii+1)<=0
iii(jj)=ii+1;
break;
end
end

average_Zinsen(jj)=0;
for ii=1:iii(jj)
average_Zinsen(jj)=average_Zinsen(jj)+rest(jj,ii);
end
average_Zinsen(jj)=average_Zinsen(jj)/iii(jj)*Zinsen;
average_Zinsen(jj)
end


fp=fopen('loan1.out','w');
fprintf(fp,'%1 %1.5 %2 %2.5 %3\n');
for ii=1:iii(1)
fprintf(fp,'%f %f %f %f %f %f\n',ii,rest(1,ii),rest(2,ii),rest(3,ii),rest(4,ii),rest(5,ii));
end
fclose(fp);

ans =

0.0321


ans =

0.0309


ans =

0.0300


ans =

0.0294


ans =

0.0290
作者: 开洋    时间: 27.4.2003 15:01
function loan2()

% the program to calculate the loan interest and time to pay the loan

interest=0.0496;
month_pay=1393.33;
total_loan=220000;
tilgung0=(month_pay*12-total_loan*interest)/total_loan;
tilgung0

rest(1)=1;

for ii=1:4000
rest(ii+1)=rest(ii)-((interest+tilgung0)/12-rest(ii)*interest/12);
if rest(ii+1)<=0
iii=ii+1;
break;
end
end

s=0;
for ii=1:iii
s=s+rest(ii);
end
s=s/iii*interest;
s
end


fp=fopen('loan2.out','w');
for ii=1:iii
fprintf(fp,'%f %fn',ii,rest(ii));
end
fclose(fp);

第27行的end(红)好像不需要写,但我也不是很确定,不过出来的结果是一样的,只是少了warning.
作者: quantum    时间: 28.4.2003 09:54
呵呵,帮你确定一下,你是对的,偷懒一拷贝,确实少删了一个end。
另外第12行的ii=1:4000只需要1:600就够了,会快得多;我因为计算机快,随便放了个大数目上去,也没认真改。 smile.gif





欢迎光临 德国开元华人社区 开元周游 (https://bbs.kaiyuan.cn/) Powered by Discuz! X3.2