前回まで
ITエンジニアなのにまだ投資やってないの?ITエンジニアならChatGPTでクオンツシステム作って儲けようぜ(https://qiita.com/kazukichi/items/fa6433c3d0115c2b627b)
システムなんかで勝てるの?w
日本の投資家には批判的な意見もまだまだある(詐欺的なものも多いですから)みたいですが、エンジニアの皆さんなら分かるでしょう。
出来る
ですよね。
そもそも、勝ってる投資家はいくつかの情報を判断して買いや売りのタイミングを測っていて、それは全て定量化した情報を元に判断してるわけですから。
システムで勝てない!って言ってる人は結局その戦略が悪いだけでシステムが悪い分けじゃないわけです。
因みにITを駆使して、ブランド苺を生産している
ミガキイチゴ
というのがあるんですが、熟練職人の「感覚」で判断しているものを職人の視線を全てトラッキングして、
どういう時に何処を見て判断しているのか
を数値化して、成功しています。
要は、職人さんが言う「感覚でやってる」というのは実際感覚ではなく、言語化する能力がないだけなわけです。
(ITエンジニアも言語化能力が低くて感覚と言っている人はいますよね)
トレードはまず転び方を学べ!
そもそもの投資の話ですが、
投資とトレードは違う
ものです。
簡単に言えば、
長期保有前提が、
投資
で、
短期(スキャルピングやデイトレ)、中期(スイング)
が、
トレード
になります。
投資であれば、基本は数年、数十年という時間軸で長期で伸ばすのが目的なので、ファンダメンタル分析が必須ですし、確率論はあまり使いません。(最低限はあります)
でも、
- 数分の時間軸で取引するスキャ(スキャルピングの略)
- 数時間の時間軸で取引するデイトレ(デイトレーディングの略)
- 数日〜数週間(数ヶ月の場合も)の時間軸で取引するスイング
なんかは、そもそもそのファンダメンタル分析はほとんど関係ないのです。
数日、数週間で企業業績が大きく変わったり、社会情勢が変わる事はそう多くはないですから。
(もちろん、スイングになるとある程度は財務諸表を見てファンダメンタルもチェックはしますががっつりやる必要性はないです)
そうなると、テクニカル分析でのいわゆる
トレード
という事になり、トレードの世界はカジノの様に
確率
がとても関係してきます。(ここでは一色単に投資と呼びます)
カジノと確率の関係
カジノは確率で勝てない!という常識を覆したソープ
という人の話が面白いので見とくといいです。
投資ってギャンブルでしょ?
全く違います。
ギャンブルにしているのは、その人間ですから。
軍資金が少額な人ほど
一発当てよう
としますよね。大して知識もないのに。ちまちまやっても金が増えないという気持ちが焦りをどんどん生むわけです。(ここでも、軍資金が多い人とで既に違います)
株は簡単に言えば、株を買ってから株価が上がるか下がるかは
2択
なわけなので、50%は負けるというのに。ですね。(もちろん、当人の知識でこの確率は変わるわけで)
その2択に対して全資金投入してたんじゃ、そりゃただの博打=ギャンブルなわけです。
因みにこのカジノでの必勝法の一つに有名なのが
倍掛け(マーチンゲール法やパーレー法)
というものがあり、
常に前回のベット額の倍額を張っていけば、いつかは取り戻せる。
というものなんですが、これも例えばルーレットで黒が10連続で出続ける確率を計算すれば分かるでしょう。
1/2(50%) の 10乗 = 0.097%
です。
https://www.calc-site.com/probabilities/continuous_win
なので、10回連続は流石に出ないと考えるなら、最大10回分ベットする前提で
軍資金を分けてベットしていく
わけです。こういったものは、
資金管理方法
と呼ばれるものの一つになり、投資でも同じになります。
ただ、公式世界記録ではルーレットで連続で黒が出た回数は
27回
なので、10回くらいだと運悪く出てしまって全損の可能性もありますし、途中でこの
確率に対しての資金管理方法
を無視して大賭けしたり、確率計算もせずやれば一気に崩れてしまいます。
これが、投資をギャンブルにしてしまう人の大きな原因です。
資金管理は転び方と一緒
他にも色々ありますが、こういった
- 確率
- 期待値
に基づいた資金管理方法というのは、
スノボーや自転車で言えば、
転び方
ですよね。
転んでも(予想が外れても)、
手痛い怪我(損失)をしない
スポーツでもまず転び方や柔道なら受け身から学ぶ様に投資やトレードでも
まず転び方から学ぶ
のが当たり前なんですよね?
でも、大抵の投資初心者は
「損失をどう少なくしてリスクヘッジするか」より
「どう大儲けするか」
ばかりになってるので、
そりゃ負けるでしょ。
ギャンブルだもん、それ。
って話なわけです。
(僕もそんなん知らずに最初やっていて計算もせずに大掛けしたり焦って買ったり売ったりしてました)
株の場合はさらにボラティリティや投入額だったりでの資金管理も必要不可欠です。
システムトレードを自分で作ろう!
まぁ、投資の前提知識はこれくらいにして(大事な事はまだまたあるけども、ここはQiitaだ!とか言い始める奴いるしね)、簡易的なクオンツシステムを作りましょう。
株価データを取得しよう!
これは、スクレイピングでやってもいいですし、日足であればYahooファイナンスのプレミアム会員?だと3000円いかないくらいで過去何十年ものデータが取れるので、何かしらで取ってください。
プログラミング自体知らない人はウェブカツ[https://webukatu.com]で学んでください(こういう投資ももっと深く教えてます)
Yahooファイナンスはそのままだと一つ一つクリックしてダウンロードしないとなので、4000クリックくらいしてダウンロードする必要ありますけどまぁ、エンジニアならクリックしなくても取得する方法は思いつけますよね?
例えば、悪用厳禁ですが、PHPを使ってスクレイピングでkabutanのサイトの株価を取得するとすればこんな感じになります。(悪用厳禁)
取得したhtmlをphp内で扱えるDOMの形に出来るPHP Simple HTML DOM Parser
というライブラリを使用しました。
<?php
// 実行する
for($i = 0; $$i <= 9999; $$i++){
$rst = getKabuka(sprintf('%04d', $$i));
if(!$rst){
break;
}
}
function getKabuka($code){
$url = "https://kabutan.jp/stock/kabuka?code={$code}&ashi=day&page={$i}";
// html取得
$html = getApiDataCurl($url);
// 銘柄がないなら終了
if(empty($html->find('h2',0)) || empty($html->find('#stockinfo_i2 div a',0))
|| empty($html->find('#main .market',0)) || empty($html->find('.stock_kabuka0 tbody tr',0))){
return;
}
// 株価
$todayKabuka = $html->find('.stock_kabuka0 tbody tr',0);
$data = array(
':date_time' => date('Y-m-d', strtotime('20'.$todayKabuka->find('th time',0)->innertext)),
':start_price' => (float)preg_replace('/,/', '', $todayKabuka->find('td',0)->innertext),
':high_price' => (float)preg_replace('/,/', '', $todayKabuka->find('td',1)->innertext),
':low_price' => (float)preg_replace('/,/', '', $todayKabuka->find('td',2)->innertext),
':end_price' => (float)preg_replace('/,/', '', $todayKabuka->find('td',3)->innertext),
':before_ratio' => !empty($todayKabuka->find('td span',0)->innertext) ? (float)preg_replace('/,/', '', $todayKabuka->find('td span',0)->innertext) : 0,
':before_rate' => !empty($todayKabuka->find('td span',1)->innertext) ? (float)preg_replace('/,/', '', $todayKabuka->find('td span',1)->innertext) : 0,
':volume' => !empty($todayKabuka->find('td',6)->innertext) ? (int)preg_replace('/,/', '', $todayKabuka->find('td',6)->innertext) : 0,
':created_at' => date('Y-m-d H:i:s'));
}
function getApiDataCurl($url, $responseType = "html" ){
$option = [
CURLOPT_RETURNTRANSFER => true, // 文字列として返す
CURLOPT_TIMEOUT => 30, // タイムアウト時間
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_USERAGENT, USER_AGENT_TEXT);
curl_setopt($ch, CURLOPT_COOKIEFILE, COOKIE_PATH);
curl_setopt($ch, CURLOPT_COOKIEJAR, COOKIE_PATH);
$put = curl_exec($ch) or die('error ' . curl_error($ch));
$info = curl_getinfo($ch);
$errno = curl_errno($ch);
$error = curl_error($ch);
curl_close($ch);
$html = str_get_html($put);
if (CURLE_OK !== $errno) {
return false;
}
return $html;
}
株価データは銘柄ごとに
- 日付
- 始値
- 高値
- 安値
- 終値
- 出来高
の情報を取りましょう。
他にも、トレード判断に必要なものはありますが、とりあえずこれだけでもそれなりに分析が出来ます。
PHPの配列に入れるならこんな感じですね。
$stocks = [
['2023-07-01', 500, 550, 490, 520, 850000],
...
];
また、過去データまで取ると途中で株式分割をしていて「修正後終値」というデータもあるので、修正後終値ベースでバックテストするのか先に決めときましょう。
この株価データを元にLaravelとvue.jsで次回から分析をしていきまっす
P.S. CoDMW2で「ウェブカツ」って名前のプレーヤーがいたら僕です。