アメリカ株投資のススメ~というよりアメリカ以外投資先が見つからない~

はじめに

 現在、私の投資はアメリカ株のみです。
 日本株にも投資していましたが、唯一保有していた個別株の創通は2019年にバンダイナムコに買収され上場廃止。
 他にTOPIX連動型ETFを保有していましたが、2020年に全て売却しました。両方とも保有期間は10年以上、ETFについては購入時点で2020年には全て売却すると決めていました。創通についてはテンバガーを狙っていたのですが、目標の半分程度で強制退出させられてしまいました。
 10年以上前から日本株のピークは2020年以降数年間がいいところで、2025年からは衰退期に入ると考えていました。
 理由の根拠は人口構成です。
 調べてみると、日本は1990年代から人口オーナス期に入っているそうです。では、なぜ2020年以降の数年間がピークと考えたのでしょうか。
 それは、働き盛り年代(40代)の人口比率です。一番お金を使う世代の人口がその国の「経済力=株価」を決めるという説があり、私はそれを受け入れました。

日本




長期の日経平均株価と働き盛り人口(40代)のグラフです。
いわゆる昭和バブルのピークと40代前半の人口が連動しています。
現在は40代後半の人口と連動して上昇しているように見えます。
この仮説の通りとすると、日経平均は昭和バブルにちょっと届かずに下落するというシナリオが考えられます。
次に全世代の人口グラフです。



着実に減り続けています。

中国

世界で最も人口が多い中国はどうでしょうか。

2017年と2035年にピークがあります。2030年頃から2035年にかけてが中国のピークかもしれません。
全世代のグラフです。



中国も高齢化社会になります。

インド

将来は人口が中国を抜くインド。

ピークは2053年です。発展はこれからでしょうか。



今は綺麗な人口構成ですが、将来は高齢化・・・。

アメリカ

アメリカです。

今後20年近く働き盛りの人口が増えます。その後は高止まり。




綺麗ではないですが、他の国に比べるとましです。
人口が増え続けるのもポイント高いです。

まとめ

以上みてきた通りで、アメリカ以外は今後高齢化社会になり人口が減ります。
グラフはここに載せていませんが、アフリカは人口構成が綺麗です。しかし投資できないし、できたとしてもリスクが高く(信用度低)投資対象になりません。
数十年後、環境が整ってから投資を検討でも遅くないと思います。
同じく、グラフを乗せていませんが、ヨーロッパはすでに高齢化社会に突入しています。
ただ、世界人口は2100年になっても増加を続けるので投資対象には困らないかもしれません。

興味がありましたら私が作った以下のツールでグラフが確認できるので、良かったら見てください。
面白い国がありましたら教えていただけると嬉しいです。
https://www.fukakuutsukushikiasia.com/population-graph/age
https://www.fukakuutsukushikiasia.com/population-graph/year

銘柄分析 – Apple(AAPL)

はじめに

私はぼったくりサービスが好きではありません。
しかし、投資対象としてはぼったくり企業が大好きです。
今回は、サービスは利用していないけれど、株は保有しているという銘柄、アップルを分析してみようと思います。
※画像が見ずらい場合は「画像右クリック→新しいタブで画像を開く」で画像を別画面で開いてみてください。

バランスシート



意外なことにバランスシートが年々減少しています。
株主資本比率もバランスシートの減少率以上に減っています。ROEを高める狙いでしょうか。
また、赤字でもないのに株主資本が減っているということは自社株買いを毎年行っているということです。
日本のインチキ自社株買いと違って、ちゃんと消却するところが良いですね。ちなみにほとんどの日本企業の自社株買いは消却しないので、株主にとってもなんのメリットもありません。

損益計算書


売り上げも利益も減ってもいないし、増えてもいないです。
ただ、バランスシートは減少しているため、投資資本に対する利益率は上がっているはずです。後でこの辺りを見ます。

キャッシュフロー



稼いだお金(営業CFプラス)をバランスシート縮小のために使っている(財務CFマイナス)ように見受けられます。投資にはあまり積極的ではないようで、過去のアップルのように新しい何かを産み出すことへの情熱は無くなってしまったんでしょうかね。

各種指標


はい。来ましたコレ。ROEがトンデモない数値です。こんなの初めて見ました。なんと87%!!
過去(20年ほど前)に日本株を分析していた時は、良くて8%だったので、いかに凄いかです。
2020年はPERなどの指標が約2倍に跳ね上がっています。前年に比べ利益はさほど変化なかったので、株価だけが上がったと判断できます。株価については後で見ます。

割安度判定



成長度15%で割安度を算出してみました。営業CFの成長率を見てそのくらいが妥当かと判断しました。
2017~2019年は割安でしたが、現在は想定よりも6割以上割高です。
去年までは割安だったのですが、株価が2倍に跳ね上がり一気に割高になってしまいました。
他の株をいくつか見ましたが、みなこんな感じです。つまり、現在は市場がかなり楽観的と判断できます。
何かのキッカケでセンチメントが逆に働くと、株価は半額くらいまで落ちることもあるかもしれません。
長年投資をしていると、予想もしていなかったようなことが起こります。極端な予想ですが、市場が超悲観的になり期待成長率0%がフェアバリューと判断されたと仮定すると、現在の株価は8割下がります。

総評

事前に予想していたのと異なり、アップルは成長企業ではなく、成熟企業という印象を受けました。
ただ、まだブランドイメージは高いので、iPhoneのような製品がでてくると爆発的な成長をするかもしれません。
株主資本比率が低いのが気になりますが、安定した企業と判断できると思います。
今は市場が楽観ムードなので、アップルに限らず株は割高感があります。このままどんどん上がるかもしれませんが、その時は追加投資は諦めます。
市場のセンチメントが逆転し、3割程度下がったあたりから追加投資を考え始めようと思ってます。

Python – DataFrameを表示する際、行と列を省略させない方法

始めに

デバッグ時にDataFrameをPrintで確認することが多いのですが、デフォルトでは行と列が省略されてしまいます。
特に列が省略されてしまうのは不便です。
毎回検索するのですが、無制限についてはパッと出てこないので備忘録として記事にします。

ソース

import pandas as pd
# None=無制限
pd.set_option('display.max_columns', None)
pd.set_option('display.max_rows', None)

参考

https://pandas.pydata.org/pandas-docs/stable/user_guide/options.html
display.max_columns / display.max_rows : ‘None’ value means unlimited.

Golang : 動的なjsonを扱う方法

はじめに

JavaScriptphpなどの型のゆるい言語を使い慣れると、Goのオブジェクトの扱い方に戸惑います。たまにGoを使うのですが、そのたびにはまるので、備忘録として当記事を残します。

サンプルコード

  • 扱うjson
{
    "count": 2,
    "hits": [
        {
            "code": "123-4567",
            "address": "XXX県YYY市ZZZ町"
        },
        {
            "code": "987-6543",
            "address": "aaa県bbb市ccc町"
        }
    ]
}
  • json → interface{}
package main

import (
    "encoding/json"
    "log"
)

func main() {
    var jsonBlob = []byte(`{
        "count": 2,
        "hits": [{"code": "123-4567", "address": "XXX県YYY市ZZZ町"}, {"code":"987-6543", "address":"aaa県bbb市ccc町"}]
    }`)
    var data interface{}
    err := json.Unmarshal(jsonBlob, &data)
    if err != nil {
        log.Panic(err)
    }
    log.Printf("%#v", data)
    //→ map[string]interface {}{"count":2, "hits":[]interface {}{map[string]interface {}{"address":"XXX県YYY市ZZZ町", "code":"123-4567"}, map[string]interface {}{"address":"aaa県bbb市ccc町", "code":"987-6543"}}}

    log.Println(data.(map[string]interface{})["count"].(float64))
    log.Println(data.(map[string]interface{})["hits"].([]interface{})[0].(map[string]interface{})["address"].(string))
    log.Println(data.(map[string]interface{})["hits"].([]interface{})[1].(map[string]interface{})["address"].(string))
    // → 2
    //    XXX県YYY市ZZZ町
    //    aaa県bbb市ccc町
}
  • map → json
package main

import (
    "encoding/json"
    "log"
)

func main() {
    var hits []map[string]interface{}
    hit := map[string]interface{}{"code": "123-4567", "address": "XXX県YYY市ZZZ町"}
    hits = append(hits, hit)
    hit = map[string]interface{}{"code":"987-6543", "address":"aaa県bbb市ccc町"}
    hits = append(hits, hit)

    var data map[string]interface{}
    count := 2
    data = map[string]interface{}{"count": count, "hits": hits}

    log.Printf("%#v", data)
    // → map[string]interface {}{"count":2, "hits":[]map[string]interface {}{map[string]interface {}{"address":"XXX県YYY市ZZZ町", "code":"123-4567"}, map[string]interface {}{"address":"aaa県bbb市ccc町", "code":"987-6543"}}}
    bytes, err := json.Marshal(&data)
    if err != nil {
        log.Panic(err)
    }
    log.Println(string(bytes))
    // → {"count":2,"hits":[{"address":"XXX県YYY市ZZZ町","code":"123-4567"},{"address":"aaa県bbb市ccc町","code":"987-6543"}]}
}

参考

https://www.kaoriya.net/blog/2016/06/25/

JavaScript – スニペット:一番単純なAjaxのGETリクエスト

はじめに

JavaScriptからWebAPIを呼び出す機会が増えました。
いつも同じようなことを調べるので、個人的な備忘録として記録しておきます。

JvaScript-Ajaxスニペット

const url = "https://xxx/yyy";
let response = await fetch(url);
if (response.ok) {
  let json = await response.json();
  console.log(json);
} else {
  console.log("NG");
}

※WebAPIサーバはCORS対応されていることが前提です。

サンプルソース

<html>

<script>
  async function ajaxTest() {
    const url = "https://api.github.com/users/<githubユーザID>";
    let response = await fetch(url);
    console.log(response);
    if (response.ok) {
      const json = await response.json();
      document.getElementById("jsonStr").innerText = JSON.stringify(json);
    } else {
      console.log("NG");
    }
  }
  ajaxTest();
</script>

<body>
  <div id="jsonStr"></div>
</body>

</html>

参考

https://ja.javascript.info/fetch

p5.jsをWebページの背景にする

p5.jsをwebの背景にする方法

サンプル

クリックすると円を描きます

やり方

JavaScript

function setup() {
  let canvas = createCanvas(300, 300);
  // canvasの位置を指定
  canvas.position(0, 0);
  // canvasを背面に移動
  canvas.style('z-index','-1');
・・・
}

ソース

sketch.js

'use strict';

let obj = [];

function setup() {
  let canvas = createCanvas(300, 300);
  // canvasの位置を指定
  canvas.position(0, 0);
  // canvasを背面に移動
  canvas.style('z-index','-1');
  background(0);
  noFill();
  strokeWeight(5);
  colorMode(HSB);
}

function draw() {
  background(0);
  for(let i = 0; i < obj.length; i++) {
    obj[i].draw();
    if(obj[i].size > width * 2.5) {
      obj.splice(i, 1);
    }
  }
}

function mouseClicked() {
  obj.push(new Shape(mouseX, mouseY));
}

class Shape {
  x;
  y;
  size;
  color;
  speed;

  constructor(x, y) {
    this.x = x;
    this.y = y;
    this.size = 10;
    this.color = color(random(0,360), 100, 100);
    this.speed = parseInt(random(1, 10));
  }

  draw() {
    stroke(this.color);
    ellipse(this.x, this.y, this.size, this.size);
    this.size += this.speed;
  }
}

main.html

<html lang="ja">
<head>
  <meta charset="utf-8" />
  <title>p5.jsを背景にする</title>
  <meta name="viewport" content="width=device-width,initial-scale=1">
  <script src="../../../../lib/p5.js"></script>
  <script src="./sketch.js"></script>
</head>
<body>
  <button onclick="alert('ボタンクリック');">ボタンサンプル</button>
  <input type='test' value='あいうえお'/>
</body>
</html>

参考

https://freyjasrm.com/2020/01/06/%E3%82%A6%E3%82%A7%E3%83%96%E3%82%B5%E3%82%A4%E3%83%88%E3%81%AE%E8%83%8C%E6%99%AF%E7%94%BB%E5%83%8F%E3%81%ABp5-js%E3%82%92%E4%BD%BF%E3%81%86%E6%96%B9%E6%B3%95/

p5.js – マトリックスレイン公開

マトリックスのあれ、いったん完成ということにして、自作ツールの方に公開しました。
https://www.fukakuutsukushikiasia.com/%e8%87%aa%e4%bd%9c%e3%83%84%e3%83%bc%e3%83%ab

前回からの変更点は以下の通りです。
・先頭の文字を白に
・文字を半角カナ、数字、小文字のアルファベットをランダムで表示

ソースはこちら

'use strict';

let cols = [];
const MIN_FRAME = 1;
const MAX_FRAME = 10;
let frameIdx = MIN_FRAME;
let chars;

function setup() {
  createCanvas(windowWidth * 0.9, windowHeight * 0.9);
  background(0);
  noStroke();
  textAlign(LEFT);
  frameRate(13);
  init();

  const kana = "ヲァィゥェォャュョッアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン";
  const alphabet = "abcdefghijklmnopqrstuvwxyz"; //"ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  const number = "012345679";
  chars = (kana + alphabet + number).split("");
}

function init() {
  noLoop();
  cols = [];
  let x = 0;
  while( x < width ) {
    const size = parseInt(random(5, 25));
    cols.push(new Colmun(x, size));
    x += size;
  }
  background(0);
  loop();
}

function mouseClicked() {
  init();
}

function draw() {
  if( ++frameIdx > MAX_FRAME ) {
    frameIdx = MIN_FRAME;
  }

  cols.forEach(col => {
    col.draw();
  });
}

class Colmun {
  posX;
  posY;
  posYPre;
  char;
  charSize;
  speed = parseInt(random(1, 5));

  constructor(x, size) {
    this.posX = x;
    this.charSize = size;
    this.posY = 0;
    this.posYPre = -1 * size;
  }

  draw() {
    if(frameIdx % this.speed !== 0) {
      return;
    }
    if(this.posY >= height + this.charSize) {
      this.posY = 0;
    }
    // 半透明の黒い四角で文字を徐々に消す
    fill(0, 0, 0, 20);
    const adjustment = 0; //this.charSize / 2; 文字をCENTERにしたときは左にずらす
    rect(this.posX - adjustment, 0, this.charSize, height);

    /* 文字を描画 */
    textSize(this.charSize);

    // 前回の文字色をlimeで上書き
    fill('lime');
    text(this.char, this.posX, this.posYPre);
    // 先頭の文字は白
    this.char = chars[parseInt(random(0, chars.length - 1))];
    fill('white');
    text(this.char, this.posX, this.posY);

    this.posYPre = this.posY;
    this.posY += this.charSize;
  }
}

p5.js – マトリックスレイン習作02

マトリックスレイン習作01に修正を加えました。
・文字を半角に
・横幅いっぱいに文字を表示
・各列の文字のサイズと落ちるスピードをランダムに変更
・クリックで再描画

ソースはこちら

'use strict';

let cols = [];
const MIN_FRAME = 1;
const MAX_FRAME = 10;
let frameIdx = MIN_FRAME;

function setup() {
  createCanvas(300, 300);
  background(0);
  noStroke();
  textAlign(LEFT);
  frameRate(15);
  init();
}

function init() {
  noLoop();
  cols = [];
  let x = 0;
  while( x < width ) {
    const size = parseInt(random(5, 25));
    cols.push(new Colmun(x, size));
    x += size;
  }
  background(0);
  loop();
}

function mouseClicked() {
  init();
}

function draw() {
  if( ++frameIdx > MAX_FRAME ) {
    frameIdx = MIN_FRAME;
  }

  cols.forEach(col => {
    col.draw();
  });
}

class Colmun {
  posX;
  posY = 0;
  charSize = 15;
  chars = ['ナ', 'マ', 'ス', 'テ'];
  charIdx = 0;
  speed = parseInt(random(1, 5));

  constructor(x, size) {
    this.posX = x;
    this.charSize = size;
  }

  draw() {
    if(frameIdx % this.speed !== 0) {
      return;
    }
    if(this.posY >= height + this.charSize) {
      this.posY = 0;
    }
    // 半透明の黒い四角で文字のフェードアウトを実現
    fill(0, 0, 0, 50);
    rect(this.posX, 0, this.charSize, height);
    // 文字を描画
    fill('lime');
    textSize(this.charSize);
    text(this.chars[this.charIdx], this.posX, this.posY);
    this.posY += this.charSize;
    if(++this.charIdx >= this.chars.length) {
      this.charIdx = 0;
    }
  }
}

p5.js – マトリックスレイン習作01

マトリックスのオープニングみたいなもの(マトリックレインというらしい)を作ってみようと思います。まずは落ちていく文字から。
徐々にバージョンアップしていく予定です。

ソースはこちら

'use strict';

let posY = 0; // 文字の位置
let posX;
let fontSize = 15; // フォントサイズ/移動距離
let strings = ['ナ', 'マ', 'ス', 'テ'];
let stringIdx = 0;

function setup() {
  createCanvas(300, 300);
  background(0);
  noStroke();
  textSize(fontSize);
  textAlign(CENTER);
  frameRate(10);
  posX = width / 2;
}

function draw() {
  fill(0, 50);
  rect(0, 0, width, height);

  if(posY >= height + fontSize) {
    posY = 0;
  }
  fill('lime');
  text(strings[stringIdx], posX, posY);
  posY += fontSize;
  if(++stringIdx >= strings.length) {
    stringIdx = 0;
  }
}

Node.js – コマンドライン引数(パラメータ)について

引数の数

const argc = process.argv.length;

引数へのアクセス

1つ目の引数はインデックス2に格納される

console.log(process.argv[2]);

argv0

コマンドで実行されたときのnode.exeの値がそのまま入るようです。
何を言っているのか分かりにくいので、以下の例を見てください。

index.js

console.log("process.argv0   = " + process.argv0);
console.log("process.argv[0] = " + process.argv[0]);

実行と結果

>node index.js
process.argv0   = node
process.argv[0] = C:\Program Files\nodejs\node.exe

>node.exe index.js
process.argv0   = node.exe
process.argv[0] = C:\Program Files\nodejs\node.exe

>"C:\Program Files\nodejs\node.exe" index.js
process.argv0   = C:\Program Files\nodejs\node.exe
process.argv[0] = C:\Program Files\nodejs\node.exe

参考資料