企業価値の算出方法について (DCF法編)
「会社の価値は、いくらだろうか?」と問われた時、どのように計算するかご存知ですか。
Discounted cash flow analysis、Comparable company analysis、Comparable transaction analysisなどありますが、今回はDCFを紹介したいと思います。
いくつもステップと計算が必要なので、めんどうなことが嫌いな方は、読み飛ばしてください。
DCFはDiscount Cash Flowの略で、「割引キャッシュフロー法」とも言われます。DCF法は、将来事業が生み出す期待キャッシュフロー全体を割引率で割り引いて企業価値を算出する方法です。
- ステージ1: FCFの計算方法
フリーキャッシュフロー(FCF)とは、政府に税金を支払い、事業に必要な投資を行った後に債権者と株主に分配可能なキャッシュフローのことを指します。FCFを求めるのに、つぎの3つのステップが必要です。
サンプルを使って、実際にステップ毎に計算してみます。
ステップ1
純金利費用を純利益に追加します。このステップは、利払いからタックス・シールドを取り除くことが目的です。ここでは、税率が35%として計算してみます。
2017年の Unlevered net income = Net income + Net interest after tax
Net interest after tax = (Interest expense - Interest income) * (1 - tax rate)
つまり、 $2,296 + 642(1 - 0.35) = $2,713 = $2.713 million
ステップ2
NOPLAT(Net Operating Profit Less Adjusted Taxes)とは、みなし税引後営業利益のことです。営業利益という場合には税引前営業利益を指しているため、営業利益にかかる(みなし)税金控除後の値を使う際にはNOPLATを使用します。
理由は、キャッシュ・フローに影響を与える税務上の減価償却と財務報告目的の減価償却の差を考慮する必要があるからです。企業は、財務報告目的(減価償却費の減少による純利益の増加)よりも、税務目的で早期に有形固定資産の減価償却を報告しています。減価償却の相違は、異なる税額となります。キャッシュ・フローへの影響を計上するため、繰延税金の変動を未実現純利益に加算します。
よって、2017年のNOPLAT = Unlevered net income + Change in deffered taxes = $2,713 + (111 - 92) = $2,732 = $2.732 million
ステップ3
NOPLATは、減価償却費(有形固定資産)および償却費および減損額(無形固定資産)を含むNet Noncash Chargesを戻すように調整されます。
そして、フリー・キャッシュ・フローを見積もるために、運転資本および有形固定資産に対する必要または計画された投資の価値を差し引きます。これらは、正味運転資本および設備投資の変化としてそれぞれ計上されます。
よって、2017年のFCF = NOPLAT + NCC - Change in net working capital - Capex = $2,732 + 511 - 455 - 1461 = $1,367 = $1.367 million
2018年から2021年に対しても同様のステップを実行すると、次のような結果になります。ここでは、WACCを9.41%とします。今回は、WACCの計算方法は省略します。各企業のWACCは、インターネットで公開されているので、その数値を使っても同じです。
つまり、これらの値を使ってFCFの現在価値を求めることができます。スプレッドシートの =NPV(割引率,値 1,[値 2],...)関数を利用すると簡単に求めることができます。
例えば、=NPV(0.0941,B11:F11)のようにして求めることができます。
2017年から2021年のフリーキャッシュフローの現在価値は、$5.802 millionです。ここまでが、ファーストステージです。
- ステージ2:ターミナルバリュー(継続価値・残存価値)の計算方法
セカンドステージで、ターミナルバリュー(残存価値)を求めます。ターミナルバリューは、○年目から将来に渡って発生するキャッシュフローの合計です。将来の成長率(g)は不確かな数値ですが、だれも分からないので過去の成長率から今後も一定の成長があると見込みで値を決めます。
Terminal Value = FCF(1 + g) ÷ (WACC – g)
Terminal Value 2021 = $1,799(1 + 0.06)/(0.0941 - 0.06) = $55,922 = $55.922 million
ここで1点注意が必要です。この数字は、あくまで将来の値なので、現在価値に換算する必要があります。
つまり、Terminal Value 2016 = $55,922 / (1 + 0.0941)^5 = $35,670 = $35.67 million
または、別の方法でもターミナルバリューを計算することができます。
経験則からざっくりとフリーキャッシュフローの20倍をする方法です。
例えば、 Terminal Value 2021 = 20 * $1,799 = $35,980 = $36.0 million
そして最後に、フリーキャッシュフローの現在価値とターミナルバリューの現在価値を合わせて、企業価値を算出します。
つまり、$5.802 million + $35.67 million = $41.471 million となります。
予測に基づいて計算しているので、あくまで目安という位置付けですが、かなり具体的な参考値となるでしょう。
この数値を参考することによって、企業価値は$80 millionと言われた場合、ぼったくりと判断してもいいでしょう。逆に、$30 millionと言われた場合、お買い得と言えるでしょう。
2019年のトレンド予測 「デュアラー」を2018年7月からやってみた感想
毎年恒例となった、リクルートホールディングスの「2019年のトレンド予測」が発表されました。
住まい領域のトレンド予測は、「デュアラー」に決定したそうです。
デュアラーとは、都心と田舎の2つの生活=デュアルライフ(二拠点生活)を楽しむ人です。
かつて別荘を持つ富裕層やリタイア層がデュアルライフを実践する代表だったが、今では30~40代のファミリーなどに広がりを見せているそうです。
我が家の場合、妻と子どもが田舎に拠点を移しました。首都圏に勤務先と家があるので、自分は、週末やリモートワークをするとき田舎に行きます。
子どもの不登校がきっかけで、いろいろな学校で体験入学し、最終的に田舎にいい学校が見つかったというのが理由です。
デュアラーをして、よかった点と注意したい点を紹介します。
よかった点:
- 子どもが学校に登校するようになった
- 子どもの友達が気軽に遊びに来るようになった(都会と違ってアポなし)
- 温泉に週2、3回行けるようになった
- スキー場が近いので平日にスキーができる(まだ、スキー場がオープンしていないので不明)
- 自然の中で犬の散歩ができる
- 気分転換ができる
- 視野が広がる
- 田舎と都会のコミュニティーに参加できる
注意したい点:
- 田舎は一人一台車が必要なので、車の維持費が2倍になる
- ガソリン代、高速代もアップ
- 寒冷地なので、暖房費がアップ
- ネット環境を都会と田舎の両方同時に維持するため通信費のアップ
- 生活家電の一式が田舎にも必要なため、初期投資が必要
- 買い物が不便
- 病院が遠い(健康であれば問題なし)
ざっくりと計算すると我が家の場合、デュアラーをするには都会だけの生活費と比べて1.7倍ぐらい必要となってきます。
ただし、工夫次第で、トータルコストは今後下げることが可能かと思います。
Fedora 29でのDocker CEインストールについて
以前Fedora 27でのDocker CEインストールについて紹介しましたが、Fedora29ではstableなレポジトリがまだ存在しなく、同じ手順ではインストールできません。
そこで、とりあえず現時点での回避策をご紹介します。
$ sudo curl -fsSL get.docker.com | CHANNEL=test sh # Executing docker install script, commit: 4957679 + sh -c 'dnf install -y -q dnf-plugins-core' + sh -c 'dnf config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo' repo の追加: https://download.docker.com/linux/fedora/docker-ce.repo + '[' test '!=' stable ']' + sh -c 'dnf config-manager --set-disabled docker-ce-*' + sh -c 'dnf config-manager --set-enabled docker-ce-test' + sh -c 'dnf makecache' ... + sh -c 'dnf install -y -q docker-ce' ... $ sudo systemctl start docker $ sudo docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world d1725b59e92d: Pull complete Digest: sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788 Status: Downloaded newer image for hello-world:latest Hello from Docker! ...
crashコマンドの使い方(file_systems編)
以前super_blockからNFS情報を取得する方法を書きました。
Linuxではさまざまな種類のファイルシステムを扱うことができ、それぞれのオブジェクトが必要となります。このオブジェクトがfile_system_typeという構造体であり、file_systemsというグローバル変数です。
そこで今回は、file_systemsからどんな情報が取れるかcrashコマンドを使って説明したいと思います。
初めに、file_systemsから、file_system_typeの一覧を表示してみます。手順は、listコマンドを使ってfile_system_type.nextを順番に辿っていきます。
crash> p file_systems file_systems = $1 = (struct file_system_type *) 0xffffffff819f95c0 <sysfs_fs_type> crash> struct -o file_system_type struct file_system_type { [0x0] const char *name; [0x8] int fs_flags; struct dentry *(*mount)(struct file_system_type *, int, const char *, void *); [0x18] void (*kill_sb)(struct super_block *); [0x20] struct module *owner; [0x28] struct file_system_type *next; ... crash> list file_system_type.next 0xffffffff819f95c0 -s file_system_type.name ffffffff819f95c0 name = 0xffffffff818b3596 "sysfs" ffffffff819fa000 name = 0xffffffff81897bf5 "rootfs" ... name = 0xffffffffa026a1c4 "xfs" ffffffffa0331b80 name = 0xffffffffa0328be0 "rpc_pipefs" ffffffffa03839c0 name = 0xffffffffa037fae0 "nfsd" ffffffffa05ea1e0 name = 0xffffffffa05e4e47 "nfs" ffffffffa05ea160 name = 0xffffffffa05e4e42 "nfs4" crash>
ここでは、nfs4を例にして、file_system_typeの値を表示してみます。
crash> file_system_type 0xffffffffa05ea160 struct file_system_type { name = 0xffffffffa05e4e42 "nfs4", fs_flags = 0x8002, mount = 0xffffffffa05ce030 <nfs_fs_mount>, kill_sb = 0xffffffffa05cd870 <nfs_kill_super>, owner = 0xffffffffa05edbe0 <__this_module>, next = 0x0, fs_supers = { first = 0xffff880035a83138 }, ... }
file_system_typeの構造体を確認すると、fs_supersは次のように定義されています。
include/linux/fs.h: ... struct file_system_type { const char *name; int fs_flags; ... struct dentry *(*mount) (struct file_system_type *, int, const char *, void *); void (*kill_sb) (struct super_block *); struct module *owner; struct file_system_type * next; struct hlist_head fs_supers;
また、hlist_headが何かを確認し、hlist_nodeの値も取得してみます。
crash> whatis hlist_head struct hlist_head { struct hlist_node *first; } SIZE: 0x8 crash> whatis hlist_node struct hlist_node { struct hlist_node *next; struct hlist_node **pprev; } SIZE: 0x10 crash> hlist_node 0xffff880035a83138 struct hlist_node { next = 0x0, pprev = 0xffffffffa05ea190 <nfs4_fs_type+48> }
このfs_supersは、super_blockのs_instancesに登録されているので、super_blockを参照しても確認できます。
fs/super.c: ... struct super_block *sget(struct file_system_type *type, int (*test)(struct super_block *,void *), int (*set)(struct super_block *,void *), int flags, void *data) { struct super_block *s = NULL; ... s->s_type = type; strlcpy(s->s_id, type->name, sizeof(s->s_id)); list_add_tail(&s->s_list, &super_blocks); hlist_add_head(&s->s_instances, &type->fs_supers);
では、マウントされている状況で確認してみます。
crash> mount MOUNT SUPERBLK TYPE DEVNAME DIRNAME ffff88007d12e100 ffff88007c771000 rootfs rootfs / ffff88007ac57700 ffff88007c220800 sysfs sysfs /sys ... ffff88007b817200 ffff880035a83000 nfs4 192.168.122.135:/tmp /mnt crash> crash> super_block ffff880035a83000 struct super_block { s_list = { next = 0xffffffff819ea610 <super_blocks>, prev = 0xffff8800799d1000 }, ... s_mtd = 0x0, s_instances = { next = 0x0, pprev = 0xffffffffa05ea190 },
file_system_typeのfs_supersでもsuper_blockのs_instancesでも「0xffffffffa05ea190」が確認できたので、繋がりがあることがわかります。
図にすると、このような関係性になります。
PayPay 「403 Forbidden」エラー
いま話題の新しいスマホ決済サービス「PayPay(ペイペイ)」です。ソフトバンクグループのもと、「100億円あげちゃうキャンペーン」として、PayPayで支払ったら20%を還元するみたいです。
早速YahooIDで新規登録しようとしたら、エラーに遭遇しました。
この問題は、Chromeアプリを無効にすることで回避できました。
手順は、次のとおりです。
- 『設定』→『アプリと通知』→『アプリ』と進んでアプリ一覧より『Chrome』のページを開きます。そして『無効にする』をタップします。
- 「(Chrome)このアプリを出荷時の状態に戻しますか? データがすべて削除されます。」と警告がでるので、ここは「キャンセル」します。
- あとは、PayPayアプリから普通に登録ができます。
- 最後に、Chromeを有効に戻しておきます。
無事登録が完了すると、自動的に500円がチャージされました。
NFSとsuper_blockについて(Apple ペンシルで描いた図解)
前回さらっとsuper_blockからnfsの情報を取得する方法を記述しました。
もしかしたら、「え???」と思う方がいるかもしれないので、
図を使って説明したいと思います。 せっかくApple ペンシルを買ったので、練習したいというのが、ホントの理由です。
まずは、ざっくり3つの領域を説明したいと思います。
1. ユーザー空間
アプリケーション(OS上で動作するソフトウェア)が使用するメモリ領域
3. ハードウェア
ハードディスクなど
図にするとこのような感じになります。
ここでポイントとなるのは、VFSとNFSの関係性です。Virtual FileSystem(VFS)は、ファイルシステム(Ext4やNFSなど)の上位に位置する抽象化層です。なぜ抽象化するかといえば、ファイルシステムの違いを意識することなくアクセスが可能になるからです。
VFSを構成する主な4つのオブジェクトがこちらです。
- superblock: マウントされたファイルシステムに関する情報
- inode: ファイルに関する情報
- file: プロセスによってオープンされたファイルに関する情報
- dentry: ディレクトリエントリ(パス)に関する情報
マウントされたローカルファイルシステムに対する情報は、super_blockに登録されています。では、早速super_blockのデータ構造を見ていきましょう。
include/linux/fs.h ... struct super_block { struct list_head s_list; /* Keep this first */ dev_t s_dev; /* search index; _not_ kdev_t */ unsigned char s_blocksize_bits; unsigned long s_blocksize; loff_t s_maxbytes; /* Max file size */ struct file_system_type *s_type; const struct super_operations *s_op; const struct dquot_operations *dq_op; ...
s_typeをチェックして、ファイルシステムがNFSかどうか確認できます。例えば、グローバル変数のsuper_blocksのリンクリストからnfsのsuper_blockを探すこともできます。
crash> cat ~/macro/print-sb define print-superblocks set $n = super_blocks.next while ($n != &super_blocks) set $off = (unsigned long)&((struct super_block *)0)->s_list set $s = (struct super_block *)((unsigned long)$n - (unsigned long)$off) if ($s->s_type == &nfs_fs_type) printf "(struct super_block *) %p, type=nfs_fs_type\n", $s end if ($s->s_type == &nfs4_fs_type) printf "(struct super_block *) %p, type=nfs4_fs_type\n", $s end set $n = $n->next end end crash> source ~/macro/print-sb Redefine command "print-superblocks"? (y or n) [answered Y; input not from terminal] crash> print-superblocks (struct super_block *) 0xffff880035a83000, type=nfs4_fs_type
また、super_blockのメンバーのs_fs_infoにファイルシステムのプライベート情報が登録されます。NFSのサーバやクライアントの情報は、こちらで登録されます。
fs/nfs/super.c: ... static int nfs_compare_mount_options(const struct super_block *s, const struct nfs_server *b, int flags) { const struct nfs_server *a = s->s_fs_info; const struct rpc_clnt *clnt_a = a->client; const struct rpc_clnt *clnt_b = b->client; ...
この辺りの関係性が理解できると、vmcoreのsuper_blockからnfsの情報を取得することができます。