Puppeteerを使ったヒートマップ画像の保存

いや〜、大変な相場です。私のPFはYHからすでに-1k万円近く下げています。今日だけで-0.5kの下げでした。 年間給与の手取り分くらいの変動が1日で発生する日は年に4~5回はある印象ありますが、ダウンサイドのリスク管理ができていない証拠なので、信用売りをうまく使わないといけないです。

さて、先日、Node.jsのライブラリでpuppeteerというものを見つけました。 GoogleChrome DevTeamが開発/メンテしているHeadlessでChromeが操作できるライブラリです。

これ何がいいかというと、Chromeブラウザ上での作業を自動化できることです。 例えば、

  1. Yahoo Financeにログインする
  2. 自分のPFを取得する
  3. DailyでPFの総資産額を取得する
  4. DBにためる

という一連の作業が自動化できます。

何か自動化できそうなネタはないかな〜と日経が300円近く下げているなかツイッターをみていると、 @siroku829さんから下記のツイートが

株マップのデイトレンドマップです。 これを毎日スクショとして保存すると後日見返すことができて役立ちそうです。感覚的にビジュアルでトレンドを判断することもできますね。

早速puppeteerを使ってヒートマップのスクショ保存までやってみました。下記そのソースコード

const puppeteer = require('puppeteer');
const moment = require('moment');
const FAKE_USERAGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/604.3.5 (KHTML, like Gecko) Version/11.0.1 Safari/604.3.5';
const KABUMAP_HEATMAP_URL = 'http://dt.kabumap.com/servlets/dt/Action?SRC=trendMap/base';
const HEATMAP_ELEM = 'div#contents div#trendMap';

(async () => {

    const browser = await puppeteer.launch({headless: true});
    const page = await browser.newPage();

    //FakeのUserAgentをセットする。
    await page.setUserAgent(FAKE_USERAGENT);
    await page.setViewport({width: 1000, height: 1000, deviceScaleFactor: 2});

  //ヒートマップのURLに行く。waitUntilでページ読み込みが完了するまで待つことができる。
    await page.goto(KABUMAP_HEATMAP_URL, {waitUntil: 'networkidle2'});
    await page.waitFor(1000);

    //Heatmapのテーブルがある要素を取得
    const element = await page.$(HEATMAP_ELEM);

    //スクショを撮る
    await element.screenshot({
       path: moment().format('YY-MM-DD') + '_element.png'
    });
})();

node heatmap.jsで実行して、ディレクトリ上にpngファイルが生成されていると思います。

f:id:nerimplo:20171115155506p:plain

こんな感じです。moment.jsを使って日付をファイル名に加えています。

株探の特集記事を使ったスクリーニング

株探が今年から過去の四半期決算情報を掲載しはじめたので有料会員になって利用しています。

銘柄探しの一環で、株探の特集記事(https://kabutan.jp/news/marketnews/?category=5)にはよく世話になっています。

私がやっている方法は

  1. 気になった記事をクリップ
  2. 記事ページの銘柄一覧が載っているHTML要素を特定しスクレイピングしDBで管理
  3. 四季報Online/株探を見て直近の業績やキャッシュフローの推移、業界におけるポジショニングとその業界の動向、海外展開の有無、M&A、バリュエーションなどのチェック
  4. RSI, MACD, ボリンジャーバンドを使ってテクニカル面のチェック

です。 3と4に関しては、3はマニュアルでぽちぽちクリックしながら、4に関してはYahoo!ファイナンスとSBIのチャート機能を使っています。

f:id:nerimplo:20171007215545p:plain

4月から始めて、こんな感じで記事がある程度ストックされてきたので、私がクリップした株探の特集記事に掲載された回数が多い銘柄上位10社を探して見ました。

銘柄名 回数
IDEC 7
日産 6
ミスミG 6
オークマ 5
かどや製油 5
日本ライフライン 5
日本M&Aセンター 5
任天堂 5
アーレスティ 5
新明和工業 5

あくまで私の独断と偏見でクリップした記事に登場する回数が多かった銘柄です。 日本LL、日本MAなど、著名な個人投資家さんが保有する銘柄も頻繁に出ているようです。アーレスティはダイカストの大手だそうです。「ダイカストって何や」とWikipediaで調べると

金型鋳造法のひとつで、金型に溶融した金属を圧入することにより、高い寸法精度の鋳物を短時間に大量に生産する鋳造方式のことである。

とのこと。また新しい言葉を覚えました。銘柄探しの面白みはまぁすぐに何に役立つかは即答できないが、普段知らない事に触れる機会ができるというところですね。Happy investing!

Rule No.1: Never lose money. Rule No.2: Never forget rule No.1.

2017年上半期の振り返りをしてみました。

f:id:nerimplo:20170701181959j:plain

実現損TOP10
銘柄 損益
あじかん -1,795,983
ハビックス -1,051,116
フリュー -497,532
ヨシックス -372,256
大和ハウス工業 -328,753
ネクス -289,785
MRT -264,225
東洋製罐グループホールディングス -203,994
トヨタ紡織 -166,514
セブン銀行 -147,239
実現益TOP10
銘柄 損益
イー・ギャランティ 2,714,095
シノケングループ 2,679,236
WDBホールディングス 2,564,996
KeePer技研 1,645,125
ディップ 1,553,164
エン・ジャパン 1,531,060
平田機工 1,405,754
夢の街創造委員会 1,230,484
ジャストシステム 962,928
リログループ 957,511

イーギャラは3月末から作ったポジションと今までの2011年ごろからのポジションの一部利確分を含む。平田機は信用枠+10%で利確のルールに忠実に従ったのだけれど、結果的に売るのが早すぎた。 あじかんは決算ギャンブルによる損失。ハビックスも決算後の戻りが悪く別の銘柄に乗り換えるために損切った。 実現損のTOP4-10は全て年初から3月末にかけてのもので全て信用枠。

下期の目標
  • 信用枠での利確損切りルールの徹底
  • 現物枠でいいビジネスをコツコツ買う。

年初からの実現益(6/23)

年初からの実現益 +1998

6月は単月で今年最高のパフォーマンスになる見込みです。夏枯れ相場に向けて信用枠では1に利確、2に利確でルールに徹していきたい。

今週の売買:なし 年初からの実現益: +1289

年初からの実現益は1289万になりました。

直近では平田機工やエンジャパンがプラスに貢献しています。

最近、取引の履歴を見て振り返るというプロセスに時間を割けず… 面倒なのがSBIでダウンロードしたcsv文字コードです。 このcsv文字コードSJISで、そのままGoogle spreadsheetにアップロードすると文字化けしてしまいます。

そこでnkfというテキストデータの文字コードを変換してくれるunixのコマンドを使って変換作業をかませています。

流れとしては

  1. Safari/ChromeでSBIから取引履歴をcsvでダウンロード

  2. ローカルでnkfをつかってそのcsvファイルをSJIS -> UTF8変換

  3. 変換後のファイルをGoogle Driveにアップロード

  4. フィルターやQUERY関数を使って集計作業

ざっくりこれだけでも10分くらいはかかります。

これらを自動化する方法としては 1についてはログイン後の情報なのでJavascriptを使うアプローチならCasperJSやNightmareJSといったスクレイピングに特化したライブラリを使ってcsvファイルをダウンロードするという方法があります。 3のGoogle Driveにアップロードする作業ですが、目的は集計することなので、データをつっこむ先はMySQLでもPostgreSQLでも構いません。 Pythonのpandasでデータを持ってきて集計できますからね。

なので

  1. スクレイピングしてcsvをダウンロード

  2. sjis->uft8変換

  3. Postgresへのインサート処理

  4. Pandasで集計結果を出す。

これでやりたい事が自動化できそうです。 ToDoタスクに入れておこう。

GoogleSpreadsheetのQUERY関数を使って取引履歴を集計する

SBIから取引履歴をcsvでダウンロードして、信用枠の取引履歴から銘柄別の損益を集計してみました。 基本的に信用買から入った銘柄ばかりです。なので返済売が条件に入っています。

QUERY関数というのがあるのか、初めて知りました。年初から2月末にかけて、ネクストと大和ハウスで80万くらい損してますね(^_^;)。

f:id:nerimplo:20170520201748p:plain

追記 よく考えたら約定単価はweighted averageじゃないとだめですね。元のスプレッドシート側で約定単価*約定数量のカラムを作って、そのSUMを約定数量のSUMで割らないといけない。

SBI証券のポートフォリオ画面から保有株の決算発表日を取得するブックマークレット

SBI証券ポートフォリオ画面では決算発表の時期が近づくと、銘柄欄に"決算"アイコンが表示されます。 ユーザとしてはここから決算発表日が近づいているのがわかるのですが、正確な日を把握するにはいちいちリンクをクリックして別画面で発表日を知る必要があります。

と思っていたのですが、この決算アイコンの上でマウスオーバーすると発表日の吹き出しが表示されることをつい最近発見しました! f:id:nerimplo:20170501084134j:plain これはしめた!

さっそく決算アイコンが付いている銘柄から決算発表日を取得してカンマ区切りで表示するブックマークレットを作ってみました。下記そのコードです。

var printStr = '';
Array.prototype.slice.call(
    document.querySelectorAll('div.middleAreaM2 > table > tbody > tr > td > table td:nth-child(2).mtext[rowspan="1"]'))
    .forEach(function (e) {
        var code = e.innerText.substring(0, 4);
        if (e.querySelector('a:last-child img.vaM') !== null) {
            var name = e.querySelector('a:first-child').text;
            var title = e.querySelector('a:last-child img.vaM').title;
            printStr += '<div>' + code + ', ' + name + ', ' + title + '</div><br/>';
        }
    });
var d = window.open().document;
d.writeln('<div>' + printStr + '</div>');
e.querySelector('a:last-child img.vaM').title;

でimgタグのtitle要素を取ってきています。

表示は別画面です。こんな感じでカンマ区切りで表示させてます。上記コードをブックマークレットにしてあげれば、あとは表示結果をGoogleSpreadsheetで管理して、カレンダーと紐づけるなり、なんなりできますね。Happy investing! f:id:nerimplo:20170501084258j:plain

(ブックマークレットの作り方は、 SBI証券のポートフォリオ画面(ログイン後)からYahooファイナンスのポートフォリオ登録用に保有銘柄のコードをスペース区切りで出力するブックマークレット - nerimplo’s diary を参照してください。 )