净现值(NPV), 内部收益率(IRR)及利用其评估P2P、花呗/白条、信用卡免息期等收益

净现值(NPV), 内部收益率(IRR)及利用其评估P2P、花呗/白条、信用卡免息期等收益

简单研究了下基本的关于货币投资收益计算的一些知识,整理了这篇文章出来。

基本知识

货币的时间价值(Time Value Of Money,TVM)

现在的钱比未来的钱更有价值,因为你可以用钱去投资赚取更多的钱。(除了投资,通货膨胀也会产生影响,但这里暂不考虑)

例如,假设一年的投资收益率是10%。现在的 ¥1000 一年后可以得到 1000 * 1.1 = ¥1100。现在的 ¥1000 等于一年后的 ¥1100。

现值 (Present Value, PV)

考虑货币的时间价值后的(预期的)未来货币现金的当前价值。

在上面的例子中,一年后的 ¥1100 其现值就是 ¥1000。

净现值 (Next Present Value, NPV)

考虑流出的钱(投资或支出)后的投资价值,越大越好。

用例子说明:(来源 http://www.shuxuele.com/money/net-present-value.html)

<code>一个朋友问你借 ¥500,一年后会还你 ¥570。
如果你的钱(在其他地方投资)可以得到 10% 年利息,借钱给他划算吗?

本投资的现金流:
现在:-500 (投资支出)
一年后:570 (投资收回)

PV = 570 / (1+0.10) ** 1 = 518.18

净现值 = 518.18 - 500.00 = 18.18

所以,当利率是 10% 时,这个投资的价值是 ¥18.18
(就是说,这个投资比得到 10% 的利息好。)

但如果在其它地方投资的年利息是 15%,则计算出的净值是¥−4.35,
此时这个投资就变得不划算了。
</code>

符号说明:

<code>** 表示指数运算符,右结合,优先级高于其它四则运算符。

比如 2 ** 3 = 8,3 ** 2 = 9

为什么用这个运算符而不用「^」?因为在 javascript 和一些其他语言里,
** 就是标准的指数运算符,用它写的表达式可以直接放到 console / node 里算。
</code>

如何计算 NPV ?最简单的方法:用 Excel 公式 NPV(rate, …values)

内部收益率 (Internal rate of return, IRR)

评估投资收益的方式。当使用内部收益率计算投资的净现值时,结果恰好等于0。

计算内部收益率没有直接的公式,”猜测和检查” 是最常见的求净现值的方法,即已知一个投资的(预期)全程现金流,先假设一个 IRR 值,用其来计算该投资的 NPV,如果结果 > 0,则减小假设的 IRR 值后再次计算(反之亦然),直到找到的 IRR 值计算出来的 NPV 非常接近 0.

例子:(from http://www.shuxuele.com/money/internal-rate-return.html)

<code>今天投资 ¥2000,以后3年每年收到 ¥100,第三年另外再得到 ¥2500。

这个投资的现金流:
现在: -2000
1年后: 100
2年后: 100
3年后: 100 + 2500

通过尝试-比较,当使用 12.4% 利率时,计算出来的净现值接近 0,
则这笔投资的内部收益率(以年为单位)就是 12.4%。

计算过程:
现在:PV = −¥2,000
1年:PV = ¥100 / 1.124 = ¥88.97
2年:PV = ¥100 / 1.124**2 = ¥79.15
3年:PV = ¥100 / 1.124**3 = ¥70.42
3年(终极收付):PV = ¥2,500 / 1.124**3 = ¥1760.52

加起来:净现值 = −2000 + 88.97 + 79.15 + 70.42 + 1760.52 = −0.94
</code>

实际利率与名义利率

(以下表述非专业术语,专业术语称利率为“贴现率”)

投资的实际利率 != 名义利率,而是与投资期限相关。对于同样的名义利率,期限越短,实际利率越高。

考虑到通常利率以“年”为单位标识,以下叙述都使用“实际年利率”和“名义年利率”来说明。

例如:

<code>如果一个投资的名义年利率是 10% (0.1),期限半年。
则考虑复投,投资1元,1年后能拿到:
(1+ 0.1/2)**2 = 1.1025
则这个投资的实际年利率是 10.25% (0.1025)。
</code>

“实际年利率”是评估某个投资实际收益率的标准,其含义为该笔投资等效于“一年期定期存款”时的存款年利率,专业术语称为“复合年化收益率”(或简称“年化利率”),以下使用这个术语。

参考: http://blog.sina.com.cn/s/blog_51a238b401008w0x.html

<code>设 P0 为年初之初值(其同时亦为该年首季度和首月之初值),
P为年末之终值,I年度、 I季度 、I月度 分别为年度、季度、月度贴现率

则 P= P0 *(1+ I年度)= P0 *(1+ I季度)**4= P0 *(1+ I月度)** 12

于是,I年度 =(1+ I季度)**4 – 1 =(1+ I月度)**12 – 1

可见  I年度 ≠ 4 * I季度 ≠ 12 * I月度 。
</code>

一般的,对于一个期限为 m 月,名义年利率为 x 的(到期还本付息还款方式)投资,其复合年化收益率(实际年利率) y 公式为:

<code>y = (1 + x/(12/m)) ** (12/ m) - 1
</code>

以上的计算过程都是针对还款方式为“到期一次性还本付息”类型的投资而言的。

而对于分期回款的投资(比如“等额本息”还款方式),要计算复合年化收益率,需要先从(预期)现金流计算 IRR 。

计算 IRR 可以用 Excel 公式 IRR(…values)

对于 IRR 计算而言,需要选择一个(名义利率)期限作为利率计算标准。例如:

<code>如果投资是最初一次性支出,然后固定间隔期限分期回款,
用 Excel 的 IRR 公式计算出来的是以"每期间隔"(设其为 b 月)为单位的利率,
假设计算结果为 a, 则复合年化收益率 y = (1 + a)**(12/b) - 1

例如: 投资10000元半年期年利率10%定期存款:(金额不能太小否则计算误差大)
A1: -10000
A2: 10500
=irr(a1:a2) // 5% (0.05)
则复合年化收益率 = (1 + 0.05)**(12/6) - 1 = 10.25%
</code>

因此,对于“等额本息”还款方式的投资,可以直接用上面所述的 Excel 的 IRR 公式根据每月回款额来计算复合年化收益率(或许也可以直接推导?但我不会):

<code>假设放贷 1000000 (100万)元,期限 2 年,年利率 10%,
等额本息还款方式每月回款。
则每月回款 46144.92 元(计算过程略,有公式,也可以找个贷款计算器算)

Excel:
-1000000 // a1
46144.92 // a2
46144.92
....
46144.92 // a25
=irr(a1:25) // 0.00833322
复合年化收益率: (1 + 0.00833322)**12 - 1 = 0.10471157744905524 (10.47%)
(注意这里不能用 0.00833322 * 12 来算,会低估实际值)

如果其它条件相同,把贷款期限变成只有6个月(每月回款 171561.39)。
则计算结果 irr = 0.00833326
复合年化收益率:(1 + 0.00833326)**12 - 1
= 0.10471210332845904 (10.47%)
结果比之前略高(虽然差距很小)
</code>

可以看到,和“一次性还本付息”还款方式的投资相同,对于”等额本息“还款方式的投资而言,相同利率下也是投资期限越短,最终的实际复合年化收益率就越高。(但对“等额本息”这种还款方式的投资,期限不同导致的实际收益率差距不明显)

可以合理推断,对于“等额本息”还款类型的贷款(放贷),当期限很长时,其实际复合年化收益率趋近其标称年利率。

“等额本金”还款方式的投资其计算结果应该与“等额本息”的一致。

知识应用

以下用上面的知识来分析生活中一些常见投资、消费场景的实际收益。

拍拍贷赔标实际投资收益率

根据之前的“等额本息”的月IRR计算方法来推导拍拍贷散标实际收益率(复合年化收益率):

(所有均以等额本息放贷100万,月回款舍入到分计算得出)

标称年利率9.5%,期限3个月的赔标(9.5%-3月陪):
月 irr = 0.007916661
复合年化收益率:0.09924750991929043 (9.92%)

10%-6月赔:
月 irr =0.00833326
复合年化收益率:0.10471210332845904 (10.47%)

11%-12月赔:
月 irr = 0.009166651
复合年化收益率:0.11571862834537927 (11.57%)

12%-18月赔:
月 irr = 0.009999986
复合年化收益率:0.12682484269970118 (12.68%)

12%-36月赔:
月 irr = 0.009999983
复合年化收益率: 0.1268248025356471 (12.68%)

(所以36月的12赔也不算太坑爹?)

(以前的)13%-12月赔:
月 irr = 0.010833323
复合年化收益率:0.1380323420102305 (13.8%)
算上提前还款的实际收益肯定超过14%,大平台中仅此一家,可惜现在降息了。

信用卡

消费

因为信用卡存在免息期,在消费日和还款日之间存在一段时间,相当于用“未来”的钱来消费买了“现在”的东西,根据“现值”理论,未来的钱没有现在的钱值钱,所以这样做实际上相当于商品价格打了折。具体等效于打折了多少取决于你的投资收益率和免息期长短。

假设你的投资复合年化收益率12%,每月10日是信用卡账单日,28日是还款日(账单日当天消费计入下期账单)。

例:
1月10日:信用卡消费 10000 元。
2月28日:信用卡还款 10000 元。

<code>计算这次信用卡消费等效打折了多少:

这次消费的免息期为最长的 49 天。

由复合年化收益率 0.12 反推这49天的收益率为: 1.12 ** (49 / 365) - 1
= 0.015330309762151106 (1.533%)

所以2月28日的 10000 元的现值是:10000/(1 + 0.01533) = 9849.01
</code>

即相当于买东西打了 9.85 折。

如果你的投资复合年化收益率能达到 15%,则上面计算的结果会相当于 9.81 折。

上面的计算都是以“在最长免息期时消费”的前提下进行。消费日期距离(下个)账单日越近,则计算出的信用卡消费等效折扣越低。对于上面的例子,在最短免息期(每月9日,免息期19天)时消费,则只相当于9.94折(复合年化收益率按12%计算)。

结论:(不考虑积分和其他信用卡优惠)信用卡任何消费都相当于打了折,但折扣聊胜于无。

套现

假设在免息期为 m 日时套现任意金额,套现费率为 x,

则套现的费率等效复合年化收益率为(有轻微误差,因为套现手续费是在期初预先扣掉了):

<code>(1+x) ** (365/m)-1
</code>

例如,假设在免息期为 49 日时套现,套现费率为 0.5% (0.005), 则套现费率等效复合年化收益率为:

<code>(1 + 0.005) ** (365 / 49) -1
= 0.037850860687675514
= 3.78%
</code>

如果套现费率为 1%, 则计算结果等效复合年化收益率为 7.69%。

可见信用卡套现还是比较划算的,你套现的资金投资复合年化收益率只要比上面计算出来的结果高,那么套现就有利可图。

支付宝花呗 / 京东白条

免息分期

花呗账单日为每月1日,还款日为每月9日或10日。每月的消费计入消费日(对于淘宝:确认收货日)所在月的下个月的账单。所以在每月1日的消费(或淘宝确认收货)有最长的40天免息期,淘宝推荐每月19日以后下单,期间可以手动延长一次确认收货时间(3天),到下个月初确认收货,再下一个月才需要还款。

京东白条:新用户激活白条当天就是“专属账单日”,白条老用户的专属还款日则定在用户生日的当天。账单日9天之后就是还款日。最长免息期40天。

如果不考虑分期,这两货就和信用卡差不多。但是这两货最大的好处是经常淘宝/京东经常有一些3/6/12期免息分期的优惠活动。来计算下这种分期免息的等效优惠幅度:

为方便计算,假设 1月10日 在淘宝用花呗 6 期免息买了一个 10000 元东东。则 2月10日-7月10日每月需要还款 1666.66 元。(如果是1月1日买的,那么从消费到第1次还款的间隔不是30天,和后面的还款间隔不等,不能直接用下面的计算方式。)

<code>假设投资复合年化收益率为12%,则30天的收益率为: 1.12 ** (30 / 365) - 1
= 0.009358203165413581
(注意不能用 0.12 / 12 来算,原因之前解释过了)

用 Excel计算下净现值:
0.009358203165413581 //a1
1666.66 // a2
...
1666.66 //a7
=NPV(a1, a2:a7) // 9680.43
</code>

结果表明相当于打了9.68折。

如果是 12 期免息分期:结果相当于打了 9.42 折。

如果是 3 期免息分期,结果也相当于打了 9.82 折。

如果你的投资复合年化收益率能达到 15%,则3/6/12期免息分期分别相当于打折幅度:9.77,9.6,9.3。

结论:所以免息分期还是很不错的,就是记住只买真正需要的东东,别看到什么便宜的免息分期的都买,买回来一堆电子垃圾放那吃灰(就像我这样。。)

不免息分期

如果使用花呗/白条不免息分期,需要收取一定手续费,花呗12期分期手续费率一般是(商品总金额的)7.5%,平摊到每月按月收取。10000元的商品分12期每月需还款 895.83 元。

从淘宝的角度,这将相当于淘宝借了一笔钱给我们。来计算下淘宝方这笔放贷的内部收益率(IRR):

<code>-10000 // a1
895.83 // a2
...
895.83 // a13
=irr(a1:a13) // 0.011305

淘宝获得的(等效)复合年化收益率:(1 + 0.011305) ** 12 - 1
= 0.144421091883655 (14.44%)
</code>

(注:Excel 函数 XIRR(values, dates) 可以直接计算出一组现金流的复合年化收益率,但需要设置每个现金流事件时间。)

从我们的角度,可以计算下这些未来还款的净现值。只有当你你的投资年化复合收益率超过了 14.44%,最后计算出来的净现值结果才会 < 10000 元,这时的分期才是划算的。否则就肯定(与不分期直接付款相比)亏。

Android 双层代理配置 (shadowsocks + VPN)

在 Android 环境下使用双层代理,同时使用 shadowsocks 和其它VPN App:

手机 -> ss server -> VPN server -> Target

手机环境:
已 root
安装 shadowsocks-android 和任一其它 VPN App

配置:

1. 在终端(adb shell 或任一 terminal app)里以 root 用户执行命令修改路由:

ip rule add to <SS_SERVER_IP> lookup wlan0
ip rule add to <SS_SERVER_IP> lookup rmnet_data0

每次手机重新启动后都需要执行一次上面命令。

2. 将 Shadowsocks-Android 设为 NAT 模式;编辑 profile 文件,开启 per-app mode, 去掉 “bypass mode” 选项,app list 里只选中 VPN App。

3. 启动 shadowsocks 和 VPN 即可,VPN 需要工作在 tcp 模式。

How it works:

当 shadowsocks 配置为以上模式时(步骤2),只会拦截 VPN App 的 OUTPUT 流量 (以及 dns 解析请求) 并转发到本地 ss 端口。所以只有 VPN App 到 VPN Server 的流量会走 ss(VPN 的虚拟网卡流量是内核维护的,不属于 VPN App,所以不会被捕获),这样就实现了双层代理。

ivy_dsds:/ # iptables -t nat -vxnL OUTPUT
Chain OUTPUT (policy ACCEPT 11095 packets, 773246 bytes)
......
    1213    79262 DNAT       udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:53 to:127.0.0.1:1133
      33     1980 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            owner UID match 10124 to:127.0.0.1:8123

但是 VPN 启动后会修改路由表默认路由,所以必须保证到 ss server IP 的路由直连。这个只需要用 ip rule 添加一个自定义路由规则即可(步骤1)

広辞苑無料利用サイト

暇つぶしで「広辞苑無料検索」というサイトを作ってきました。「広辞苑」などの国語辞典をご利用・検索ことができます。辞典データの情報源はネットでダウンロードした「EPWING」形式の辞典ファイルです。サイトのすべての機能が無料です、お気軽にご利用してください。

サイトの入り口:広辞苑無料検索

現在ご利用できる辞典リスト:

  • 岩波書店·広辞苑第六版
  • 小学館·中日日中統合辞書第2版
  • 三省堂·スーパー大辞林
  • 三省堂·必携類語実用辞典
  • 三省堂·必携故事ことわざ・慣用句辞典

サイトの開発フレームワーク:React + Redux

ゴールデンアワー

Getchu, CG, Torrent & CG Torrent, 空間

LE 出错, 需要用 Ntlea 等转区软件运行

这作好棒.

まりか线我还以为是Bad End呢.

2017-08-12 All Clear.

True End 略郁闷, 要是来个类似”神様のゲーム”结局那种伏笔就好了.

PS. 夏未线那个「梅田千尋」好像也是和恶魔签订300天死亡契约的吧, True 线里完全没提…

PS. 好喜欢南浜よりこ的画风. 哦想起来「ヒマワリと恋の記憶」我以前推了一半就放哪里了, 找时间回头把它推完.

AbemaTV android app 简单破解去除区域限制

AbemaTV-無料インターネットテレビ局」是一个日本网络电视台「アベマTV」出的视频 App,里面不少节目和视频都是免费的。

但是我安装后发现这个 App 有区域限制,启动时全屏显示 “このサービスはお住まいの地域からはご利用になれません。”提示,无法继续。

简单地尝试下破解了这个 App 的区域限制。步骤如下:

1. 从 apkpure 下载 AbemaTV app 最新版的 apk

2. 用 apktool 这个工具解包下载的 apk. apktool 是一个 java 包,需要安装 Java 运行。

java -jar apktool_2.2.4.jar d “AbemaTV 無料インターネットテレビ局_v3.5.1_apkpure.com.apk”

3. 解包后的文件在当前目录下 “AbemaTV 無料インターネットテレビ局_v3.5.1_apkpure.com/” 文件夹。其中,res/ 是资源文件,smali/ 和 smali_classes2/ 是 java 源码编译后的 smali 文件。这个 app 好像没怎么加密什么的。

在整个目录里搜索 “このサービスはお住まいの地域からはご利用になれません。” 字符串,找到:

<string name=”error_abroad_description”>このサービスはお住まいの地域からはご利用になれません。</string>

搜索 error_abroad_description,找到:res/values/public.xml:
<public type=”string” name=”error_abroad_description” id=”0x7f0a0114″ />

搜索 0x7f0a0114,找到 smali_classes2\tv\abema\components\fragment\a.smali:

.class public Ltv/abema/components/fragment/a;
.super Ltv/abema/components/fragment/u;
.source “AbroadFragment.java”

const v1, 0x7f0a0114
invoke-virtual {v0, v1}, Landroid/widget/TextView;->setText(I)V

可以看到,这是一个 Fragment 类编译成的 smali 文件,当 app 检测到当前设备是日本以外区域(检测方法未知,可能是检测手机sim卡运营商信息)时就在当前 activity 上加载这个全屏 fragment 以阻止使用,所以最简单的破解方法就是把这个“创建并显示 Fragment”部分代码去掉。

搜索 “Ltv/abema/components/fragment/a”,找到:
smali\tv\abema\a\jk.smali

.line 202
const-class v0, Ltv/abema/components/fragment/a;
invoke-virtual {p0, v0}, Ltv/abema/a/jk;->I(Ljava/lang/Class;)V

看起来就是这里了,将这几行用 “#” 注释掉。

4. 最后,用 apktool 重新打包修改后文件生成 apk,参数就是之前解包apk文件所在目录

java -jar apktool_2.2.4.jar b “AbemaTV 無料インターネットテレビ局_v3.5.1_apkpure.com”

生成的 apk 在 AbemaTV 無料インターネットテレビ局_v3.5.1_apkpure.com/dist 文件夹下。

生成的 apk 是未签名的,无法直接安装。可以手工用 java bin目录下 keytool 工具生成密钥,jarsigner 工具给 apk 签名。(具体过程网上资料很多);也可以用直接用 apk-signer 这个图形化工具来进行

最后在手机上安装生成的 AbemaTV_v3.5.1_SIGNED_UNALIGNED.apk 即可,实测能够正常进入主界面并观看视频,搞定。

附上我自己生成的破解区域限制的 AbemaTV apk:

AbemaTV_v3.5.1_SIGNED_UNALIGNED.apk

Update

修改 app 包后无法使用 Google Play IAP 内购功能。最完美的破解 root 检测方法仍然是安装 XPosed + rootcloat

Update.2 (2017-08-08)

类似方法解除 Hulu 日本Android app的 root检测:

由错误提示“OSの整合性チェックに失敗しました。Root権限を取得している場合、起動できません。”跟踪找到某个Fragment:


const-string v2, “su”

invoke-virtual {v1, v2}, Ljava/lang/Runtime;->exec(Ljava/lang/String;)Ljava/lang/Process;
:try_end_0
.catch Ljava/io/IOException; {:try_start_0 .. :try_end_0} :catch_0
.catchall {:try_start_0 .. :try_end_0} :catchall_0

move-result-object v0

const v1, 0x7f0900e8

这里通过运行 su 检测是否有异常来判断机器是否已 root,所以最简单的移除方法就是把 “su” 随便改成个不存在对应命令的名字。

Hulu.jp_v1.0.11_apkpure.com_SIGNED_UNALIGNED.apk

Tweets Archive between 2017-05-22 and 2017-05-28

  • 几年前通过github免费领了2000个ripple山寨币就放那没管,今天一看这货对人民币汇率竟然涨到2.2了。。要不要卖掉呢。。。 17:08:01, 2017-05-22

Tweets Archive between 2017-05-15 and 2017-05-21

Tweets Archive between 2017-05-01 and 2017-05-07

Tweets Archive between 2017-04-24 and 2017-04-30

母になる

看了这部日剧前两集, 感觉就像吃了一堆屎一样难受. 特别是第二话那封信. 麻子役大嫌い!

话说我为什么要看这么虐的剧集? 我还是去推废萌 galgame 吧.