Tdnet上の「業績予想の修正に関するお知らせ」のhtmlファイルをパースして、業績に関する数値部分を抽出する

Tdnet上の「業績予想の修正に関するお知らせ」のhtmlファイルをパースして、業績に関する数値部分だけを抜き出す方法です。


Tdnetからダウンロード

まずTdnetにアクセスし、「業種予想の修正に関するお知らせ」を見つけXBRLアイコンをクリックし、zipファイルをダウンロード。
f:id:nerimplo:20180616202811p:plain

ちなみに下記は6/14に発表された第一カッター(1716)の業績予想の修正分です。
https://www.release.tdnet.info/inbs/091220180612462815.zip

zipを解凍し、.htmファイルを開きます。
f:id:nerimplo:20180616202913p:plain


BeautifulSoupでパース

欲しい情報はこのあたりの数値です。
f:id:nerimplo:20180617221205p:plain

from bs4 import BeautifulSoup
import re

PATH = "./091220180612462815/tse-rvfc-17160-20180612462815-ixbrl.htm"

with open(PATH) as f:
    soup = BeautifulSoup(f, 'lxml')

trs = soup.select('table.xbrl_tse.xbrl_table.xbrl_allborder tr')
for tr in trs:
    for ix in tr.find_all('ix:nonfraction', {'unitref': re.compile("JPY|JPYPerShares")}):
        if ix.text:
            print('{:<90}{:<50}{:<50}'.format(ix.attrs.get('contextref'), ix.attrs.get('name'), ix.text))

soup.selectでcss selectorが使えます。私はxpathよりcss selectorの方が馴染み深いのでこちらを使ってます。
tableタグのtrを取得して、さらにその下のix:nonfractionタグに含まれる要素の内容(beautifulsoupのix.text)部分が今回欲しい情報です。

注意したいのが、例えば赤字の営業益の場合です。テキスト部分は営業損失でも正の値となる仕様の様です。この場合、sign属性がタグに含まれるので、ix.attrs.get('sign')が'-'の場合はマイナスの数値に変換してあげる必要があります。




出力結果

これらをcsvに吐くなどして加工できるようにします。

CurrentYearDuration_ConsolidatedMember_PreviousMember_ForecastMember                      tse-ed-t:NetSales                                 14,064                                            
CurrentYearDuration_ConsolidatedMember_PreviousMember_ForecastMember                      tse-ed-t:OperatingIncome                          1,599                                             
CurrentYearDuration_ConsolidatedMember_PreviousMember_ForecastMember                      tse-ed-t:OrdinaryIncome                           1,662                                             
CurrentYearDuration_ConsolidatedMember_PreviousMember_ForecastMember                      tse-ed-t:NetIncome                                1,040                                             
CurrentYearDuration_ConsolidatedMember_PreviousMember_ForecastMember                      tse-ed-t:NetIncomePerShare                        182.83                                            
CurrentYearDuration_ConsolidatedMember_CurrentMember_ForecastMember                       tse-ed-t:NetSales                                 15,848                                            
CurrentYearDuration_ConsolidatedMember_CurrentMember_ForecastMember                       tse-ed-t:OperatingIncome                          2,087                                             
CurrentYearDuration_ConsolidatedMember_CurrentMember_ForecastMember                       tse-ed-t:OrdinaryIncome                           2,161                                             
CurrentYearDuration_ConsolidatedMember_CurrentMember_ForecastMember                       tse-ed-t:NetIncome                                1,305                                             
CurrentYearDuration_ConsolidatedMember_CurrentMember_ForecastMember                       tse-ed-t:NetIncomePerShare                        229.39                                            
CurrentYearDuration_ConsolidatedMember_CurrentMember_ForecastMember                       tse-ed-t:AmountChangeNetSales                     1,783                                             
CurrentYearDuration_ConsolidatedMember_CurrentMember_ForecastMember                       tse-ed-t:AmountChangeOperatingIncome              488                                               
CurrentYearDuration_ConsolidatedMember_CurrentMember_ForecastMember                       tse-ed-t:AmountChangeOrdinaryIncome               499                                               
CurrentYearDuration_ConsolidatedMember_CurrentMember_ForecastMember                       tse-ed-t:AmountChangeNetIncome                    264                                               
PriorYearDuration_ConsolidatedMember_CurrentMember_ResultMember                           tse-ed-t:NetSales                                 12,840                                            
PriorYearDuration_ConsolidatedMember_CurrentMember_ResultMember                           tse-ed-t:OperatingIncome                          1,412                                             
PriorYearDuration_ConsolidatedMember_CurrentMember_ResultMember                           tse-ed-t:OrdinaryIncome                           1,473                                             
PriorYearDuration_ConsolidatedMember_CurrentMember_ResultMember                           tse-ed-t:NetIncome                                990                                               
PriorYearDuration_ConsolidatedMember_CurrentMember_ResultMember                           tse-ed-t:NetIncomePerShare                        174.01      




Tdnetで公開されている業績予想修正に関するXBRLをpandasで加工してみた

Tdnetで公開されている業績予想修正に関するXBRL(正確にはixbrl.htm)をpandasで加工してランキングにしてみました。

下記のランキングの抽出条件としては、

  • Tdnetでは発表から一ヶ月経つとファイルがダウンロードできなくなるので4月20日以降の業績予想修正に関する発表
  • 業績予想修正が上方修正された
  • 修正後の営業利益率が10%以上
  • 修正発表後の翌日の終値 ~ その10営業日後の終値の騰落率で順位づけ
    です。

10営業日後としたのは、だいたいこれくらいなら発表後のモメンタムが上向きか下向きか、あるいは変わらずか、を把握するには十分な期間ではないかと思ったからです。
ただ、予想修正後に通期分の決算短信発表があり、今期の会社予想が減益となるケースもあります。このランキングはその点考慮していません。

例えば、
4/26に18年3月期の上方修正を発表
4/27に18年3月期の決算短信発表、19年3月期予想が予想外に低く、翌日売られる
というケースも考えられます。

東海カーボン日本カーボンがランキングに入っています。黒鉛電極の市況を追い風とした業績面でのプラスが素直に株価に織り込まれた印象です。
環境規制へは中国企業ももちろん対応するでしょうし、生産設備の稼働状況、競合の増産方針、リチウムイオン電池向けなど電炉以外の需要などを見つつ投資判断という感じでしょうか。
平和とSANKYOは修正理由を読む限り、もともと保守的に見積もっていた遊技機の販売台数が予想を上回り、販管費削減効果も出て上方修正、売上営業利益率もアップしたようです。

f:id:nerimplo:20180603143825p:plain

Yahoo Financeのmyポートフォリオから銘柄コードをスクレイピングする

Yahooファイナンスポートフォリオ機能を使って過去取引した銘柄やWatch銘柄を管理しています。

YFでは1pfあたり管理できる銘柄数が最大50なので、監視銘柄が増えるほど新規に作らないといけません。

私は、例えば四季報を読んで、気になる銘柄をNotepadやiPhoneでメモして、"四季報18年春_1"みたいなポートフォリオを作って管理するやり方をしています。

これだとポートフォリオ自体の数が増えると、いざ分析でコードだけキーに使いたい時に、いちいちコピペしていくのがかなり面倒です。(私の場合、直近だと15pfあります)、

そこで、Nightmare.jsを使い、ユーザの全ポートフォリオから一括で銘柄コードを取得するjavascriptを書きました。

  1. 適当にfolderを作って下記のソースからpackage.jsonを作成
  2. そのfolder下で.evn.jsonを作成。YahooのログインID、パスワードを書く
  3. npm install
  4. node run.js false してやれば、スクレイピング結果を反映したdata.jsonが作成されるはずです。


//run.js
var env = require('gulp-env');
var Nightmare = require('nightmare');
var vo = require('vo');
const {promisify} = require('util');
var fs = require("fs");
const writeFileAsync = promisify(fs.writeFile);

const FAKE_USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, likeGecko) Chrome/41.0.2228.0 Safari/537.36';
const YAHOO_FINANCE_URL = 'http://finance.yahoo.co.jp/'
const JSON_FILE = './data.json'

env({
    file: './.env.json'
});

let nightmare = Nightmare({show: true});

const YahooFinanceLogin = (nightmare) => {
    return nightmare
        .useragent(FAKE_USER_AGENT)
        .goto(YAHOO_FINANCE_URL)
        .click('ul.portFolioIn li.help a')
        .wait('div#idWrap')
        .type('input#username', process.env.USER_ID)
        .click('button#btnNext')
        .wait(2000)
        .type('input#passwd', process.env.PASSWORD)
        .wait(1000)
        .click('#btnSubmit')
        .wait(3000)
        .wait('span.portFolio')
}

const getIdxOfPortfolio = (nightmare, portFolioName) => {
    return nightmare.evaluate((portFolioName) => {
        return Array.from(document.querySelectorAll('ul.portFolioIn > li')).map((e) => {
            return e.textContent
        }).indexOf(portFolioName)
    }, portFolioName).then((idx) => {
        return idx
    });
}

const getListOfPortfolios = (nightmare) => {
    return nightmare.wait('ul.portFolioIn').evaluate(() => {
        return Array.from(document.querySelectorAll('ul.portFolioIn > li')).map((e, idx) => {
            return {'name': e.textContent, 'idx': idx}
        });
    })
}

const getSharesFromPortfolio = (nightmare, idxOfPortfolio) => {
    return nightmare
        .click('ul.portFolioIn > li:nth-child(' + idxOfPortfolio + ') a')
        .wait('table.smallText')
        .wait(500)
        .evaluate(() => {
            return Array.from(document.querySelectorAll('div.pfListView table tbody#tbotyPortfolioList > tr > td:nth-child(2)')).map((e) => {
                return e.innerText.replace('\n', '')
            });
        })
}

const writeToJsonFile = (o) => {
    return writeFileAsync(JSON_FILE, JSON.stringify(o), (err) => {
        if (err) {
            console.error(err);
            return;
        };
        console.log("File has been created");
    });
}


vo(function* () {
    const testRun = process.argv[process.argv.length-1];;
    let nightmare = Nightmare({show: false})
    yield YahooFinanceLogin(nightmare);     //Login
    let code = '';
    let jsonObj = [];
    if (testRun) {
        code = yield getSharesFromPortfolio(nightmare, 1)
    } else {
        let listOfPortfolios = yield getListOfPortfolios(nightmare);
        for (var i = 0, len = listOfPortfolios.length; i < len; i++) {
            let codes = yield getSharesFromPortfolio(nightmare, listOfPortfolios[i].idx + 1)
            console.log('-----')
            console.log(listOfPortfolios[i].name);
            console.log('-----')
            var t = {'name': listOfPortfolios[i].name, 'code': codes}
            jsonObj.push(t);
        }
        yield writeToJsonFile(jsonObj);
    }

    yield nightmare.end();
    if (testRun) {
        return code
    } else {
        return jsonObj
    }

})((err, result) => {
    if (err) return console.log(err);
    console.log(result);
});
//package.json
{
  "name": "yahoofinancenightmare",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "testRun": "node run.js true",
    "prd": "node run.js false"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "argv": "0.0.2",
    "csv-write-stream": "^2.0.0",
    "fs": "0.0.1-security",
    "gulp-env": "^0.4.0",
    "nightmare": "^2.10.0",
    "vo": "^4.0.2"
  }
}
//.env.json
{
  "USER_ID": "YOUR_USER_ID",
  "PASSWORD": "YOUR_PASSWORD"
}

2018年1Q 日本株取引レビュー

  • 合計 16,440万 年初来-1.26%
  • 実現益(税引き前) 720万
  • うち信用部門での実現益 298万
  • 信用部門でのコスト(金利、取引手数料など) 43万

実現益TOP5

銘柄 損益
WDBホールディングス 483万
コムチュア 192万
ニッポン高度紙工業 161万
キーエンス 152万
山田コンサルティンググループ 128万

実現益WORST5

銘柄 損益
ウルトラファブリックス・ホールディングス -166万
前田建設工業 -94万
錢高組 -65万
Gunosy -58万
ニチハ -54万

キーエンスはテクニカル指標を見つつ買いでエントリータイミングを伺うやり方が成功した感じです。 コムチュアは2月の下落前に売り切ることができました。 実現損では信用部門で持ってた建設株の下落が大きかったです。需給面でいうと投信や持株会からの売りが、下落の要因の一つかもしれません。

1/26からの騰落率

昨日VIXが16ポイント台に戻り、月初と比べると落ち着いてきた感があります。 あれ、そもそもなんで2月に入って下げ始めたんだ?と振り返ってみますと

  • 2/2の雇用統計(朝OP前発表)で賃金が市場の予想を上回る伸びとなった。
  • 当日、ダウは前日比-100ドルくらいで寄り付く。-666ドルと9年ぶりの下落で引ける。
  • インフレ懸念と金利上昇を材料にその翌週の月曜日は過去最大の下げ幅を記録。売りが売りを呼ぶ展開になる。

だと思います。

そんな中、個別株でみると先月末よりもプラスで推移している銘柄も見受けられます。 そこで自分が今までに取引した銘柄(SBIに口座移管した2015年以降の記録です)で、決算発表が本格化した先月の1/26から今週金曜日2/23の間で上昇率トップ5と下落率ワースト5を調べてみました。

Top5

銘柄名 01/26 02/23 変化率
メディカル・データ・ビジョン 2344 3070 27.0%
弁護士ドットコム 1682 2076 21.0%
ハーバー研究所 6020 7330 19.7%
ユーザベース 1566 1899 19.3%
MCJ 1249 1461 15.7%

Worst5

銘柄名 01/26 02/23 変化率
ウルトラファブリックス・ホールディングス 3205 1689 -64.1%
ダブル・スコープ 2175 1480 -38.5%
日本ケミコン 3695 2859 -25.7%
ビリングシステム 6200 4835 -24.9%
戸田工業 4735 3715 -24.3%

トップ5のうちハーバー研究所は好業績を発表しS高になりました。 ワーストトップはUFHD。現在保有株の一つです。このドローダウンはほんと痛い。半分売って伝家の宝刀塩漬けで対処してます。

全銘柄のリストは以下の通りです。

銘柄名 01/26 02/23 変化率
メディカル・データ・ビジョン 2344 3070 27.0%
弁護士ドットコム 1682 2076 21.0%
ハーバー研究所 6020 7330 19.7%
ユーザベース 1566 1899 19.3%
MCJ 1249 1461 15.7%
三機サービス 1932 2235 14.6%
LIFULL 964 1110 14.1%
NEXT FUNDS 日経平均ダブルインバース・インデックス連動型上場投信 1183 1354 13.5%
ゼンショーホールディングス 1946 2224 13.4%
日経平均ベア2倍上場投信 2844 3250 13.3%
ブイ・テクノロジー 22990 25690 11.1%
ドリコム 1255 1397 10.7%
ジャストシステム 2127 2367 10.7%
イー・ギャランティ 3720 4060 8.7%
ブルボン 3185 3435 7.6%
WDBホールディングス 3900 4135 5.9%
井村屋グループ 3845 4075 5.8%
カネカ 1031 1091 5.7%
山九 4860 5100 4.8%
ヨシックス 3695 3875 4.8%
アクシーズ 4335 4540 4.6%
レオン自動機 2248 2351 4.5%
ペッパーフードサービス 4770 4950 3.7%
MARUWA 8130 8370 2.9%
セイノーホールディングス 1840 1884 2.4%
南陽 2309 2363 2.3%
ベネフィット・ワン 2724 2774 1.8%
関電工 1206 1222 1.3%
チエル 1520 1540 1.3%
ソニー 5285 5354 1.3%
シノケングループ 2927 2960 1.1%
夢の街創造委員会 1942 1953 0.6%
花王 7700 7730 0.4%
任天堂 48230 48360 0.3%
エン・ジャパン 5830 5800 -0.5%
インフォテリア 1270 1257 -1.0%
クリエイト・レストランツ・ホールディングス 1217 1201 -1.3%
アイカ工業 4140 4085 -1.3%
横河電機 2206 2175 -1.4%
共立メンテナンス 4745 4675 -1.5%
キヤノンマーケティングジャパン 2971 2927 -1.5%
ニホンフラッシュ 2805 2761 -1.6%
パイロットコーポレーション 5630 5540 -1.6%
コムチュア 3510 3440 -2.0%
マルハニチロ 3285 3215 -2.2%
ライオン 2101 2056 -2.2%
パートナーエージェント 401 392 -2.3%
ユニ・チャーム 2998 2928 -2.4%
良品計画 36200 35300 -2.5%
フマキラー 2461 2399 -2.6%
松風 1463 1425 -2.6%
日精樹脂工業 1764 1717 -2.7%
焼津水産化学工業 1231 1194 -3.1%
関門海 542 525 -3.2%
ディップ 3420 3310 -3.3%
サマンサタバサジャパンリミテッド 495 479 -3.3%
ソフトバンクグループ 9200 8896 -3.4%
サカイ引越センター 5740 5540 -3.5%
関西ペイント 2783 2684 -3.6%
西松屋チェーン 1286 1240 -3.6%
日本航空 4208 4056 -3.7%
不二製油グループ本社 3285 3165 -3.7%
アイシン精機 6490 6240 -3.9%
トヨタ紡織 2403 2310 -3.9%
ドトール・日レスホールディングス 2644 2513 -5.1%
農業総合研究所 2144 2037 -5.1%
ダイキン工業 13350 12655 -5.3%
北海道コカ・コーラボトリング 761 721 -5.4%
ロック・フィールド 2256 2135 -5.5%
ルネサンス 1870 1768 -5.6%
フリュー 1123 1060 -5.8%
リンナイ 10360 9760 -6.0%
キーエンス 69120 64990 -6.2%
あじかん 1412 1324 -6.4%
JR九州 3610 3375 -6.7%
東京エレクトロン 21825 20375 -6.9%
三井住友フィナンシャルグループ 5053 4713 -7.0%
冨士ダイス 1172 1093 -7.0%
村田製作所 15915 14825 -7.1%
大成建設 5780 5370 -7.4%
日新 3035 2817 -7.5%
天龍製鋸 3675 3400 -7.8%
ダイフク 7440 6880 -7.8%
セブン銀行 407 376 -7.9%
フェローテックホールディングス 2706 2497 -8.0%
日本水産 595 549 -8.0%
大和証券グループ本社 787 725 -8.2%
遠州トラック 1650 1517 -8.4%
アルトナー 2219 2040 -8.4%
アズビル 5150 4730 -8.5%
日本精蝋 386 354 -8.7%
第一生命ホールディングス 2349 2152 -8.8%
扶桑化学工業 3195 2915 -9.2%
TOTO 6350 5790 -9.2%
パーク24 2805 2554 -9.4%
MS-Japan 7040 6400 -9.5%
GMOペイメントゲートウェイ 9870 8970 -9.6%
TOKYO BASE 4465 4050 -9.8%
エスフーズ 4770 4325 -9.8%
信越化学工業 12510 11330 -9.9%
バルニバービ 2829 2560 -10.0%
ピープル 1884 1703 -10.1%
タツモ 2114 1909 -10.2%
ローム 12130 10950 -10.2%
三菱総合研究所 3850 3470 -10.4%
LINE 4860 4380 -10.4%
東ソー 2504 2256 -10.4%
九電工 5610 5050 -10.5%
ハビックス 1140 1022 -10.9%
富士通フロンテック 1937 1731 -11.2%
ダスキン 2977 2659 -11.3%
テラスカイ 9050 8060 -11.6%
リログループ 3310 2944 -11.7%
アルプス電気 3135 2788 -11.7%
新報国製鉄 2692 2394 -11.7%
PKSHA Technology 16170 14380 -11.7%
JR東日本 11335 10080 -11.7%
ベガコーポレーション 1352 1201 -11.8%
養命酒製造 2607 2315 -11.9%
ファナック 30560 27125 -11.9%
ブリヂストン 5422 4797 -12.2%
三菱電機 2049 1811 -12.3%
トランザクション 1196 1057 -12.4%
MRT 2013 1773 -12.7%
大和ハウス工業 4516 3975 -12.8%
オムロン 7230 6350 -13.0%
中部飼料 2354 2060 -13.3%
東洋製缶グループホールディングス 1800 1567 -13.9%
ハンズマン 1597 1389 -14.0%
IDEC 3300 2870 -14.0%
アイビー化粧品 5330 4630 -14.1%
銭高組 6570 5700 -14.2%
平河ヒューテック 1394 1208 -14.3%
ビジョン 3270 2832 -14.4%
アマダホールディングス 1654 1431 -14.5%
ニチハ 4930 4265 -14.5%
ローツェ 2803 2424 -14.5%
安川電機 5710 4935 -14.6%
エレコム 2707 2334 -14.8%
ミスミグループ本社 3585 3090 -14.9%
駅探 800 688 -15.1%
サイボウズ 631 542 -15.2%
ニッポン高度紙工業 3515 3015 -15.3%
KeePer技研 1565 1338 -15.7%
NEXT FUNDS 日経平均レバレッジ・インデックス連動型上場投信 22320 19020 -16.0%
安藤ハザマ 934 794 -16.2%
日本たばこ産業 3658 3096 -16.7%
明治ホールディングス 9270 7840 -16.8%
エンバイオ・ホールディングス 2556 2155 -17.1%
ウイルプラスホールディングス 1426 1196 -17.6%
SMC 54710 45880 -17.6%
FPG 1708 1432 -17.6%
ジェイエスエス 1256 1049 -18.0%
平田機工 12140 10130 -18.1%
LIXILグループ 3180 2641 -18.6%
森永乳業 5260 4330 -19.5%
メディアドゥホールディングス 2339 1916 -19.9%
ウッドワン 1786 1463 -19.9%
ビーブレイクシステムズ 4110 3365 -20.0%
アルバック 7670 6250 -20.5%
エスビー食品 13020 10600 -20.6%
山一電機 2268 1843 -20.8%
スミダコーポレーション 2070 1674 -21.2%
六甲バター 2907 2339 -21.7%
オプテックスグループ 7180 5720 -22.7%
そーせいグループ 12210 9620 -23.8%
オカダアイヨン 2118 1664 -24.1%
戸田工業 4735 3715 -24.3%
ビリングシステム 6200 4835 -24.9%
日本ケミコン 3695 2859 -25.7%
ダブル・スコープ 2175 1480 -38.5%
ウルトラファブリックス・ホールディングス 3205 1689 -64.1%

2017年日本株部門の取引レビュー

2017年日本株部門の取引レビューをしました。

日本株取り引きのメイン口座であるSBI証券から取り引き履歴をDLして今年の取り引きのレビューをしました。

  • 合計 15,566万 年初来+44.1%
  • 実現益(税引き前) 3437万
  • うち信用部門での実現益 1680万
  • 信用部門でのコスト(金利、取引手数料など) 153万

実現益TOP5

銘柄 損益
WDBホールディングス 497万
エン・ジャパン 449万
ディップ 312万
シノケングループ 289万
イー・ギャランティ 245万

1,2,3位が全部人材系です。このセクターは派遣単価や求人案件の増加などマクロ経済の追い風を受けて本当に好調でした。
シノケン/Eギャラは2010年くらいから付き合いがある銘柄で、去年からこれらの売却金額を他銘柄への投資に充てています。

実現益WORST5

銘柄 損益
あじかん -190万
ドリコム -141万
ハビックス -132万
タツモ -103万
山一電機 -74万

あじかんは春先、当時の四季報の予想が強気で、同社のコスト構造などから四季報ラインでの着地は難しだろうなぁと独自の計算からは読んでいました。
来期業績の悪化を予想していたのですが、5月に発表された会社予想はそれを大きく下回る減益予想。大きく売られ、私は涙目になりながら、出てくる買い板にとにかく売りをぶつけるようにして切りました。自分なりの予想を売りというアクションに結びつけられなかったのは反省材料。
ドリコムは7月頭にポジション組んで、その後発表された1Qが計画より損益改善したものの市場予想下回ったことを受けて大きく売られました。損切りラインを超えたので損切り。ゲーム株はどうも相性悪いです。
ハビックスは紙おむつや調理ペーパーで使われる不織布の製造メーカーです。ユニチャームや花王に供給しています。最終財が値上げされないと、同社のような中間財メーカーにとって値上げしにくい圧力として働き、その反面、製造コストは原材料高で膨らむという、パンチを右と左から受けるシナリオが考えられるので資金効率も考えて6月に全部切りました。

Quandlを使って1333 マルハニチロの任意の日付の終値を取得

@kuma_9986さんから教えていただいたQuandlを使って1333マルハニチロの任意の日付の終値を取得してみました。 下記、Pythonでのスニペットです。

    import requests

    url = 'https://www.quandl.com/api/v3/datasets/TSE/{code}.json?api_key={API_KEY}&start_date={From}&end_date={To}'

    response = requests.get(url.format(code='1333', API_KEY='xxxxxxxxxxx', From='2017-12-22', To='2017-12-22' ))

    if response.status_code == 200:
        res = response.json()
        return res["dataset"]["data"][0][4]
    return None

API_KEYはQuandlにサインアップするとすぐに発行されました。データのリフレッシュは遅いです。このブログを書いている時点(12/25現在)で本日の終値は取得できないです。

あと、ヒストリカルのデータは分割調整後の値ではないので、分割前後だとこんなことになります。 f:id:nerimplo:20171225220222p:plain

株式分割・併合の予定一覧であれば、株マップ.comに掲載されているのですが、その履歴は見たことないです。 https://jp.kabumap.com/servlets/kabumap/Action?SRC=splitSch/base

諦めるしかないのか。。。。と思っていたらカブドットコム証券がなんと2002年からの分割履歴を公開しています。 株式分割銘柄(取引注意銘柄)|取引注意銘柄 |セミナー・マーケット情報|株のことならネット証券会社【カブドットコム】

2002/08/01に アサヒプリテックが1:500の分割してます。上場廃止になりましたが、当時保有してました。ものすごく懐かしいw

これをDBに突っ込んで4桁のコードをキーに分割履歴を調べて終値調整していけそうですが、データのメンテも面倒だし。。。やはりここは金払ってYahooFinanceのVIPプランを申し込むのがいい気がしてきました( ^ω^ )。