企業価値の算出方法について (DCF法編)

「会社の価値は、いくらだろうか?」と問われた時、どのように計算するかご存知ですか。

Discounted cash flow analysis、Comparable company analysis、Comparable transaction analysisなどありますが、今回はDCFを紹介したいと思います。
いくつもステップと計算が必要なので、めんどうなことが嫌いな方は、読み飛ばしてください。

DCFはDiscount Cash Flowの略で、「割引キャッシュフロー法」とも言われます。DCF法は、将来事業が生み出す期待キャッシュフロー全体を割引率で割り引いて企業価値を算出する方法です。

  • ステージ1: FCFの計算方法

フリーキャッシュフロー(FCF)とは、政府に税金を支払い、事業に必要な投資を行った後に債権者と株主に分配可能なキャッシュフローのことを指します。FCFを求めるのに、つぎの3つのステップが必要です。
f:id:shinji629:20181217164806p:plain

サンプルを使って、実際にステップ毎に計算してみます。
f:id:shinji629:20181218150752p:plain

ステップ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は、インターネットで公開されているので、その数値を使っても同じです。
f:id:shinji629:20181218175743p:plain
つまり、これらの値を使って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!
... 

美文字判定

Appleペンシルできれいにメモをとりたい思っていますが、現実はなかなか難しいです。ペンの性能は、素晴らしいですが、元々字が下手なので、当然Appleペンシルを使っても下手です。
そこで、飽きずに少しでも文字が上達するアプリを探してみました。
今回試したアプリが「美文字判定」です。
初めに、真っ白の用紙のなかに、ひらがな1文字を書き、あとで点数判定と、ポイントを表示してくれます。
f:id:shinji629:20181213150546p:plain
何度か練習すると確実に上達できるような錯覚に陥ります。
f:id:shinji629:20181213150916p:plain
もしかしたら、練習を重ねれば、ペン字が上達するかもしれません。長い間、手書きをしてこなかったので、改めて手書きの良さを再認識しました。

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」が確認できたので、繋がりがあることがわかります。
図にすると、このような関係性になります。
f:id:shinji629:20181213143352p:plain

PayPay 「403 Forbidden」エラー

いま話題の新しいスマホ決済サービス「PayPay(ペイペイ)」です。ソフトバンクグループのもと、「100億円あげちゃうキャンペーン」として、PayPayで支払ったら20%を還元するみたいです。
早速YahooIDで新規登録しようとしたら、エラーに遭遇しました。
f:id:shinji629:20181211115930j:plain

この問題は、Chromeアプリを無効にすることで回避できました。
手順は、次のとおりです。

  1. 『設定』→『アプリと通知』→『アプリ』と進んでアプリ一覧より『Chrome』のページを開きます。そして『無効にする』をタップします。
  2. 「(Chrome)このアプリを出荷時の状態に戻しますか? データがすべて削除されます。」と警告がでるので、ここは「キャンセル」します。
  3. あとは、PayPayアプリから普通に登録ができます。
  4. 最後に、Chromeを有効に戻しておきます。

無事登録が完了すると、自動的に500円がチャージされました。
f:id:shinji629:20181211121709j:plain

NFSとsuper_blockについて(Apple ペンシルで描いた図解)

前回さらっとsuper_blockからnfsの情報を取得する方法を記述しました。
もしかしたら、「え???」と思う方がいるかもしれないので、
図を使って説明したいと思います。 せっかくApple ペンシルを買ったので、練習したいというのが、ホントの理由です。

まずは、ざっくり3つの領域を説明したいと思います。
1. ユーザー空間
アプリケーション(OS上で動作するソフトウェア)が使用するメモリ領域

2. カーネル空間
カーネルが使用するメモリ領域

3. ハードウェア
ハードディスクなど

図にするとこのような感じになります。
f:id:shinji629:20181210113816j:plain
ここでポイントとなるのは、VFSNFSの関係性です。Virtual FileSystem(VFS)は、ファイルシステムExt4NFSなど)の上位に位置する抽象化層です。なぜ抽象化するかといえば、ファイルシステムの違いを意識することなくアクセスが可能になるからです。

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の情報を取得することができます。