【投資】iPhoneでFear & Greedを無料でウィジェット表示する方法!

投資

どうもみなさんこんにちは、OBARKINです。
今回は投資の世界でよく使われる、恐怖強欲指数 Fear & Greed IndexをどうしてもiPhoneのウィジェットとして表示したく、色々試行錯誤した結果ウィジェットに表示することができたので、その方法を伝授したいと思います!

Fear & Greed Index(恐怖強欲指数)

この指数を知っている人も多いかと思いますが、知らない方のために簡単に。
アメリカのCNNが出している指標です。
市場全体がどれだけ、怖がっているか、もしくは下心丸出しのイケイケムードなのか、を一目で観察するパラメータですね。0が最も悲観(市場はお通夜ムード)、100がお祭り状態です。

よく近い意味合いで使われるのがVIX指数になりますが、これはどちらかというと機関投資家などプロがどれだけリスクを回避するための保険にお金をかけているのかを観察する指数で、20を超えると不安大、30超えはパニック状態と考えられますが、素人投資家目線ではいまいちわかりパッとしない指数でもあります。

対して恐怖強欲指数 Fear and Greed IndexはVIX指数と異なり、下記のような多角的な項目を織り交ぜています。

  • S&P500指数が125日移動平均をどれだけ上回っているか
  • 52週高値を更新した銘柄数と安値を更新した銘柄数の比率
  • 上昇銘柄の取引量と下落銘柄の取引量の比較
  • プット(売り権利)とコール(買い権利)の取引比率
  • 投資適格債とジャンク債の利回りの差
  • 上で紹介したVIX指数(恐怖指数)
  • 株式と国債のリターンの差

まあ色々わけわからないコールやら何?って感じですが、簡単に言うと、イケイケのときは信用MAXレバレッジ最大でみんな取引したがるのでその割合を見て、指数に反映するような感じですね。見て頂けたら分かる通りVIX指数も計算の一部に入っており、車のメーターのように0-100でどの位置にいるかがパッと分かる素人にとってすごく分かりやすい指標になっているんです。

筆者はインデックス投資が主なので、この指数を見て売ったり買ったりガチャガチャしているわけではないのですが、明らかに評価額が急落している場面で、この恐怖強欲指数 Fear & Greed Indexを見ると、市場がめっちゃ怖がっていたり、逆に急激に上昇している場面にこの指標を見に行くと、超強欲モードになるのを見たりしていると、「あーこのまま行くとまた誰かが痛い目あうんだろうな~」とか想像して市場を静観するためのツールとして使っている節があります!

この指標を一目で見れるアプリがない!

Screenshot

行き過ぎた局面が続けば必ず50めがけて戻る(株価は下がる)、お通夜ムードでも時間が経てばこれもまた50のニュートラル付近を目指して戻る(株価は上がる)、こんなわかりやすい指標ないのに、かなり調べましたがウィジェット表示機能が無かったり、使うには有料だったりと、これをiPhoneの画面にウィジェットとして表示できる無料のアプリがないんです。

VIX指数であればTradingViewなどの無料チャートアプリでウィジェット一覧表示の1銘柄として登録できますが、何せ恐怖強欲指数 Fear & Greed Indexは銘柄じゃないもので表示できず。

また、仮想通貨系のアプリにも似たような指数が備わっていたりしますが、今回の指数とは対象の市場が違います。

Scriptableを使ってウィジェットを作成

それなら自分で作ればいいのではないかと!
ということで、今回は自らScriptableという開発アプリを使ってCNNのサイトから恐怖強欲指数 Fear & Greed Indexの値を引っ張ってくるウィジェットを作成しました。

実は超簡単で、数ステップ踏めば誰でも無料でマネできるので、下記方法試してみて下さい!

Scriptableをインストール

App Storeから、Scriptableをインストールします。

Screenshot

プロジェクト作成

ダウンロードして、アプリを開いたら右上に「+」ボタンがあるので、これを開き、下記コードを貼り付けます。

右上のボタン
コード画面
コード貼り付け後スタートボタン
const url = "https://production.dataviz.cnn.io/index/fearandgreed/graphdata";

async function createWidget() {
  let widget = new ListWidget();
  widget.backgroundColor = new Color("#1c1c1e");
  widget.setPadding(15, 15, 15, 15);

  try {
    let req = new Request(url);
    let res = await req.loadJSON();
    let data = res.fear_and_greed;
    let score = Math.round(data.score);
    let rating = data.rating.toUpperCase();

    // タイトル
    let title = widget.addText("FEAR & GREED");
    title.textColor = new Color("#aaaaaa");
    title.font = Font.boldSystemFont(12);
    title.centerAlignText();
    
    widget.addSpacer(8);

    // スコア表示
    let scoreTxt = widget.addText(score.toString());
    scoreTxt.textColor = getScoreColor(score);
    scoreTxt.font = Font.boldSystemFont(36);
    scoreTxt.centerAlignText();

    // 評価テキスト
    let ratingTxt = widget.addText(rating);
    ratingTxt.textColor = getScoreColor(score);
    ratingTxt.font = Font.heavySystemFont(12);
    ratingTxt.centerAlignText();

    widget.addSpacer(12);

    // --- メーターの描画 ---
    let drawContext = new DrawContext();
    drawContext.size = new Size(200, 20);
    drawContext.opaque = false;

    // メーターの背景(グレーのバー)
    let bgPath = new Path();
    bgPath.addRoundedRect(new Rect(0, 5, 200, 10), 5, 5);
    drawContext.addPath(bgPath);
    drawContext.setFillColor(new Color("#333333"));
    drawContext.fillPath();

    // 現在の位置(ポインター)
    let pointerPos = (score / 100) * 200;
    let pointerPath = new Path();
    pointerPath.addEllipse(new Rect(pointerPos - 5, 0, 10, 20));
    drawContext.addPath(pointerPath);
    drawContext.setFillColor(getScoreColor(score));
    drawContext.fillPath();

    let meterImg = widget.addImage(drawContext.getImage());
    meterImg.centerAlignImage();

  } catch (e) {
    let errTxt = widget.addText("Fetch Error");
    errTxt.textColor = Color.red();
    errTxt.centerAlignText();
  }

  return widget;
}

// スコアに応じた色の判定
function getScoreColor(score) {
  if (score <= 25) return new Color("#ff453a"); // Extreme Fear (赤)
  if (score <= 45) return new Color("#ff9f0a"); // Fear (オレンジ)
  if (score <= 55) return new Color("#ffd60a"); // Neutral (黄)
  if (score <= 75) return new Color("#32d74b"); // Greed (緑)
  return new Color("#64d2ff"); // Extreme Greed (シアン)
}

let widget = await createWidget();
if (config.runsInWidget) {
  Script.setWidget(widget);
} else {
  widget.presentSmall();
}
Script.complete();

スタートボタンを押すと下記のように、出来上がりを表示してくれますので問題なければ閉じて、最初は「Untitled Script」になっているので、長押し、今回作成したプロジェクトを分かりやすい名前に変更します。(今回はFear & Greed Indexという名前に変更)

出来あがりを試し表示
今回のプロジェクト

ホーム画面からウィジェット追加

今回作成したウィジェットは、Scriptableというアプリの枠内で表示するウィジェットになるため、[ウィジェット追加 → Scriptableアプリ選択 → 今回のプロジェクト選択]、という流れになります。

ホーム画面からウィジェット追加
Scriptableアプリを選択

選択後、ホーム画面に表示されているウィジェットはまだプロジェクトを選んでいないのでもぬけの殻です。
もぬけの殻状態のウィジェットを長押しして、先ほど作ったプロジェクトを選択します。

Screenshot
Screenshot

そしたら出来上がり!
こんな感じで表示できます!ウィジェットは自動で更新されるので、わざわざScriptableアプリを開いたり閉じたりする必要もありません!

Screenshot

Trading Viewのウィジェットと一緒の投資ページを作ってそこに表示しておきました!

Screenshot

ちなみに筆記時点でイラン関連で市場はEXTREME FEAR(15)状態です笑

まとめ

いかがだったでしょうか!
指数だけの上げ下げや、個別銘柄をいじられている方でも1銘柄単位ではいまいち市場全体がどんなムードなのか掴みづらい部分もあると思いますが、今回作成した恐怖強欲指数のウィジェットである程度市場のムード感を一目で見ることができるようになったと思います。(だからと言って指数の売り買いは別にしないのですが笑)

ま、自己満足ではありますが誰かのお役に立ててたら嬉しいなと思います!ではまた!

コメント

タイトルとURLをコピーしました