Author Archives: Paul Lou

About Paul Lou

Professionals across multiple industries

Paul Lou 网站导读

贷款
1. 贷款步骤介绍 (English) | FAQ | 如何询价
2. 常见lenders介绍 | Provident Funding 介绍
3. 关于信用分 | 要闻及利率变化 | 关于报税
4. 给Real Estate Agents
5. Paul Lou几大优势介绍

房子
西雅图抢房 |解决厨房下水堵塞之终极篇
后院 – 蔬菜、鲜花与果树

身在美国
在美国如何保护自己

Paul Lou | Loan Officer NMLS# 1905797 | eLink Mortgage NMLS# 385463
NMLS Consumer Access: https://www.nmlsconsumeraccess.org/

贷款 – 常见lenders

我之所以能够拿到很好的利率,主要原因是跟不少wholesale lenders打交道,然后在其中选最好最合适的。不同的lenders特点不一样,现在我把常用的几家lender简单比较一下,供大家参考。跟设计软件系统没有perfect design一样,贷款没有perfect lender,需要根据情况来做trade-offs,适合你朋友的lender不一定适合你,即使同一样lender,不同时期也会不一样。

Quicken Loans / Rocket Mortgage

Pros: 在美国排名前三的一个lender,原名Quicken Loans,2020上市时改名为Rocket Mortgage,内部系统和流程做得比较好,大部分情况30-40天close。

Cons: 利率有时一般,有时间压力,borrowers和loan officer响应都需要快

Provident Funding

Pros: 利率好。Close时间比较稳定,一般能按时甚至提前Close。给borrowers的portal不错,告诉贷款人进展和TODO List,borrower可以直接提交文件给lender,这样会快一些

Cons: 审核比较严格并且有不少独特的规定。有一些时间压力,borrowers和loan officer响应都需要快。严格和独特的地方举几个例子
0. 需要有escrow account用来交房产税和home insurance,如果waive利率会差一点点
1. 没有免费lock extension,超过一天都要交lock extension fee
2. 要的材料比一般lender多
3. 不接受investment condo
4. 夫妻双方拥有自住房,即使一方不在贷款上,这一方做贷款时也要把自住房mortgage算成债务

One American Mortgage

Pros: 利率好。相当宽松,1M以下的自住房拿appraisal waiver概率比较大;有free lock extension,异常情况退出没有penalty

Cons: 慢,由于慢和COVID的原因,要文件(paystub, bank statement等)的次数会多一些

贷款 – 步骤简谈

首先恭喜你找到一位靠谱、利率好、有责任心和专业能力强的loan officer (简称LO)给你做贷款(在美国有时得自我宣传,请别见怪)。贷款大部分情况下需要30-45天,少有的情况会更长。贷款有不少步骤,这里简单介绍一下。注意给你打电话的人只有你的LO和最后约当面签字时间的人,lender不会打电话。

  • 0. pre-approval: 买房请读链接,refinance请忽略
  • 1. 准备材料:LO会发材料准备清单到你的邮箱。材料都不难准备,如果觉得哪个材料不容易准备尽管告诉LO。这一步最快有人半小时搞定。正常的话,花1-2小时focus time应该可以准备好,慢的话可能要1-2天或更长
  • 2. 做loan file与锁定利率:你的LO会用你提供的资料,花时间做你的loan file,这个过程中会pull credit report,并且可能问额外的问题或要额外的材料。
    1. 做完loan file会提交给lender,如果利率不错即可锁定。一旦利率锁定,不能更改,之后利率涨跌都不受影响。锁定利率后不做,有时会有一点penalty
    2. 为提高体验和效率,LO会先垫付credit report fee,然后借款人paypal/zelle转给LO,这样不需要信用卡的信息(卡号地址),或者在closing时付
    3. 注意贷款期间最好不要开新的credit(e.g 开信用卡、买车等),避免大额资金转账,保持银行帐户clean和有足够余额
  • 3. 电子签字初始文档:Lender会发一些文件电子签字。大部分是disclosures,快速过一眼即可。需要重点看的是Loan Estimate(LE),里面有很多数字。如果需要的话,你的LO会让你明白每一个数字,是的,每一个数字。1003 application也可以快速看一下,里面的数字如果跟LE不一致,以LE为准。有的lender可能会寄这些文档的hard copy到家,电子签过所以不用管。不同lender的细节Provident Funding。买房请读链接
  • 4.1 初步Review: Lender会初步review你的loan: 这一步可能会让你提供新的文件
    1. 如果appraisal不能被waive掉,要做appraisal,费用需要提前支付。LO可以先垫付在closing时报销,或borrower paypal/zelle转给LO,这样不需要贷款人的信用卡信息
    2. Condo需要HOA questionnaire和master insurance policy,新Condo会需要很多其它文档。尽快联系你的HOA company,可能有$100-$300的费用。有的HOA给力,有的不给力,邮件2天不回就得打电话。更多请参考关于Condo
  • 4.2. Title and Escrow: 如果是买房,Title/Escrow公司是卖家选的,每家都可能有点不一样,不用往下读。如果是refinance,跟我合作的公司叫Chicago Title,联系人是 Jun Lu (Jun.Lu@ctt.com, Escrow Officer)。Title公司会发一封邮件,里面有几个文件主要是prelim title,发件人是Chicago Title Eastside Title Unit via smartview – svo@smartviewonline.net,这封邮件不需要管。另一封邮件发件人noreply@inhere.com,要填questionnaire,建议时不时查收邮箱因为很可能会进spam folder。下面是简要填表参考(同时请参考详情)
    • Power of attorney 一般选NO,除非你自己不能签字,需要别人代签
    • 要签payoff authorization找现lender拿payoff statement
    • 会让你填questionnaire如下图。Lender Name和Loan Account Number填你现在的贷款;Pay Off Loan As Part of Closing 在refinance时要填YES,因为新贷款会取代旧贷款;Have your entered into a forbearance…? 一般填NO,因为我的客户财务状况都不错,不存在这种少见的情况
  • 5. 审核批准:
    1. 审核贷款的人的叫underwriter,中间可能找你要更多文档: 新的paystubs,bank statements,mortgage statement;解释credit report里的credit inquiries;HELOC subordination agreement;解释大额存款;需要保证银行帐户有足够余额等。underwriter在所有conditions都被解决后会批准你的贷款,进入CTC (Cleared to Close)。
    2. CTC前后lender会准备你的Initial Closing Disclosure(CD),这个文档跟之前看过的Loan Estimate很像,如果有问题尽快告诉LO让lender修改,同时可参考解读payoff amount。如果产权人配偶不是贷款人,需要配偶手签签字页/cover page后扫描发给LO。注意,有些数字(譬如说prepaid interests, payoff)根据具体哪天funding可能会变化。Lender可能会要VOE (verification of employment) 相关信息
      不同lender的细节Provident Funding
  • 6. 签字和打款给escrow company
    1. escrow会打电话约签字,手机最好随身携带。可以去escrow office签字,也可以让escrow派人上门。下面仅适用Refinance:打电话的人会说收费$95,事实上已包括在escrow fee里,去office并不会省$95
    2. 如果在家签字,建议准备好蓝色墨水的笔和桌子,在车库或后院签字,戴口罩保持距离,比较安全
    3. 已结婚并且夫妻都在产权上,需要都在场签字
    4. 携带Driver’s license。如果lender是Provident Funding,需要带绿卡 或 I-797 with current visa
    5. 签字时可以提供银行账号信息用来给新贷款做automatic payment
    6. 如果Closing Disclosure上有Cash to Close from Borrower,签完字后尽快做wire transfer (参考如何做wire transfer),或者提前准备cashier’s check(需要去一趟银行)在签字时给escrow公司。需要用之前提交过的银行帐户
    7. 重复一下第5.2步:如果还没有的话,建议把Closing Disclosure上的数字看一遍,避免在签字的时候对数字有疑问而影响签字(解读payoff amount )。负责签字的人是只是公证员notary,对贷款细节并不了解
    8. 如果已经付了房产税,但closing时在prepaids里交了6个月,escrow公司会退给你
    9. 如果当月中下旬close,建议手工取消旧lender的自动还款
      不同lender的细节Provident Funding
  • 7. 签字后Funding及后续
    • lender会做funding review,可能会有新的conditions,譬如说VVOE(verbal verification of employment)不顺利,wire transfer的银行不是之前提交的等
    • Funding review通过后escrow公司会负责disburse funds给各方包括payoff前lender,并在county record,recording后贷款正式结束
    • Refinance: 旧lender/bank的贷款并不会马上清零,不同的lender处理所需时间不一样。由于这个原因,旧lender的自动还款建议手工取消
    • Refinance: 旧lender/bank会把escrow account (如果有的话)剩余的钱退给你,如果一个月内没收到check,建议打电话问
    • Refinance: 旧lender/bank如果多收了payoff会退给你,如果一个月内没收到,建议打电话问。有些银行譬如First Tech会直接打到Savings Account里
    • 特别注意:半年内不能再做refinance或者卖房,否则会有penalty (少数情况高达$10k),因为lender会亏损
  • 8. 新lender及后续
    1. 新lender会寄mail给你(一个月内寄到都正常,注意查收),拿到信后在网上setup account和设置自动还款,注意loan number跟之前的不一样。如果mail没收到或者弄丢了,建议在网上找客服电话打过去。一些lender用的网站: Dovenmuehle Mortgage https://dmi.yourmortgageonline.com/ , BSI https://myloanweb.com/BSI/, and One American –https://oneamericanmortgage.myloancare.com
    2. 一般来说close之后的那个月的mortgage payment不用付,譬如说2月close,3月不用付月供, 4/1付第一次月供。
    3. Lender很有可能会把你的贷款卖给Fannie Mae or Freddie Mac,这在美国很正常(可以说是by design),loan servicing(交payment的地方)可能会转到其它公司 (loan servicer公司清单)。在新的公司设置还款即可,设置过程很容易
    4. 特别注意:半年内不能再做refinance或者卖房,否则会有penalty (少数情况高达$10k),因为lender会亏损
    5. 贷款结束后(甚至在结束之后1-2年内),可能会有compliance check看文档是否齐全,如果需要补签材料请配合,一般是disclosure之类的文档。

上面说的是面向客户的流程,后台还有很多其它事要做。请理解lender, title&escrow, appraisal等公司的不少事情都不在Loan Officer控制范围内,但不管什么情况,Paul Lou都会尽力帮你。整个过程中,给你打电话的只有你的LO和最后约当面签字时间的人,给你发邮件的人只有Lender和Title/Escrow company,任何其它人都跟本次贷款无关。请联系你的LO whenever in doubt。

贷款 – 询价篇

美国贷款利率现在处于近50年来历史低位,而且反常的是15yr/30yr fixed利率比ARM低(jumbo除外)。做贷款首先涉及到一个询价的问题,这里提供一些尽量客观的信息供参考。

首先,每个人的情况都不一样(e.g. 房产估值,贷款额,信用分,收入,自住还是投资,是否cashout,是否买点或出closing cost等),每天的利率也不一样,你能拿到的利率跟你的朋友、同事和邻居可能都不一样,所以不要跟别人做过多比较。

其次,如果工作和生活很忙,没有太多时间研究和比价,那就找一二位你信得过的loan officer来问一下,或找现银行/lender和一位你信得过的loan officer。也许拿到的不是市场最低,但仍然会是不错的deal。其实即使你花很多时间研究和比价,也不一定拿到最低。即使有最低的,如果做贷款的地方不靠谱你也不一定敢要。

如果你有足够时间和精力来比价,可以多找几家来估。我在熟谙多个行业后,经常说一句话:隔行如隔山,you don’t know what you don’t know。即使你在IT行业是partneer engineer/mgr,在另一个行业可能不如entry level professional。我知道一些朋友花了大量时间做研究,但仍然不了解一些最基本的信息。

  1. 每天利率不一样,每天可能变化多次,在不同的时间比价可能不准确。譬如说在一家好的broker估价的那天正好利率一般,但在另一家一般的broker那估的那天利率正好比较好,你可能觉得第二家更好但其实不一定。所以为了公平准确起见,最好在同一天同一时间段拿多个估价。
  2. 估价需要好几个参数,不需要个人资料(工资单,w-2, SSN等),也不需要pull credit。有的公司或个人可能找你要不少资料,然后直接hard pull你的credit,这种做法不太好,有想锁定客户的嫌疑。我报价时不要个人资料,也不pull credit,并且给客户足够时间shop around。
  3. 建议找信得过靠谱的人,找信得过靠谱的人,找信得过靠谱的人。由于接触的人多,我知道不少找不认识的人做贷款利益受损/体验不好/没有peace of mind的实际例子。麻烦的是隔行如隔山,有hidden fees或者别人给你不真实的信息你可能都不知道。对不认识的人来说,如果没做好,损失一个不认识的客户没什么,反正现在做贷款的人多。而且很多人没有做长期business的mindset,能做一单就做一单。也有不少人是给银行打工的,没做好也没什么。所以为了低0.125%的利率或低一些cost找不认识或不确定靠谱不靠谱的人,没有peace of mind,没有人帮你回答和解决问题,不一定值得。贷款利率锁定后还有很多工作要做,后面的服务很重要。选做贷款的人要看哪家信得过,哪家更放心省心,哪家能够给你提供更多的value,哪家愿意为你争取最大利益,哪家解决问题能力强帮你处理unexpected situation,哪家你将来还会用到。我会给让给客户明白每一个数字,是的,每一个数字。有意思的是,95%的地方做不到这一点。
  4. IT圏朋友特别喜欢网上估价,但在网上询价要特别注意一些“坑”
    • 估价本身其实是不需要名字,邮件,电话的,也不需要pull credit。如果你提供了个人信息,之后收到多个骚扰电话不要奇怪
    • 网上可能用很低的利率来“吸引人”(引人上勾),譬如说30yr fixed 2.25%,但实际上要花不少钱买点。有些时候一听就知道是too good to be true
    • 网上可能用好一丁点的利率吸引人,譬如你找broker拿到的是15yr fixed 2.5% no cost,网上可能给2.49% no cost
    • 网上经常只提lender fee,甚至会说$1 lender fee,但没提third party fees
    • 网上利率不错,但你不知道最后给你做的人到底是谁,人品如何,是否会给你争取最大利益;能力如何,能不能搞定你的贷款,碰到unexpected情况怎么办等等;服务如何,是否快速反应,是否沟通顺畅等等。我多年前在zillow mortgage上找过一家利率最低的做贷款,最后拿到的不是网上给的估价,他给的原因在我成为专业人士后才知道他骗了我,但我当时没有能力判断。另一位朋友找zillow,在close时被多charge了一笔钱,由于市场变化只能认了
  5. 贷款可能有多个选项供选择:是否买点,是否付一些closing cost,是否cashout,是否把cost做进贷款里,是否要escrow account,15年还是30年等等,很多问题的回答需要足够了解你的个人情况和做专业的分析,不是一个简单的no cost option就能cover,也不是一般水平的人能做得好的
  6. 不要不好意思找你认识信得过的朋友询价,千万不要有询价就要找他/她的压力。一位好的Loan Officer,会很乐意提供询价和有用信息,不管做不做这一单。如果他/她介意,那大概率不是一位好的Loan Officer,不找也没关系。找认识信得过的人的好处是你可以得到真正实在的信息(不至于被欺骗),可以得到更多的attention,会为你争取最大利益,沟通更顺畅,总的来说是更好的服务。
  7. 关于寄到家里的贷款广告:基本上可以扔掉,原因就是之前提到的,#1 利率每天变化,有时变化还很大,从寄信到收到到你打电话过去好多天过去了,他们不可能总是能提供他们说的,上面一定有不少fine prints. #2 打这种广告的人会用很低的利率拉你上勾,这基本上是唯一他们能提供的诱饵 #3 你对做广告的公司或人估计完全不熟,他们也不了解你 #4 打广告的人其实是发给很多人,只要有一小部分人上勾就可以 #5 你有可能用了”免费”的credit score service,你的信息被卖掉了
  8. 一旦选一家开始做了,特别是锁定利率后,最好不要随意退出。细节可参考我的另一篇blog:贷款 – 利率锁定后退出?

贷款 – 利率锁定后退出?

今天聊一小部分人碰到的困扰,那就是找Loan Officer(简称LO)做贷款锁定了利率,然后利率变低或者有人给更好的quote,产生退出的念头怎么办?

首先,中途退出没有法律责任,可能有一些财务上的损失(譬如要付已经发生的credit report fee和appraisal fee),主要伤的是人品/reputation。虽然法律上有权利退出,但lock rate代表一种commitment,lender也需要reserve足够的钱来保证利率不变

其次,退出有一些后果

  • 你的LO可能被公司罚款。有的lender会看fallout比例,到一定比例lender会suspend帐户。
  • 一旦利率锁定,很多人开始为你服务。虽然你看到的主要是LO,后面可能还有loan processor, lender公司多个人, title公司多个人, escrow公司多个人, appraisal公司多个人等,退出意味这些人的付出白费,也意味着LO的credit会被影响。

最后,要考虑退出的好处是什么,很多时候就是0.125%的利率或者一小部分closing cost。如果锁定3.0%还没close,利率降到了2.875%想要退出,那之后降到2.75%或更低要不要再次退出?要知道,如果利率一直下降,半年之后总可以再refinance。还有,为了一点小小的好处,退出后换一个人做refi,你对这位新的人了解有多少,靠谱不靠谱,更低的quote之后是不是有tricks,服务质量如何等等都需要问清楚,不能只看表面上的数字。

有少数原因退出可以理解 ,譬如说工作或房子出了大问题,不过这比较少见。

  1. 避免退出:确定找一个人做贷款之前尽量做好功课,找某一位多次 quote都没问题。锁定利率跟买股票类似,很难或几乎不可能拿到最低点,满足预期即可。利率每天都在变化,没人能预测未来。
  2. 如果一定要退出,跟LO说明白,尽量坦诚,也许能找到好的解决方案,退出是lose-lose,找到方案是win-win。如果找不到解决方案也没关系,好好沟通,以后也许还有合作机会,毕竟没有人是完美的,这个世界也不完美,中途退出这种不多见的体验有时对双方都是一种成长的机会。

Repurposing my blog

My original idea was to make this a purely technical blog. When I was working on building the core infrastructure in Azure I thought that I could write something about how it was built. However I couldn’t write much because most of the time I was working on confidential projects. Cloud computing is a very competitive area as you may know. The 2nd reason is that there is already so much useful info on technologies and I wouldn’t be able to provide the best value by focusing on only technical stuff.

Anyway I have decided to write whatever I think can provide more value. The audience is people in the United States. I will write in Chinese most of the time since there is less info in Chinese. The main focus will be IT and Real Estate.

Solving CORS issue became easy

// If you don’t have time just jump to the last section – takeaway. If you do that solving CORS issue will be easy.

CORS stands for cross origin resource sharing. Let me use a simple example to explain the basics.
Say that you have a web site http://foo.com and it has a client side javascript which uses AJAX to call http://bar.com to get some info. That is a CORS request. To make the request successfully the server needs some change to allow CORS requests.

What is considered cross origin? Use http://foo.com as an example the below urls are considered as different origins.
Https://foo.com (different scheme)
Https://foo.com:8080 (different port)
Https://api.foo.com (different subdomain)
Https://bar.com (different domain)

In some cases a complaint browser may send a preflight request before it allows the request to be sent. Let me use a real case to explain.
Scenario: Client side uses token authentication to get info from server side

1. The client side javascript sends a POST request to https://localhost:44300/Account with token (basically http header “Authorizattion”:”Bearer aAbdkkixlkid…”)

2. The browser determines a preflight request is needed and it sends preflight request
3. The server has to respond with status code 2XX AND with required headers. In this case Access-Control-Allow-Origin cannot be *. Access-Control-Allow-Headers has to contain Authorization.
4. The browser then sends the actual request.

preflight request

actual_request

Actual request

preflight_request

Takeaway

I spent a lot of time solving my particular case and read tens of links. In the end it I found that it could be much simpler and quicker if I knew the below two things.
1. Read just one link https://msdn.microsoft.com/en-us/magazine/dn532203.aspx
2. Do check the console message when useing developer tools in browser. I didn’t check the console message. Otherwise it could have saved me a lot of time. The below is a screenshot from Chrome. It tells exactly what went wrong. It makes trouble shooting much easier.

chrome_console

Big Bonus if you are using ASP.NET Web API

Web API presents a unique challenge that the “/Token” service is different from the normal Web API controllers and the nuget cors package only works for web API. Some people suggest adding the below in web.config. It will work for “/Token” service but NOT web api especially when you are using https. The chrome browser does not allow “*” in Access-Control-Allow-Origin.

<add name=”Access-Control-Allow-Origin” value=”*” />

The solution is adding the below code at the top in IdentityConfig.cs.

if (string.Equals(context.Request.Uri.PathAndQuery, “/Token”, StringComparison.OrdinalIgnoreCase))
{
context.Response.Headers.Add(“Access-Control-Allow-Origin”, new[] { “http://foobar.com” });
}

 

 

TF401189: The source branch has been modified since the last merge attempt

If you are using Visual Studio Online and setup your project using TFS doing a code review is straightforward in visual studio.

However ff you are using Visual Studio Online and setup your project Git you might wonder how you can conduct a code review. You may do a quick search and then try ‘new pull request’ . You might get a weird error message you don’t understand.

TF401189: The source branch has been modified since the last merge attempt

Then you do another search (bing or google) you won’t find anything useful.

After trial and error I found that the root cause is that I didn’t use a topic branch. It is that simple.

Two useful links as below

https://www.visualstudio.com/get-started/code/git/pullrequest
https://blogs.msdn.microsoft.com/visualstudioalm/2014/06/10/conduct-a-git-pull-request-on-visual-studio-online/ (unfortunately all the images are missing)

Debugging a weird process crash issue

I recently debugged a very interesting process crash issue. The code was running in the cloud so I could not just attach the debugger as easily as on my dev box. Besides using debugger should be the last option in my opinion. So I logged on to the machine. Well before that I had to go a through a process to get permission and get the environment ready for security/compliance reason. I observed that the process was recycling by using taskmgr. So I did the below things
1. Checked the logs. No exceptions. No errors. No logs related to the crash
2. Checked crash dump files. No files were there
3. Checked OS eventlog. No crash events. Normally for any process crash there is at least one event

I never saw a process crash like this. But I knew the related code which caused this. It was a background task kicked off by calling Task.Run(). I thought that there must be some unhandled exceptions but I checked the code. There was already a catch block which caught all exceptions. However it was still possible that the catch block might throw exception. So I put another catch all inside the catch block to make sure that no unhandled exception was thrown.

However it did not work. The process was still crashing. I asked around about how a process could crash since I was relatively new to the code base. I got some pointers but none of them could match what I observed.

Then I had to turn to the last option. I copied windbg to all the nodes (remember that this is distributed system and there are multiple replicas) and hooked it up with the process. Boom! I got an exception in the debugger and then the process crashed.

I looked at the exception which was a normal .net exception. I could not think of a reason how it could cause crash. Then I looked into the call stack and saw the below line.
000007f9`8538bb27 : 0000001b`9c29cf80 0000001c`2c50c880 0000001c`2c50c888 0000001c`2c50c890 : mscorlib_ni!System.Environment.Exit(Int32)+0x7b

That was really weird. My code was calling a library from another team. So I got the tool ILSpy (I don’t use .net reflector anymore btw) and looked into the code. Man the code was calling Environment.Exit() when a certain exception threw! That explained everything. As for why the coding was doing so this was a new library and I guess that the piece of code was copied from somewhere else.

From the above text it looked that it didn’t take much time. In reality two days passed.

StackOverflow Exception, Long time no see

I have not seen a stackoverflow exception for a long time. Today I happened to bump into one in random test code. I will explain how it happened. What the code is used for and why it was written this way are not interesting to me and are not in the scope of this post.

    public class ChildClass : BaseClass
    {
        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                base.Dispose();
                //DO something
            }
        }
    }

    public class BaseClass
    {
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

        protected virtual void Dispose(bool disposing)
        {
            if (disposing)
            {
                //DO something
            }
        }
    }

As you can see the stackoverflow exception will happen as the below
1. Child.Dispose(bool)
2. Base.Dispose()
3. Child.Dispose(bool)
4. Base.Dispose()