<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>株をテーマに機械学習を頑張ってみる</title>
<link>https://ameblo.jp/pikopiko9911/</link>
<atom:link href="https://rssblog.ameba.jp/pikopiko9911/rss20.xml" rel="self" type="application/rss+xml" />
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com" />
<description>機械学習をかじってみたくて株でお試し。試行錯誤してみたその記録。</description>
<language>ja</language>
<item>
<title>学習モデルの保存と読み込みに対応してみる</title>
<description>
<![CDATA[ <p>　ここまでの検証作業では採用閾値変えたり、アンダーサンプリング数変えたり、検証データ複数試したり・・・と検証パターンが大量にあるので試行錯誤に結構時間かかってました。最初は1回の学習自体は数十秒でしたが、データ量増やしたあたりから1分以上かかるようにもなり結構な苦痛です。</p><p>&nbsp;</p><p>　だんだんやってられなくなって来たし今後もいろいろなパターンで随時検証していくことも考え、学習モデルの保存と読み込みに対応させたいと思います。 (もっと早くやっとけ！今更気づくなよって話ですが)</p><p>&nbsp;</p><h2 class="limited_heading09" data-entrydesign-alignment="center" data-entrydesign-count-input="part" data-entrydesign-part="limited_heading09" data-entrydesign-tag="h2" data-entrydesign-type="heading" data-entrydesign-ver="1.54.1" style="background:url(https://stat100.ameba.jp/ameblo/entry_designs/v1/sources/assets/limited044_heading.png) no-repeat;background-size:178px 11px;padding-bottom:19px;margin:8px 0;font-weight:bold;color:#424242;font-size:20px;line-height:1.6;min-height:32px;line-break:loose;overflow-wrap:break-word;text-align:center;background-position:center bottom"><span style="display:block"><span data-entrydesign-content="" style="display:block">学習モデルの保存・読み込み</span></span></h2><p>　モデルの読み書きをしてくれるモジュールは「pickle」と「joblib」があるようです。「joblib」は保存サイズを圧縮して小さくしてくれるようですが、その分読み込みも遅くなるとのことなので、とりあえず「pickle」を使ってみます。</p><p>&nbsp;</p><p>　「pickle」の使い方は、保存したい場合は</p><pre class="code" data-lang="" data-unlink="" style=" color: #0000FF; background-color: #F2F2F2; ,margin: 0px 0px 10px; padding: 20px; border: 1px solid #eceef1; overflow: auto; font-family: Monaco, Consolas, 'Courier New', Courier, monospace, sans-serif; font-size: 1em; white-space: pre;">pickle.dump(model , open(filename,'wb'))#model:学習したモデル、filename:保存先のファイル</pre><p>&nbsp;</p><p>&nbsp;</p><p>　読み込みたい場合は</p><pre class="code" data-lang="" data-unlink="" style=" color: #0000FF; background-color: #F2F2F2; ,margin: 0px 0px 10px; padding: 20px; border: 1px solid #eceef1; overflow: auto; font-family: Monaco, Consolas, 'Courier New', Courier, monospace, sans-serif; font-size: 1em; white-space: pre;">model = pickle.load(open(filename, 'rb'))#model:読み込んだモデルを格納する変数、filename:保存先のファイル</pre><p>&nbsp;</p><p>これでできるようです。'wb'は書き込みモード(writeのw)とバイナリモード(binaryのb)だそうで、読み込みの場合は'rb'(readのr)ですね。</p><p>&nbsp;</p><p>　サイズは「350kb」程度でした。学習モデルってこんなに小さいですね。圧縮なんて必要なさそうです。読み込み時間もほぼ瞬殺。検証データのdataframeへの読み込みと前処理に時間は多少かかって数十秒待ちますが、全体時間は体感的にかなり早くなりました。</p><p>&nbsp;</p><p>　プログラム自体は、学習・予測はバギングのため10個モデルを作って予測の平均を取るプログラムでしたので、保存も10回、読み込みも10回行ってバギングにも対応させてます。</p><p>&nbsp;</p><p>　学習モデル生成して保存するとき</p><pre class="code" data-lang="" data-unlink="" style=" color: #0000FF; background-color: #F2F2F2; ,margin: 0px 0px 10px; padding: 20px; border: 1px solid #eceef1; overflow: auto; font-family: Monaco, Consolas, 'Courier New', Courier, monospace, sans-serif; font-size: 1em; white-space: pre;">##学習モデル作成 バギングのためのbagging()関数を10回読んでモデルを配列に格納model=[]for i in range(10):    model.append(bagging(i,X,y))##bagging関数の内容はLightGBMで学習・検証別記事ご参照。# 構築したモデルの保存for m in model:    filename = "ファイル名" +str( m+1) + ".pkl" ## バギング用に複数ファイル作成対応。連番を付けてモデル格納配列分ファイル名が変わるように。0番をなくすため＋1してある。    pickle.dump(m,open(filename,'wb'))</pre><p>&nbsp;</p><p>　学習モデルを読み込むとき</p><pre class="code" data-lang="" data-unlink="" style=" color: #0000FF; background-color: #F2F2F2; ,margin: 0px 0px 10px; padding: 20px; border: 1px solid #eceef1; overflow: auto; font-family: Monaco, Consolas, 'Courier New', Courier, monospace, sans-serif; font-size: 1em; white-space: pre;">##学習モデル読み込み。 バギング分10回読んでモデルを配列に格納model=[]for i in range(10):    filename = "ファイル名" + str(i+1) + ".pkl"    model.append(pickle.load(open(filename, 'rb')))</pre><p>&nbsp;</p><p>　これで少しストレスから解放されて検証作業ができるようになる・・・かな。</p>
]]>
</description>
<link>https://ameblo.jp/pikopiko9911/entry-12802614380.html</link>
<pubDate>Fri, 23 Jun 2023 20:27:55 +0900</pubDate>
</item>
<item>
<title>学習データを変更(日次騰落ベースに)</title>
<description>
<![CDATA[ <p><style type="text/css">table {margin: auto; border-collapse: collapse; border: 1px solid #333;text-align:center ;padding: 1px;}td {border-collapse: collapse; border: 1px solid #333;text-align:center ;padding: 1px;}th {background: #fff3B8 ;border-collapse: collapse; border: 1px solid #333 ;text-align:center ;padding: 1px;}.dvt{overflow: auto ; white-space: nowrap;}</style></p><p>　投稿がしばらく空いてしまいましたがまた少しずつ書いていきたいと思います。</p><p>&nbsp;</p><p>　今回は学習データを思い切って変えてみました。これまでは週次で約52週分の騰落データで様々なアルゴリズムなどを試してきましたが、これを日次騰落ベースにしてみます。</p><p>&nbsp;</p><h2 class="limited_heading09" data-entrydesign-alignment="center" data-entrydesign-count-input="part" data-entrydesign-part="limited_heading09" data-entrydesign-tag="h2" data-entrydesign-type="heading" data-entrydesign-ver="1.54.1" style="background:url(https://stat100.ameba.jp/ameblo/entry_designs/v1/sources/assets/limited044_heading.png) no-repeat;background-size:178px 11px;padding-bottom:19px;margin:8px 0;font-weight:bold;color:#424242;font-size:20px;line-height:1.6;min-height:32px;line-break:loose;overflow-wrap:break-word;text-align:center;background-position:center bottom"><span style="display:block"><span data-entrydesign-content="" style="display:block">新データの概要</span></span></h2><p>　新しいデータは日次の騰落ベースになりますが、以下の条件は変えていません。</p><ul><li>学習データは2017年～2021年の株価で週次ベースと同じ約2000銘柄</li><li>目的変数は変更せず1週～4週後の株価の騰落率(基本2週後をターゲットに試す)</li><li>目的変数は10%以上の上昇(売りケースは下落)を正解とする</li></ul><p>&nbsp;</p><p>　データの内容はざっとは以下のような感じにしました。</p><ul><li>2017年以降の毎日を基準日に</li><li>基準日から見て30日(30取引日)前からの騰落率をセット</li><li>株価の騰落率に加えて出来高の増減率も30日分セット</li><li>30日間の最大値、最小値と基準日の株価の乖離率をセット(ついでに出来高の最大、最小との乖離も)</li><li>基準日の5日平均、25日平均、75日平均との乖離率をセット</li></ul><p>&nbsp;</p><h2 class="limited_heading09" data-entrydesign-alignment="center" data-entrydesign-count-input="part" data-entrydesign-part="limited_heading09" data-entrydesign-tag="h2" data-entrydesign-type="heading" data-entrydesign-ver="1.54.1" style="background:url(https://stat100.ameba.jp/ameblo/entry_designs/v1/sources/assets/limited044_heading.png) no-repeat;background-size:178px 11px;padding-bottom:19px;margin:8px 0;font-weight:bold;color:#424242;font-size:20px;line-height:1.6;min-height:32px;line-break:loose;overflow-wrap:break-word;text-align:center;background-position:center bottom"><span style="display:block"><span data-entrydesign-content="" style="display:block">検証結果(2022年データ)</span></span></h2><p>　2022年のデータで検証しました。週次ベースと比較のため同じようなプログラムで動くように以下の条件は固定で検証しています</p><ul><li>アルゴリズムはLightGBM</li><li>アンダーサンプリングは5倍で実施。(正解(目的変数が１)に対し０の行数を5倍に設定</li><li>バギングは週次ベースの時と同じく10回</li><li>検証データの正解は0%以上の上昇(もしくは0%以上の下落)とする</li><li>検証データの予測対象日は2022年の全日</li></ul><p>&nbsp;</p><p>　この条件で結果を見ていきたいと思います。表の学習データは以下の条件です。</p><ul><li>学習１：学習データを火曜のみに絞る</li><li>学習２：学習データを全ての日を対象にする</li></ul><p>&nbsp;</p><div class="dvt"><table><caption><b>買い：0%以上上昇したか？の結果</b></caption><tbody><tr><th rowspan="2">採用閾値</th><th colspan="3">学習１</th><th colspan="3">学習２</th></tr><tr><th>×</th><th>〇</th><th>率</th><th>×</th><th>〇</th><th>率</th></tr><tr><td align="center">50%以上</td><td align="center">891</td><td align="center">824</td><td align="center">48.0%</td><td align="center">1680</td><td align="center">1551</td><td align="center">48.0%</td></tr><tr><td align="center">55%以上</td><td align="center">476</td><td align="center">442</td><td align="center">48.1%</td><td align="center">974</td><td align="center">943</td><td align="center">49.2%</td></tr><tr><td align="center">60%以上</td><td align="center">213</td><td align="center">220</td><td align="center">50.8%</td><td align="center">529</td><td align="center">511</td><td align="center">49.1%</td></tr><tr><td align="center">65%以上</td><td align="center">89</td><td align="center">109</td><td align="center">55.1%</td><td align="center">260</td><td align="center">248</td><td align="center">48.8%</td></tr><tr><td align="center">70%以上</td><td align="center">36</td><td align="center">39</td><td align="center">52.0%</td><td align="center">95</td><td align="center">81</td><td align="center">46.0%</td></tr><tr><td align="center">75%以上</td><td align="center">6</td><td align="center">7</td><td align="center">53.8%</td><td align="center">39</td><td align="center">22</td><td align="center">36.1%</td></tr><tr><td align="center">80%以上</td><td align="center">0</td><td align="center">0</td><td align="center">-%</td><td align="center">8</td><td align="center">7</td><td align="center">46.7%</td></tr></tbody></table></div><p>&nbsp;</p><p>　なんとも使えなさそうなモデルですね。採用する予測確率上げても結果は良くなってきません。どの確率でも平均的に勝ちも負けも予測してしまっていますので、何の特徴も捉えられてないってことでしょう。単純に日次の動きからはなかなかパターン化できないようです。</p><p>　例えば直近数日の特徴量がプラスだと上がりやすいだとか、チャート理論に近いパターンを見つけるんじゃないかと期待していたんですが、単純に日別に並べただけではダメなようですね。この辺はもうちょっと工夫が必要そうです。</p><p>&nbsp;</p><p>　次に売りを見てみます。</p><p>&nbsp;</p><div class="dvt"><table><caption><b>売り：0%以上下落したか？の結果</b></caption><tbody><tr><th rowspan="2">採用閾値</th><th colspan="3">学習１</th><th colspan="3">学習２</th></tr><tr><th>×</th><th>〇</th><th>率</th><th>×</th><th>〇</th><th>率</th></tr><tr><td align="center">50%以上</td><td align="center">1645</td><td align="center">2666</td><td align="center">61.8%</td><td align="center">1430</td><td align="center">2441</td><td align="center">63.1%</td></tr><tr><td align="center">55%以上</td><td align="center">847</td><td align="center">1602</td><td align="center">65.4%</td><td align="center">765</td><td align="center">1531</td><td align="center">66.7%</td></tr><tr><td align="center">60%以上</td><td align="center">450</td><td align="center">975</td><td align="center">68.4%</td><td align="center">411</td><td align="center">954</td><td align="center">69.9%</td></tr><tr><td align="center">65%以上</td><td align="center">247</td><td align="center">603</td><td align="center">70.9%</td><td align="center">227</td><td align="center">585</td><td align="center">72.0%</td></tr><tr><td align="center">70%以上</td><td align="center">135</td><td align="center">380</td><td align="center">73.8%</td><td align="center">117</td><td align="center">351</td><td align="center">75.0%</td></tr><tr><td align="center">75%以上</td><td align="center">51</td><td align="center">181</td><td align="center">78.0%</td><td align="center">42</td><td align="center">177</td><td align="center">80.8%</td></tr></tbody></table></div><p>&lt;</p><p>&nbsp;</p><p>　売りの方はまずまずの結果になりました。なんで同じデータで売りと買いでこんなに傾向が異なってくるか不思議ですが、売りは予想確率が高いほど成績が良い結果になっていて、きちんと傾向捉えて予測できている感じですね。予想確率70%以上だと正答率も75%をただき出してくれてますので利用価値はありそうです。今までの検証結果から推測すると実際に売買しても75%正答率なら利益は出てるでしょう。</p><p>&nbsp;</p><p>　あとは、火曜に絞るか全日かでは大きな違いは出なく少し全日データの方が成績も良い状況なのでデータ量が増えた方が精度も多少上がるという感じですね。</p><p>　とりあえずデータ変更の結果と考察はこんなところです。</p><p>&nbsp;</p>
]]>
</description>
<link>https://ameblo.jp/pikopiko9911/entry-12808495916.html</link>
<pubDate>Wed, 21 Jun 2023 20:35:05 +0900</pubDate>
</item>
<item>
<title>株予測の対象日を増やす改良をしてみた(週1回⇒毎日できるように)</title>
<description>
<![CDATA[ <p><style type="text/css">table {margin: auto; border-collapse: collapse; border: 1px solid #333;text-align:center ;padding: 1px;}td {border-collapse: collapse; border: 1px solid #333;text-align:center ;padding: 1px;}th {background: #fff3B8 ;border-collapse: collapse; border: 1px solid #333 ;text-align:center ;padding: 1px;}.dvt{overflow: auto ; white-space: nowrap;}.caption-center {text-align: center;}</style></p><p>　今回は、予測用データ(検証データ)を改良して予測対象日を増やすことを考えてみた記録です。</p><p>&nbsp;</p><h2 class="limited_heading09" data-entrydesign-alignment="center" data-entrydesign-count-input="part" data-entrydesign-part="limited_heading09" data-entrydesign-tag="h2" data-entrydesign-type="heading" data-entrydesign-ver="1.54.1" style="background:url(https://stat100.ameba.jp/ameblo/entry_designs/v1/sources/assets/limited044_heading.png) no-repeat;background-size:178px 11px;padding-bottom:19px;margin:8px 0;font-weight:bold;color:#424242;font-size:20px;line-height:1.6;min-height:32px;line-break:loose;overflow-wrap:break-word;text-align:center;background-position:center bottom"><span style="display:block"><span data-entrydesign-content="" style="display:block">データの改良</span></span></h2><p>　これまで作ってきた機械学習モデルは、主に2017年～2021年の株価を学習データとして2022年度の予測と結果検証を中心に行ってきました。</p><p>　データの構造としては週次ベースでの騰落を見てましたので、学習データも検証データも週1回(原則火曜日)を基準日としたデータで行っていました。</p><p>&nbsp;</p><p>　これだと毎週火曜日のみが予測日となりますが、検証結果を見ていると予測数に大きな波があってある日に集中したりとか数か月対象がなかったりというケースも見て取れました。もう少し予測での推奨対象を増やすことができないかと思い、毎日予測できるように検証データ側を改良してみたいと思います。</p><p>&nbsp;</p><p>　やってみたことはデータの構造は変えずに、データ作成の基準日を週次⇒毎日化する改良です。イメージとしては以下のような感じですね。</p><p>&nbsp;</p><p style="text-align: center;">&nbsp;</p><figure><figcaption class="caption-center"><b>データ変更のイメージ</b></figcaption><a href="https://stat.ameba.jp/user_images/20230511/09/pikopiko9911/7c/7e/p/o1529076715282681705.png"><img alt="データ変更イメージ" contenteditable="inherit" height="311" src="https://stat.ameba.jp/user_images/20230511/09/pikopiko9911/7c/7e/p/o1529076715282681705.png" width="620"></a></figure><p>&nbsp;</p><p>&nbsp;</p><p>　予測用データ作成のプログラムを見直したついでに、学習データも毎日データを作れるようにしました。これで、</p><ul><li>①：元々の2017年～2021年の学習データ</li><li>②：2017年から2021年の全ての取引日(毎日版)</li><li>③：②をベースに火曜だけに絞った版</li></ul><p>の3つの学習データパターンとなりました。</p><p>&nbsp;</p><p>　①と③の違いですが、元のデータは火曜が祝日や非取引日の場合は週初の取引日(月曜も祝日なら水曜以降)のデータを作る仕様でした。②は完全に火曜だけのデータに絞ってるので少しだけ違う形になります。</p><p>&nbsp;</p><h2 class="limited_heading09" data-entrydesign-alignment="center" data-entrydesign-count-input="part" data-entrydesign-part="limited_heading09" data-entrydesign-tag="h2" data-entrydesign-type="heading" data-entrydesign-ver="1.54.1" style="background:url(https://stat100.ameba.jp/ameblo/entry_designs/v1/sources/assets/limited044_heading.png) no-repeat;background-size:178px 11px;padding-bottom:19px;margin:8px 0;font-weight:bold;color:#424242;font-size:20px;line-height:1.6;min-height:32px;line-break:loose;overflow-wrap:break-word;text-align:center;background-position:center bottom"><span style="display:block"><span data-entrydesign-content="" style="display:block">データ改良後の正答率の変化</span></span></h2><p>　予測データを毎日化した後の正答率の変化を見てみたいと思います。学習データも3パターンになりましたのでそれぞれで。もちろんアルゴリズムはLightGBM版です。</p><p>　予測データの比較対象は「元の予測用データ(火曜ベースの祝日対応あり(学習データの①と同等))」と「毎日対応版データ」の2パターンで年度は2022年度になります。アンダーさんプリンは5倍のみに固定。正答率はとにかく騰がったか(0%以上騰がったか)どうかのみ確認しました。</p><p>&nbsp;</p><p>　「買い」と「売り」両方を検証しています。まずは買いから。</p><p>&nbsp;</p><div class="dvt"><table><caption><b>買い(0%以上上昇したか？)の結果</b></caption><tbody><tr><th rowspan="3">採用閾値</th><th colspan="6">学習データ①</th><th colspan="6">学習データ②</th><th colspan="6">学習データ③</th></tr><tr><th colspan="3">元の予測データ</th><th colspan="3">毎日化データ</th><th colspan="3">元の予測データ</th><th colspan="3">毎日化データ</th><th colspan="3">元の予測データ</th><th colspan="3">毎日化データ</th></tr><tr><th>×</th><th>〇</th><th>率</th><th>×</th><th>〇</th><th>率</th><th>×</th><th>〇</th><th>率</th><th>×</th><th>〇</th><th>率</th><th>×</th><th>〇</th><th>率</th><th>×</th><th>〇</th><th>率</th></tr><tr><td align="center">45%以上</td><td align="center">317</td><td align="center">953</td><td align="center">75.0%</td><td align="center">1075</td><td align="center">2408</td><td align="center">69.1%</td><td align="center">326</td><td align="center">321</td><td align="center">49.6%</td><td align="center">1515</td><td align="center">1440</td><td align="center">48.7%</td><td align="center">304</td><td align="center">985</td><td align="center">76.4%</td><td align="center">990</td><td align="center">2274</td><td align="center">71.6%</td></tr><tr><td align="center">50%以上</td><td align="center">104</td><td align="center">687</td><td align="center">86.9%</td><td align="center">319</td><td align="center">1466</td><td align="center">81.9%</td><td align="center">102</td><td align="center">105</td><td align="center">50.7%</td><td align="center">469</td><td align="center">470</td><td align="center">50.1%</td><td align="center">112</td><td align="center">694</td><td align="center">86.1%</td><td align="center">260</td><td align="center">1411</td><td align="center">84.4%</td></tr><tr><td align="center">55%以上</td><td align="center">49</td><td align="center">490</td><td align="center">90.9%</td><td align="center">106</td><td align="center">899</td><td align="center">89.5%</td><td align="center">25</td><td align="center">33</td><td align="center">56.9%</td><td align="center">141</td><td align="center">151</td><td align="center">51.7%</td><td align="center">43</td><td align="center">501</td><td align="center">92.1%</td><td align="center">86</td><td align="center">920</td><td align="center">91.5%</td></tr><tr><td align="center">60%以上</td><td align="center">17</td><td align="center">314</td><td align="center">94.9%</td><td align="center">39</td><td align="center">503</td><td align="center">92.8%</td><td align="center">4</td><td align="center">10</td><td align="center">71.4%</td><td align="center">44</td><td align="center">45</td><td align="center">50.6%</td><td align="center">21</td><td align="center">344</td><td align="center">94.2%</td><td align="center">36</td><td align="center">578</td><td align="center">94.1%</td></tr><tr><td align="center">65%以上</td><td align="center">10</td><td align="center">181</td><td align="center">94.8%</td><td align="center">17</td><td align="center">245</td><td align="center">93.5%</td><td align="center">1</td><td align="center">2</td><td align="center">66.7%</td><td align="center">12</td><td align="center">15</td><td align="center">55.6%</td><td align="center">11</td><td align="center">192</td><td align="center">94.6%</td><td align="center">21</td><td align="center">287</td><td align="center">93.2%</td></tr></tbody></table></div><p>&nbsp;</p><p>　ますは元々の学習データ①の中での毎日化の結果から。毎日化することで少し悪化しています。それでも閾値50%以上でも正答率は80%以上は維持してるので充分使えそうですね。対象も約3倍に増えてるので売買機会も増加が期待できそうです(日々の予測対象の発生有無の偏りまでは見てませんが)</p><p>&nbsp;</p><p>　次に②の学習データで見ると、ん？、成績も悪化してるし予測対象数も減っている。銘柄数を増やしたときには成績が圧倒的に上がったんですが、同じ銘柄数で対象日数増やすとこうなるんですね。過学習とか不均衡データなどの機械学習の問題なのか株価変動の特性なのか良く分かりませんが。</p><p>　②のデータで火曜だけに絞った場合の③の学習データは①とほぼ近い値をたたき出してくれてます。大半のデータは同じはずなので当たり前でしょうが、少し成績が上がってるのがうれしいところですね。</p><p>&nbsp;</p><p>　ここで少し面白いことに気づきました。学習データが毎日化された②は、検証データが火曜のパターンと毎日化のパターンで予測対象数に約5倍の差があります。ほぼ曜日が増えた分だけきれいに対象数が増えてる感じです。これに比べて①と③は約3倍程度です。ここから見るとそもそも株価自体に曜日特性があって、火曜の変動パターンが見事にはまってくれてるのかもしれません。他の曜日でも同じ波動で動く上昇をうまくとらえて予測してくれてると思いました。まあとにかく最初に火曜を選択して学習データ作ったこと自体がラッキーだったのかもしれませんが火曜ベースの学習データは結構使えることが分かりました。</p><p>&nbsp;</p><p>　次に「売り」に関してです。まずは結果から</p><p>&nbsp;</p><div class="dvt"><table><caption><b>売り(0%以上下落したか？)の結果</b></caption><tbody><tr><th rowspan="3">採用閾値</th><th colspan="6">学習データ①</th><th colspan="6">学習データ②</th><th colspan="6">学習データ③</th></tr><tr><th colspan="3">元の予測データ</th><th colspan="3">毎日化データ</th><th colspan="3">元の予測データ</th><th colspan="3">毎日化データ</th><th colspan="3">元の予測データ</th><th colspan="3">毎日化データ</th></tr><tr><th>×</th><th>〇</th><th>率</th><th>×</th><th>〇</th><th>率</th><th>×</th><th>〇</th><th>率</th><th>×</th><th>〇</th><th>率</th><th>×</th><th>〇</th><th>率</th><th>×</th><th>〇</th><th>率</th></tr><tr><td align="center">65%以上</td><td align="center">74</td><td align="center">149</td><td align="center">66.8%</td><td align="center">1107</td><td align="center">1284</td><td align="center">53.7%</td><td align="center">154</td><td align="center">198</td><td align="center">56.3%</td><td align="center">821</td><td align="center">1068</td><td align="center">56.5%</td><td align="center">79</td><td align="center">177</td><td align="center">69.1%</td><td align="center">1028</td><td align="center">1302</td><td align="center">55.9%</td></tr><tr><td align="center">70%以上</td><td align="center">33</td><td align="center">87</td><td align="center">72.5%</td><td align="center">570</td><td align="center">739</td><td align="center">56.5%</td><td align="center">73</td><td align="center">108</td><td align="center">59.7%</td><td align="center">342</td><td align="center">575</td><td align="center">62.7%</td><td align="center">44</td><td align="center">99</td><td align="center">69.2%</td><td align="center">543</td><td align="center">739</td><td align="center">57.6%</td></tr><tr><td align="center">75%以上</td><td align="center">11</td><td align="center">49</td><td align="center">81.7%</td><td align="center">267</td><td align="center">367</td><td align="center">57.9%</td><td align="center">21</td><td align="center">48</td><td align="center">69.6%</td><td align="center">95</td><td align="center">237</td><td align="center">71.4%</td><td align="center">14</td><td align="center">55</td><td align="center">79.7%</td><td align="center">242</td><td align="center">388</td><td align="center">61.6%</td></tr><tr><td align="center">80%以上</td><td align="center">3</td><td align="center">10</td><td align="center">76.9%</td><td align="center">115</td><td align="center">165</td><td align="center">58.9%</td><td align="center">2</td><td align="center">14</td><td align="center">87.5%</td><td align="center">18</td><td align="center">52</td><td align="center">74.3%</td><td align="center">5</td><td align="center">27</td><td align="center">84.4%</td><td align="center">92</td><td align="center">155</td><td align="center">62.8%</td></tr><tr><td align="center">85%以上</td><td align="center">0</td><td align="center">3</td><td align="center">100%</td><td align="center">33</td><td align="center">50</td><td align="center">60.2%</td><td align="center">0</td><td align="center">3</td><td align="center">100%</td><td align="center">0</td><td align="center">5</td><td align="center">100%</td><td align="center">1</td><td align="center">9</td><td align="center">90.0%</td><td align="center">10</td><td align="center">33</td><td align="center">76.7%</td></tr></tbody></table></div><p>&nbsp;</p><p>　売りの方は良く分かりません。とりあえず学習データ①も③毎日化で正答率が大幅に悪化。予測数も10倍に増えてる。なんで買いとこんなに変わるのかは分かりませんが、火曜オンリーのモデルな感じです。ただ、②のデータは予測データが火曜日ベースと毎日化で5倍程度の違いなのでとにかく学習データ②は買いでも売りでもまんべんなく平均的な動きを予測してるんだろうとは思います。</p><p>　②の毎日化学習データで予測データも毎日化を対象とすると閾値75%以上だと正答率が70%超えてきてますのでこれは使えそうです。ここまでの仮装売買結果見てると正答率が70%超えてこれば確実に儲かる感じでしたし(仮想売買結果をここだけ見てみましたがやはり300万程度儲かっていた)。売りは②と③を予測日で使い分けたり組み合わせたりする感じですね。</p><p>&nbsp;</p><p>　②と③での予測対象の比較とか、曜日特性ももっと深堀するといろいろ見えてくるかもしれませんがここで止めておきます。</p><p>&nbsp;</p><p>　結果からみると「買いモデル」は①か③で毎日予測しても使えそうで、「売りモデル」は火曜日を①か③のモデルメインに他の曜日は②を使いつつという感じですね。(何度も同じこと書きますがあくまで22年に売買していた場合！ですけどね)</p>
]]>
</description>
<link>https://ameblo.jp/pikopiko9911/entry-12802440194.html</link>
<pubDate>Fri, 19 May 2023 12:03:59 +0900</pubDate>
</item>
<item>
<title>学習・検証をする⑪　売り(信用売)の2021年以前データでの検証 ついでに仮想売買成績も</title>
<description>
<![CDATA[ <p><style type="text/css">table {margin: auto; border-collapse: collapse; border: 1px solid #333;text-align:center ;padding: 1px;}td {border-collapse: collapse; border: 1px solid #333;text-align:center ;padding: 1px;}th {background: #fff3B8 ;border-collapse: collapse; border: 1px solid #333 ;text-align:center ;padding: 1px;}.dvt{overflow: auto ; white-space: nowrap;}</style></p><p>　LightGBMモデルでの売りバージョンでも2022年度予測成績はまずまずの結果を出してくれました。売りのケースでの2021年以前の場合も見てみたいと思います。</p><p>&nbsp;</p><h2 class="limited_heading09" data-entrydesign-alignment="center" data-entrydesign-count-input="part" data-entrydesign-part="limited_heading09" data-entrydesign-tag="h2" data-entrydesign-type="heading" data-entrydesign-ver="1.54.1" style="background:url(https://stat100.ameba.jp/ameblo/entry_designs/v1/sources/assets/limited044_heading.png) no-repeat;background-size:178px 11px;padding-bottom:19px;margin:8px 0;font-weight:bold;color:#424242;font-size:20px;line-height:1.6;min-height:32px;line-break:loose;overflow-wrap:break-word;text-align:center;background-position:center bottom"><span style="display:block"><span data-entrydesign-content="" style="display:block">2021年以前の検証結果</span></span></h2><p>　データ量も多く分割したりと時間がかかるので、多くは試してません。下記の条件のみで検証してます</p><ul><li>買いの時の検証と同じく学習データを銘柄順に振り分けて半分に分割。もう半分を検証データに。</li><li>アンダーサンプリングは5倍のみに固定</li><li>0%以上の上昇のみ</li></ul><p>&nbsp;</p><p>　結果は以下のようになりました</p><p>&nbsp;</p><p>※分割した半分づつをデータ１、データ２としてそれぞれで学習・予測を行ってます。</p><div class="dvt"><table><caption><b>0%以上上昇したか？の結果</b></caption><tbody><tr><th rowspan="2">採用閾値</th><th colspan="3">１で２を予測</th><th colspan="3">２で１を予測</th></tr><tr><th>×</th><th>〇</th><th>率</th><th>×</th><th>〇</th><th>率</th></tr><tr><td align="center">60%以上</td><td align="center">510</td><td align="center">5525</td><td align="center">91.5%</td><td align="center">420</td><td align="center">5320</td><td align="center">92.7%</td></tr><tr><td align="center">65%以上</td><td align="center">317</td><td align="center">4703</td><td align="center">93.7%</td><td align="center">269</td><td align="center">4592</td><td align="center">94.5%</td></tr><tr><td align="center">70%以上</td><td align="center">184</td><td align="center">4011</td><td align="center">95.6%</td><td align="center">144</td><td align="center">3973</td><td align="center">96.5%</td></tr><tr><td align="center">75%以上</td><td align="center">89</td><td align="center">3400</td><td align="center">97.4%</td><td align="center">79</td><td align="center">3405</td><td align="center">97.7%</td></tr><tr><td align="center">80%以上</td><td align="center">48</td><td align="center">2877</td><td align="center">98.4%</td><td align="center">41</td><td align="center">2842</td><td align="center">98.6%</td></tr></tbody></table></div><p>&nbsp;</p><p>　買いの時と同じく2022年と比べて成績が良くなってます。むしろ良くなりすぎ。閾値60%でも正答率90%超えは異常ですね。やはり違う銘柄とは言え予測したい銘柄と同じ日のデータが学習側にもあるので、株式市場自体の動きが影響しちゃうんでしょうね。</p><p>&nbsp;</p><h2 class="limited_heading09" data-entrydesign-alignment="center" data-entrydesign-count-input="part" data-entrydesign-part="limited_heading09" data-entrydesign-tag="h2" data-entrydesign-type="heading" data-entrydesign-ver="1.54.1" style="background:url(https://stat100.ameba.jp/ameblo/entry_designs/v1/sources/assets/limited044_heading.png) no-repeat;background-size:178px 11px;padding-bottom:19px;margin:8px 0;font-weight:bold;color:#424242;font-size:20px;line-height:1.6;min-height:32px;line-break:loose;overflow-wrap:break-word;text-align:center;background-position:center bottom"><span style="display:block"><span data-entrydesign-content="" style="display:block">仮想売買の結果</span></span></h2><p>　売買結果も一応見てみます。あれだけ正答率の成績が良ければ儲かるはずなんでしょうが、買いの時には年によって予測対象の数が異常に少なかったりとバラつきがありましたので、同じような感じかを確認してみました。</p><p>&nbsp;</p><p><a href="https://ameblo.jp/pikopiko9911/entry-12795565328.html" rel="noopener noreferrer" target="_blank">買いのケースの仮装売買結果はこちら</a></p><div class="ogpCard_root"><article class="ogpCard_wrap" contenteditable="false" style="display:inline-block;max-width:100%"><a class="ogpCard_link" data-ogp-card-log="" href="https://ameblo.jp/pikopiko9911/entry-12795565328.html" rel="noopener noreferrer" style="display:flex;justify-content:space-between;overflow:hidden;box-sizing:border-box;width:620px;max-width:100%;height:120px;border:1px solid #e2e2e2;border-radius:4px;background-color:#fff;text-decoration:none" target="_blank"><span class="ogpCard_content" style="display:flex;flex-direction:column;overflow:hidden;width:100%;padding:16px"><span class="ogpCard_title" style="-webkit-box-orient:vertical;display:-webkit-box;-webkit-line-clamp:2;max-height:48px;line-height:1.4;font-size:16px;color:#333;text-align:left;font-weight:bold;overflow:hidden">『22年の仮想売買成績を再度チェック(学習データ量が増加したので)。ついでに21年以前も』</span><span class="ogpCard_description" style="overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.6;margin-top:4px;color:#757575;text-align:left;font-size:12px">　データ量を増加させて新しく学習したモデルは格段に成績がアップしました。(モデルの正答率の検証結果はこちら(22年分)とこちら(21年以前分))&nbsp;　それに伴っ…</span><span class="ogpCard_url" style="display:flex;align-items:center;margin-top:auto"><span class="ogpCard_iconWrap" style="position:relative;width:20px;height:20px;flex-shrink:0"><img alt="リンク" class="ogpCard_icon" height="20" loading="lazy" src="https://c.stat100.ameba.jp/ameblo/symbols/v3.20.0/svg/gray/editor_link.svg" style="position:absolute;top:0;bottom:0;right:0;left:0;height:100%;max-height:100%" width="20"></span><span class="ogpCard_urlText" style="overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#757575;font-size:12px;text-align:left">ameblo.jp</span></span></span><span class="ogpCard_imageWrap" style="position:relative;width:120px;height:120px;flex-shrink:0"><img alt="" class="ogpCard_image" data-ogp-card-image="" height="120" loading="lazy" src="https://stat.profile.ameba.jp/profile_images/20230426/01/84/p1/p/o03840384p_1682439767322_uyxt8.png" style="position:absolute;top:50%;left:50%;object-fit:cover;min-height:100%;min-width:100%;transform:translate(-50%,-50%)" width="120"></span></a></article></div><p>&nbsp;</p><p>　対象は「データ１(学習)⇒データ２(予測)」のパターンで採用閾値は70%以上のみです。また、いつものごとく制限あり(500万持ち高制限、単元数の調整あり(20万程度)、1単元100万以上は買わない)パターンと、1単元ずつひたすら売る場合の2パターンで確認してます。両方とも10%の損失カットはありです。</p><p>&nbsp;</p><div class="dvt"><table><caption><b>21年以前の仮装売買の結果(信用売のケース)</b></caption><tbody><tr><th rowspan="2">年度</th><th colspan="2">制限あり</th><th colspan="2">制限なし</th></tr><tr><th>売買回数</th><th>利益</th><th>回数</th><th>利益</th></tr><tr><td align="center">2017年</td><td align="center">29回</td><td align="center">370,850円</td><td align="center">30回</td><td align="center">132,700円</td></tr><tr><td align="center">2018年</td><td align="center">96回</td><td align="center">2,869,330円</td><td align="center">906回</td><td align="center">20,490,530円</td></tr><tr><td align="center">2019年</td><td align="center">68回</td><td align="center">591,240円</td><td align="center">773回</td><td align="center">1,601,100円</td></tr><tr><td align="center">2020年</td><td align="center">99回</td><td align="center">4,399,110円</td><td align="center">941回</td><td align="center">36,937,350円</td></tr><tr><td align="center">2021年</td><td align="center">42回</td><td align="center">-117,190円</td><td align="center">41回</td><td align="center">1,033.130円</td></tr><tr><td align="center">合計</td><td align="center">&nbsp;</td><td align="center">8,113,340円</td><td align="center">&nbsp;</td><td align="center">60,194,810円</td></tr></tbody></table></div><p>&nbsp;</p><p>　買いの時と同じく年度ごとの波は出てます。買いが少ない年を補完してくれるかと思いましたがそうは都合よくいかず少ない年は売りも買いも推奨が少ないという結果でした。</p><p>あと、制限ありのさいに21年度がマイナスになってますね。まあ単元ずつ買ってればプラスなので少額の銘柄でマイナスが多かったんでしょね。全体で大きくプラスなのでまあよしとします。</p><p>　売買内容を見てみると多い年はある日に推奨銘柄が集中してます。多い日だと百銘柄以上出てる時もある感じで。でもそういう日はほとんどの株が利益出た状態なので、複数銘柄を推奨予測してくれた時が売り時(買い時)なんでしょうね。買いの2022年度検証でも集中して出てた日があったので、未知のデータの予測であっても同じ傾向が見て取れます。</p><p>&nbsp;</p><p>　ちなみに、1単元ずつひたすら売った際の最大持ち高は「131,707,120円」で1億超えてました。そんな金はないですけどそれだけ投資できれば5年で6千万も儲かりましたね。</p>
]]>
</description>
<link>https://ameblo.jp/pikopiko9911/entry-12802370944.html</link>
<pubDate>Sun, 14 May 2023 09:15:09 +0900</pubDate>
</item>
<item>
<title>売り(信用売)の22年度仮想売買結果</title>
<description>
<![CDATA[ <p><style type="text/css">table {margin: auto; border-collapse: collapse; border: 1px solid #333;text-align:center ;padding: 1px;}td {border-collapse: collapse; border: 1px solid #333;text-align:center ;padding: 1px;}th {background: #fff3B8 ;border-collapse: collapse; border: 1px solid #333 ;text-align:center ;padding: 1px;}.dvt{overflow: auto ; white-space: nowrap;}</style></p><p>　信用売りパターンの22年度予測結果での仮想売買の検証結果です。学習モデルはLightGBMです。売りパターンでの正答率などの検証結果は下記記事にありますのでご覧ください。</p><p>&nbsp;</p><p><a href="https://ameblo.jp/pikopiko9911/entry-12801689143.html" rel="noopener noreferrer" target="_blank">22年度信用売りの予測と検証</a></p><div class="ogpCard_root"><article class="ogpCard_wrap" contenteditable="false" style="display:inline-block;max-width:100%"><a class="ogpCard_link" data-ogp-card-log="" href="https://ameblo.jp/pikopiko9911/entry-12801689143.html" rel="noopener noreferrer" style="display:flex;justify-content:space-between;overflow:hidden;box-sizing:border-box;width:620px;max-width:100%;height:120px;border:1px solid #e2e2e2;border-radius:4px;background-color:#fff;text-decoration:none" target="_blank"><span class="ogpCard_content" style="display:flex;flex-direction:column;overflow:hidden;width:100%;padding:16px"><span class="ogpCard_title" style="-webkit-box-orient:vertical;display:-webkit-box;-webkit-line-clamp:2;max-height:48px;line-height:1.4;font-size:16px;color:#333;text-align:left;font-weight:bold;overflow:hidden">『学習・検証をする⑩　売り(信用売)で予測してみる(LightGBM)』</span><span class="ogpCard_description" style="overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.6;margin-top:4px;color:#757575;text-align:left;font-size:12px">　ここまでLightGBM。線形回帰、ランダムフォレストを試してきましたが、予測は上昇するかどうかが目的変数でした。つまりは買う株を予測することが目的です。し…</span><span class="ogpCard_url" style="display:flex;align-items:center;margin-top:auto"><span class="ogpCard_iconWrap" style="position:relative;width:20px;height:20px;flex-shrink:0"><img alt="リンク" class="ogpCard_icon" height="20" loading="lazy" src="https://c.stat100.ameba.jp/ameblo/symbols/v3.20.0/svg/gray/editor_link.svg" style="position:absolute;top:0;bottom:0;right:0;left:0;height:100%;max-height:100%" width="20"></span><span class="ogpCard_urlText" style="overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#757575;font-size:12px;text-align:left">ameblo.jp</span></span></span><span class="ogpCard_imageWrap" style="position:relative;width:120px;height:120px;flex-shrink:0"><img alt="" class="ogpCard_image" data-ogp-card-image="" height="120" loading="lazy" src="https://stat.profile.ameba.jp/profile_images/20230426/01/84/p1/p/o03840384p_1682439767322_uyxt8.png" style="position:absolute;top:50%;left:50%;object-fit:cover;min-height:100%;min-width:100%;transform:translate(-50%,-50%)" width="120"></span></a></article></div><p>&nbsp;</p><h2 class="limited_heading09" data-entrydesign-alignment="center" data-entrydesign-count-input="part" data-entrydesign-part="limited_heading09" data-entrydesign-tag="h2" data-entrydesign-type="heading" data-entrydesign-ver="1.54.1" style="background:url(https://stat100.ameba.jp/ameblo/entry_designs/v1/sources/assets/limited044_heading.png) no-repeat;background-size:178px 11px;padding-bottom:19px;margin:8px 0;font-weight:bold;color:#424242;font-size:20px;line-height:1.6;min-height:32px;line-break:loose;overflow-wrap:break-word;text-align:center;background-position:center bottom"><span style="display:block"><span data-entrydesign-content="" style="display:block">信用売りの22年度仮想売買の結果</span></span></h2><p>&nbsp;</p><p>　正答率の成績も良かったので当たり前かもしれませんが売りの場合も売買していたら儲かっていたようです。結果は以下のようになりました。アンダーサンプリングは5倍にしたケースの検証になります。</p><p>&nbsp;</p><p>　一応注意事項ですが、実際の売買では貸借銘柄に選定されてなければ簡単には売れませんし貸借銘柄でも売り禁もしょっちゅう発生します。証券会社の独自規制で売り禁になってる銘柄もあるのでこんな成績にはならないでしょうが、そこは目をつぶってください。貸借銘柄に絞るのはまあ可能ですが、いちいち売りタイミングで売り禁になっていたかどうかのチェックはやってられません。そんな売り禁履歴の過去データ入手できるのかも怪しいですし。証券会社独自の禁止チェックもやってられないので、本当に実際売買できたかなんて検証不可能ですし貸借銘柄の絞り込みもなしで検証しました。</p><p>&nbsp;</p><p>検証のパターンとしては</p><ul><li>ケース１：500万の持ち高MAX制限あり、1単元20万以下は売金額が20万前後になるように調整あり、1単元100万以上の銘柄は手を出さない</li><li>ケース２：予測した銘柄をひたすら1単元づつ売り続ける</li></ul><p>の2パターンです。同じ銘柄が翌週も推奨されたら対象銘柄の売り持ちを持ち越してさらに2週間持つように繰り越してます(新規に売りを足さない)。</p><p>&nbsp;</p><div class="dvt"><table><caption><b>22年信用売りの結果</b></caption><tbody><tr><th rowspan="2">採用閾値</th><th colspan="2">ケース１(制限あり)</th><th colspan="3">ケース２(対象全銘柄1単元売り)</th></tr><tr><th>売買回数</th><th>利益額</th><th>売買回数</th><th>利益額</th><th>最大持高</th></tr><tr><td align="center">60%以上</td><td align="center">203回</td><td align="center">997,570円</td><td align="center">288回</td><td align="center">1,638,380円</td><td align="center">2,0687,260円</td></tr><tr><td align="center">65%以上</td><td align="center">131回</td><td align="center">3,006,520円</td><td align="center">166回</td><td align="center">3,050,980円</td><td align="center">12,003,760円</td></tr><tr><td align="center">70%以上</td><td align="center">84回</td><td align="center">3,088,420円</td><td align="center">88回</td><td align="center">3,289,320円</td><td align="center">4,755,100円</td></tr><tr><td align="center">75%以上</td><td align="center">44回</td><td align="center">1,504,120円</td><td align="center">47回</td><td align="center">1,998,620円</td><td align="center">3,145,000円</td></tr><tr><td align="center">80%以上</td><td align="center">17回</td><td align="center">937,270円</td><td align="center">17回</td><td align="center">635,870円</td><td align="center">775,600円</td></tr></tbody></table></div><p>&nbsp;</p><p>　70%以上は信じて売ってよさそうです。制限なしの方が成績悪くなってのは１単元が20万未満の銘柄もまあまあ出てたので売買単元数が減れば1銘柄あたりの利益額も少なくなるからでしょう。</p><p>　買いの成績も悪くなかったですし、買いと売りを組み合わせて売買していけば結構な利益が出ることもわかりました。(あくまで22年に売買していたら・・・ですけどね)</p><p>&nbsp;</p><p>　買いパターンの時の結果も比較したい方はご覧ください。</p><p><a href="https://ameblo.jp/pikopiko9911/entry-12795565328.html" rel="noopener noreferrer" target="_blank">22年の仮想売買の結果</a></p><div class="ogpCard_root"><article class="ogpCard_wrap" contenteditable="false" style="display:inline-block;max-width:100%"><a class="ogpCard_link" data-ogp-card-log="" href="https://ameblo.jp/pikopiko9911/entry-12795565328.html" rel="noopener noreferrer" style="display:flex;justify-content:space-between;overflow:hidden;box-sizing:border-box;width:620px;max-width:100%;height:120px;border:1px solid #e2e2e2;border-radius:4px;background-color:#fff;text-decoration:none" target="_blank"><span class="ogpCard_content" style="display:flex;flex-direction:column;overflow:hidden;width:100%;padding:16px"><span class="ogpCard_title" style="-webkit-box-orient:vertical;display:-webkit-box;-webkit-line-clamp:2;max-height:48px;line-height:1.4;font-size:16px;color:#333;text-align:left;font-weight:bold;overflow:hidden">『22年の仮想売買成績を再度チェック(学習データ量が増加したので)。ついでに21年以前も』</span><span class="ogpCard_description" style="overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.6;margin-top:4px;color:#757575;text-align:left;font-size:12px">　データ量を増加させて新しく学習したモデルは格段に成績がアップしました。(モデルの正答率の検証結果はこちら(22年分)とこちら(21年以前分))&nbsp;　それに伴っ…</span><span class="ogpCard_url" style="display:flex;align-items:center;margin-top:auto"><span class="ogpCard_iconWrap" style="position:relative;width:20px;height:20px;flex-shrink:0"><img alt="リンク" class="ogpCard_icon" height="20" loading="lazy" src="https://c.stat100.ameba.jp/ameblo/symbols/v3.20.0/svg/gray/editor_link.svg" style="position:absolute;top:0;bottom:0;right:0;left:0;height:100%;max-height:100%" width="20"></span><span class="ogpCard_urlText" style="overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#757575;font-size:12px;text-align:left">ameblo.jp</span></span></span><span class="ogpCard_imageWrap" style="position:relative;width:120px;height:120px;flex-shrink:0"><img alt="" class="ogpCard_image" data-ogp-card-image="" height="120" loading="lazy" src="https://stat.profile.ameba.jp/profile_images/20230426/01/84/p1/p/o03840384p_1682439767322_uyxt8.png" style="position:absolute;top:50%;left:50%;object-fit:cover;min-height:100%;min-width:100%;transform:translate(-50%,-50%)" width="120"></span></a></article></div><p>&nbsp;</p><div class="ogpCard_root">&nbsp;</div><p>&nbsp;</p>
]]>
</description>
<link>https://ameblo.jp/pikopiko9911/entry-12802336524.html</link>
<pubDate>Fri, 12 May 2023 09:42:00 +0900</pubDate>
</item>
<item>
<title>学習・検証をする⑩　売り(信用売)で予測してみる(LightGBM)</title>
<description>
<![CDATA[ <p><style type="text/css">table {margin: auto; border-collapse: collapse; border: 1px solid #333;text-align:center ;padding: 1px;}td {border-collapse: collapse; border: 1px solid #333;text-align:center ;padding: 1px;}th {background: #fff3B8 ;border-collapse: collapse; border: 1px solid #333 ;text-align:center ;padding: 1px;}.dvt{overflow: auto ; white-space: nowrap;}</style></p><p>　ここまでLightGBM。線形回帰、ランダムフォレストを試してきましたが、予測は上昇するかどうかが目的変数でした。つまりは買う株を予測することが目的です。しかし株は信用取引で売りから入ることもできます。次は下落するかどうかを予測してみて信用売りとした場合はどうなるかを検証してみたいと思います。</p><p>&nbsp;</p><h2 class="limited_heading09" data-entrydesign-alignment="center" data-entrydesign-count-input="part" data-entrydesign-part="limited_heading09" data-entrydesign-tag="h2" data-entrydesign-type="heading" data-entrydesign-ver="1.54.1" style="background:url(https://stat100.ameba.jp/ameblo/entry_designs/v1/sources/assets/limited044_heading.png) no-repeat;background-size:178px 11px;padding-bottom:19px;margin:8px 0;font-weight:bold;color:#424242;font-size:20px;line-height:1.6;min-height:32px;line-break:loose;overflow-wrap:break-word;text-align:center;background-position:center bottom"><span style="display:block"><span data-entrydesign-content="" style="display:block">売り予測のプログラム改修</span></span></h2><p>　基本は買い予測のLightGBMと同じです。目的変数の正解とするクラスをマイナス10%以下の場合に変えるだけですね。ついでに売り・買いを変数で切り替えられるように改修してみました。LightGBMの予測は初期の記載以来久しぶりなので、アンダーサンプリング、バギング込みの改良版プログラム全体を載せておきます。</p><pre class="code" data-lang="" data-unlink="" style=" color: #0000FF; background-color: #F2F2F2; ,margin: 0px 0px 10px; padding: 20px; border: 1px solid #eceef1; overflow: auto; font-family: Monaco, Consolas, 'Courier New', Courier, monospace, sans-serif; font-size: 1em; white-space: pre;">  import pandas as pd ##pandas データの格納処理に使うimport numpy as np ##numpy 結果を格納してconfusionに使う。numpyでなくてもできるかもしれないけどとりあえずimport lightgbm as lgb #LightGBM。これがないと予測もできんfrom sklearn.model_selection import train_test_split # データセット分割用from sklearn.metrics import confusion_matrix #正解の検証のため。from imblearn.under_sampling import RandomUnderSamplerurikai = 1 #1:kai,2:uriif urikai==1: #買い予想の場合    shikii = 0.5 # 予測結果を採用する確率の閾値。0.5ならクラス1となる確率50%以上と予測されたものを採用する。    under = 5 #アンダーサンプリング倍率    R1 = 0.1 ## 学習データでの2値クラスの正解を1とする上昇率の閾値。0.1なら10%以上上昇の場合を目的変数のクラス1として学習する。　    R2 = 0.0 ## 予測データで正解を1とする閾値。ここを0にすればとにかく上昇した場合を正解として正答率を出せる。if urikai==2: #売り予想の場合    shikii = 0.7 #採用閾値    under = 5 #アンダーサンプリング倍率    R1 = -0.1 ##学習データの目的変数のクラス1(正解)の下落率閾値    R2 = -0.1 ##予測データの正解クラス1の閾値print(urikai,shikii,under,R1,R2) #売り買いどっちの予測かと各閾値を分かるように出力しておく###バギング部分#####def bagging(seed,X,y):    params = {            'task': 'train',            'boosting_type': 'gbdt',            'objective': 'binary',            'metric': 'auc',            'verbosity':'-1'            }　　###アンダーサンプリング。変数underの数値の倍率で不正解クラス0をカットする。　    f_count = y.value_counts()[1] * under    t_count = y.value_counts()[1]    rus = RandomUnderSampler(sampling_strategy={0:f_count, 1:t_count},random_state=seed,replacement=True)    X_rus, y_rus = rus.fit_sample(X, y)        X_train, X_test, y_train, y_test = train_test_split(X_rus, y_rus,test_size=0.20, random_state=2)    ###↑相変わらずこの分割はいらん気がするが放置してます。    lgb_train=lgb.Dataset(X_train, y_train)         lgb_eval = lgb.Dataset(X_test, y_test, reference=lgb_train)        model_b = lgb.train(params,                      train_set=lgb_train, # トレーニングデータの指定                      valid_sets=lgb_eval, # 検証データの指定                      callbacks=[                          lgb.log_evaluation(1000)] ,                      )    return model_b###読み込みファイルの設定df1filename = "学習ファイル(フルパス指定で)" #学習用の2017年～2021年のデータdf2filename = "検証ファイル(フルパス指定で)" #検証用の2022年のデータ        ###データ前処理 学習用データ###df1 = pd.read_csv(df1filename) #pandasデータフレームのdf1に学習用データを設定##ノイズになりそうな情報をカットdf1=df1.drop('Mcode',axis=1) ##銘柄コードを削除　※銘柄コードによって学習結果が左右されないようにするためdf1=df1.drop('kijyun_date',axis=1) ##基準日を削除 ※日付によって学習結果が左右されないようにするため    ##学習用データから目的変数をカット。基準日から先4週分の騰落率を削除X=df1.drop('F1week',axis=1)X=X.drop('F2week',axis=1)X=X.drop('F3week',axis=1)X=X.drop('F4week',axis=1)####目的変数の設定。2週間先で10%以上(※変数R1以上)上がった(下がった)場合を「1」にセットdfy=df1.copy()dfy['F2week_pred'] = 0 ##一旦すべてゼロに。これを先にやっておくとnanにならないので。if urikai==1:   dfy.loc[dfy['F2week'] &gt;= R1,['F2week_pred']] = 1elif urikai==2:   dfy.loc[dfy['F2week'] &lt;= R1,['F2week_pred']] = 1        y = dfy[['F2week_pred']]    ###データ前処理 検証用データ###df2 = pd.read_csv(df2filename) #pandasデータフレームのdf2に学習用データを設定##学習用データに項目合わせるためノイズになりそうな情報をカットdf2=df2.drop('Mcode',axis=1)df2=df2.drop('kijyun_date',axis=1)##検証用データから目的変数をカット。基準日から先4週分の騰落率を削除Ztest=df2.drop('F1week',axis=1)Ztest=Ztest.drop('F2week',axis=1)Ztest=Ztest.drop('F3week',axis=1)Ztest=Ztest.drop('F4week',axis=1)    ####目的変数の設定。2週間先で閾値変数R2以上上がった(下がった)場合を「1」にセットdfZ=df2.copy()dfZ['F2week_pred'] = 0if urikai==1:    dfZ.loc[dfZ['F2week'] &gt;= R2,['F2week_pred']] = 1elif urikai==2:    dfZ.loc[dfZ['F2week'] &lt;= R2,['F2week_pred']] = 1    Zkekka = dfZ[['F2week_pred']]##ここまでで、X:学習用データ、y:学習用の目的変数(2値化後)、Ztest:検証用データ、Zkekka:検証の目的変数(結果)が完成###ここから学習######モデルの作成。バギングなので複数回学習してモデルを配列に格納model=[] ##学習モデル格納用の配列を作るfor i in range(10):　##学習。バギング数10回として回す    model.append(bagging(i,X,y))    print(i)###ここから予測###y_preds_pro = [] ##予測結果格納用の配列を作るfor m in model: ##作った学習モデルの回数(モデル配列数)予測する。    y_preds_pro.append(m.predict(Ztest, num_iteration=m.best_iteration))  y_pred_prob = sum(y_preds_pro)/len(y_preds_pro) ##全予測での確率の平均値をとる###ここから正答率計算#######クラス分類なので正解を1にする必要あり。予測結果は何%の確率で上がるか？となので、閾値(shikii)以上騰がる予測確率を正解予測したこととする。y_pred = np.where(y_pred_prob &lt; shikii, 0, 1) # 変数shikiiより小さい場合0 ,そうでない場合1を返す。0.5なら50％以上の予測確率が1になる。###予測結果と実際の結果を比較cmatrix = confusion_matrix(Zkekka,y_pred)print(cmatrix)</pre><p>&nbsp;</p><h2 class="limited_heading09" data-entrydesign-alignment="center" data-entrydesign-count-input="part" data-entrydesign-part="limited_heading09" data-entrydesign-tag="h2" data-entrydesign-type="heading" data-entrydesign-ver="1.54.1" style="background:url(https://stat100.ameba.jp/ameblo/entry_designs/v1/sources/assets/limited044_heading.png) no-repeat;background-size:178px 11px;padding-bottom:19px;margin:8px 0;font-weight:bold;color:#424242;font-size:20px;line-height:1.6;min-height:32px;line-break:loose;overflow-wrap:break-word;text-align:center;background-position:center bottom"><span style="display:block"><span data-entrydesign-content="" style="display:block">売り予測の結果</span></span></h2><p>　結果は以下のようになりました。売りでもまずまず良い成績となった感じです。まずは10%以上下落したかどうかの正答率から。</p><p>&nbsp;</p><p>※US:アンダーサンプリングの倍率</p><div class="dvt"><table><caption><b>10%以上下落したか？の結果</b></caption><tbody><tr><th rowspan="2">採用閾値</th><th colspan="3">US:6</th><th colspan="3">US:5</th><th colspan="3">US:4</th></tr><tr><th>×</th><th>〇</th><th>率</th><th>×</th><th>〇</th><th>率</th><th>×</th><th>〇</th><th>率</th></tr><tr><td align="center">50%以上</td><td align="center">589</td><td align="center">266</td><td align="center">31.1%</td><td align="center">872</td><td align="center">391</td><td align="center">31.0%</td><td align="center">1561</td><td align="center">539</td><td align="center">25.7%</td></tr><tr><td align="center">55%以上</td><td align="center">309</td><td align="center">172</td><td align="center">35.8%</td><td align="center">494</td><td align="center">242</td><td align="center">32.9%</td><td align="center">921</td><td align="center">380</td><td align="center">29.2%</td></tr><tr><td align="center">60%以上</td><td align="center">159</td><td align="center">105</td><td align="center">39.8%</td><td align="center">263</td><td align="center">147</td><td align="center">35.9%</td><td align="center">515</td><td align="center">239</td><td align="center">31.7%</td></tr><tr><td align="center">65%以上</td><td align="center">81</td><td align="center">67</td><td align="center">45.3%</td><td align="center">133</td><td align="center">90</td><td align="center">40.4%</td><td align="center">265</td><td align="center">152</td><td align="center">36.5%</td></tr><tr><td align="center">70%以上</td><td align="center">33</td><td align="center">50</td><td align="center">60.2%</td><td align="center">59</td><td align="center">61</td><td align="center">50.8%</td><td align="center">126</td><td align="center">92</td><td align="center">42.2%</td></tr><tr><td align="center">75%以上</td><td align="center">17</td><td align="center">29</td><td align="center">63.0%</td><td align="center">23</td><td align="center">37</td><td align="center">61.7%</td><td align="center">46</td><td align="center">59</td><td align="center">56.2%</td></tr><tr><td align="center">80%以上</td><td align="center">7</td><td align="center">10</td><td align="center">58.8%</td><td align="center">5</td><td align="center">16</td><td align="center">76.2%</td><td align="center">21</td><td align="center">35</td><td align="center">62.5%</td></tr></tbody></table></div><p>&nbsp;</p><p>　買いの時と同じく採用する閾値を上げていくと順調に上がっていってくれてます。LightGBMスゲー(というより作成した学習データがたまたまアルゴリズムの得意な形にマッチしてラッキーなのかも)。 次に下落した銘柄を予測できたかも見てみます。</p><p>&nbsp;</p><div class="dvt"><table><caption><b>0%以上下落したか？(とにかく下がったか)の結果</b></caption><tbody><tr><th rowspan="2">採用閾値</th><th colspan="3">US:6</th><th colspan="3">US:5</th><th colspan="3">US:4</th></tr><tr><th>×</th><th>〇</th><th>率</th><th>×</th><th>〇</th><th>率</th><th>×</th><th>〇</th><th>率</th></tr><tr><td align="center">50%以上</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">839</td><td align="center">1261</td><td align="center">60.0%</td></tr><tr><td align="center">55%以上</td><td align="center">177</td><td align="center">304</td><td align="center">63.2%</td><td align="center">283</td><td align="center">453</td><td align="center">61.5%</td><td align="center">500</td><td align="center">801</td><td align="center">61.6%</td></tr><tr><td align="center">60%以上</td><td align="center">87</td><td align="center">177</td><td align="center">67.0%</td><td align="center">149</td><td align="center">261</td><td align="center">63.7%</td><td align="center">288</td><td align="center">466</td><td align="center">61.8%</td></tr><tr><td align="center">65%以上</td><td align="center">46</td><td align="center">102</td><td align="center">68.9%</td><td align="center">74</td><td align="center">149</td><td align="center">66.8%</td><td align="center">151</td><td align="center">262</td><td align="center">63.4%</td></tr><tr><td align="center">70%以上</td><td align="center">19</td><td align="center">64</td><td align="center">77.1%</td><td align="center">33</td><td align="center">87</td><td align="center">72.5%</td><td align="center">67</td><td align="center">151</td><td align="center">69.3%</td></tr><tr><td align="center">75%以上</td><td align="center">7</td><td align="center">39</td><td align="center">84.8%</td><td align="center">11</td><td align="center">49</td><td align="center">81.7%</td><td align="center">24</td><td align="center">81</td><td align="center">77.1%</td></tr><tr><td align="center">80%以上</td><td align="center">2</td><td align="center">15</td><td align="center">88.2%</td><td align="center">3</td><td align="center">18</td><td align="center">85.7%</td><td align="center">10</td><td align="center">46</td><td align="center">82.1%</td></tr></tbody></table></div><p>&nbsp;</p><p>　この場合も順調に閾値上げれば成績も良くなってくれてます。買いの時の90%超という成績にはならなかったので、少しだけ売りには向いてないモデルなのかもしれませんが、75%以上の予測確率をたたき出してくれれば成績はよさげな感じですね。</p><p>　ただ、買いの時の予測確率が50%以上の成績と同等な感じで買いの時より推奨確率の閾値が上振れしてるのはなぜだろう。同じ考え方のモデルで予測してるんだから閾値が近くなってくれても良い気もしますが良くわかりません。まあアルゴリズムの理解はするつもりないのでここには触れないでおきます。</p><p>&nbsp;</p><p>　とにかく売りでも使えそうなモデルと言えるのではないでしょうか。実際の仮想売買成績はどうなるのかはまたそのうちに。</p>
]]>
</description>
<link>https://ameblo.jp/pikopiko9911/entry-12801689143.html</link>
<pubDate>Thu, 11 May 2023 08:36:05 +0900</pubDate>
</item>
<item>
<title>学習・検証をする⑨　ランダムフォレストを試す</title>
<description>
<![CDATA[ <p><style type="text/css">table {margin: auto; border-collapse: collapse; border: 1px solid #333;text-align:center ;padding: 1px;}td {border-collapse: collapse; border: 1px solid #333;text-align:center ;padding: 1px;}th {background: #fff3B8 ;border-collapse: collapse; border: 1px solid #333 ;text-align:center ;padding: 1px;}.dvt{overflow: auto ; white-space: nowrap;}</style></p><p>　今回はランダムフォレストの結果です。結論から言うとこれまでで一番ダメでした。ダメダメですがせっかく試したので結果です。もしかしたらパラメータとかをきちんと設定していけば結果が大きく違うのかもしれませんが、もうそんな気も起きないくらいだったので打ち止めにしてます。</p><p>&nbsp;</p><h2 class="limited_heading09" data-entrydesign-alignment="center" data-entrydesign-count-input="part" data-entrydesign-part="limited_heading09" data-entrydesign-tag="h2" data-entrydesign-type="heading" data-entrydesign-ver="1.54.1" style="background:url(https://stat100.ameba.jp/ameblo/entry_designs/v1/sources/assets/limited044_heading.png) no-repeat;background-size:178px 11px;padding-bottom:19px;margin:8px 0;font-weight:bold;color:#424242;font-size:20px;line-height:1.6;min-height:32px;line-break:loose;overflow-wrap:break-word;text-align:center;background-position:center bottom"><span style="display:block"><span data-entrydesign-content="" style="display:block">ランダムフォレストのプログラム</span></span></h2><p>　ランダムフォレストは「scikit-learn」の「RandomForestClassifier」を利用しました。そもそも線形回帰も良い結果ではなかったので2値のクラス分類で試しています。</p><p>&nbsp;</p><pre class="code" data-lang="" data-unlink="" style=" color: #0000FF; background-color: #F2F2F2; ,margin: 0px 0px 10px; padding: 20px; border: 1px solid #eceef1; overflow: auto; font-family: Monaco, Consolas, 'Courier New', Courier, monospace, sans-serif; font-size: 1em; white-space: pre;">from sklearn.ensemble import RandomForestClassifier</pre><p>&nbsp;</p><p>でインポート。　scikit-learnって？って方はどこかのサイトでも見てインストールしてください。</p><p>&nbsp;</p><p>ここで回数の平均バギングはいるのかと考えましたが、そもそもランダムフォレスト自体が決定木の数を設定して平均・多数決で結果出してくれてるし、要は何回かの予測結果のバギングと一緒なので実装は不要としてます。学習データもランダムで抽出してるみたいですが、アンダーサンプリングはその手前で与える学習データ自体のクラスの配分率をいじりますし効果はあるかもしれないと思って実装してます。</p><p>&nbsp;</p><p>データの前処理は今までと同じで、学習～検証は以下のプログラムに変更。</p><pre class="code" data-lang="" data-unlink="" style=" color: #0000FF; background-color: #F2F2F2; ,margin: 0px 0px 10px; padding: 20px; border: 1px solid #eceef1; overflow: auto; font-family: Monaco, Consolas, 'Courier New', Courier, monospace, sans-serif; font-size: 1em; white-space: pre;">clf = RandomForestClassifier(n_estimators=30, random_state=0)clf.fit(X_rus, y_rus) #訓練用データで学習    y_pred = clf.predict(Ztest) #検証用データの予測</pre><p>この3行だけですね。</p><p>&nbsp;</p><p>　パラメータとしては</p><ol><li>「n_estimators」は実施回数(バギングの回数と同等)</li><li>「random_state」は検証時に毎回ランダムにならないように(結果が固定化されるように)設定</li></ol><p>の2パラメータも変更できるように変数化しました。</p><p>&nbsp;</p><p>　で、プログラムは以下のような感じ。</p><pre class="code" data-lang="" data-unlink="" style=" color: #0000FF; background-color: #F2F2F2; ,margin: 0px 0px 10px; padding: 20px; border: 1px solid #eceef1; overflow: auto; font-family: Monaco, Consolas, 'Courier New', Courier, monospace, sans-serif; font-size: 1em; white-space: pre;">from sklearn.ensemble import RandomForestClassifierimport pandas as pdfrom sklearn.metrics import r2_scorefrom sklearn.metrics import confusion_matrix #正解の検証のため。from imblearn.under_sampling import RandomUnderSampler####変数化したパラメータの設定R1 = 0.1 ##学習データの正解とする(目的変数1にする)クラスの上昇率の設定 0.1なら10%以上上昇が1となるR2 = 0.0 ##予測データ正答率検証時の上昇率の設定。0なら騰がった場合、0.1なら10%以上騰がった場合が正解となるunder_mode=1 ##アンダーサンプリングありなしの制御用 1なら実施する。under=5 ##アンダーサンプリングの倍率セットest = 30 ## n_estimatorsの設定用rand = 0 ## random_stateの設定用df1filename = "学習データのファイル" #学習用の2017年～2021年のデータdf2filename = "予測データのファイル" #検証用の2022年のデータdf1 = pd.read_csv(df1filename) #pandasデータフレームのdf1に学習用データを設定df2 = pd.read_csv(df2filename) #pandasデータフレームのdf2に検証用データを設定###データ前処理 学習用データ### ##ノイズになりそうな情報をカットdf1=df1.drop('Mcode',axis=1) ##銘柄コードを削除　※銘柄コードによって学習結果が左右されないようにするためdf1=df1.drop('kijyun_date',axis=1) ##基準日を削除 ※日付によって学習結果が左右されないようにするため##学習用データから目的変数をカット。基準日から先4週分の騰落率を削除X=df1.drop('F1week',axis=1)X=X.drop('F2week',axis=1)X=X.drop('F3week',axis=1)X=X.drop('F4week',axis=1)####目的変数の設定。2週間先で10%以上上がった場合を「1」にセットdfy=df1.copy()dfy['F2week_pred'] = 0 ##一旦すべてゼロに。これを先にやっておくとnanにならないので。dfy.loc[dfy['F2week'] &gt;= R1,['F2week_pred']] = 1 ##変数R1以上の上昇ならクラス１にセットy = dfy[['F2week_pred']] ##目的変数をyに###データ前処理 検証用データ#####学習用データに項目合わせるためノイズになりそうな情報をカットdf2=df2.drop('Mcode',axis=1)df2=df2.drop('kijyun_date',axis=1)##検証用データから目的変数をカット。基準日から先4週分の騰落率を削除Ztest=df2.drop('F1week',axis=1)Ztest=Ztest.drop('F2week',axis=1)Ztest=Ztest.drop('F3week',axis=1)Ztest=Ztest.drop('F4week',axis=1)####正解の設定。2週間先で変数R2以上上がった場合を「1」にセットdfZ=df2.copy()dfZ['F2week_pred'] = 0dfZ.loc[dfZ['F2week'] &gt;= R2,['F2week_pred']] = 1Zkekka = dfZ[['F2week_pred']]##ここまでで、X:学習用データ、y:学習用の目的変数(2値化後)、Ztest:検証用データ、Zkekka:検証の目的変数(結果)が完成##アンダーサンプリング###  #モードでありなしを制御if under_mode==1:f_count = y.value_counts()[1] * undert_count = y.value_counts()[1]      rus = RandomUnderSampler(sampling_strategy={0:f_count, 1:t_count},replacement=True)      X_rus, y_rus = rus.fit_sample(X, y)else:      X_rus,y_rus=X,y        clf = RandomForestClassifier(n_estimators=est, random_state=rand)clf.fit(X_rus, y_rus) #訓練用データで学習    y_pred = clf.predict(Ztest) #検証用データの予測    cmatrix = confusion_matrix(Zkekka,y_pred)　#正答率を出すための正解データをチェックprint(cmatrix)  print(r2_score(Zkekka, y_pred)) #スコアも出してみる</pre><p>&nbsp;</p><h2 class="limited_heading09" data-entrydesign-alignment="center" data-entrydesign-count-input="part" data-entrydesign-part="limited_heading09" data-entrydesign-tag="h2" data-entrydesign-type="heading" data-entrydesign-ver="1.54.1" style="background:url(https://stat100.ameba.jp/ameblo/entry_designs/v1/sources/assets/limited044_heading.png) no-repeat;background-size:178px 11px;padding-bottom:19px;margin:8px 0;font-weight:bold;color:#424242;font-size:20px;line-height:1.6;min-height:32px;line-break:loose;overflow-wrap:break-word;text-align:center;background-position:center bottom"><span style="display:block"><span data-entrydesign-content="" style="display:block">ランダムフォレストの結果</span></span></h2><p>　ランダムフォレストでの予測結果です。</p><p>&gt;</p><p>　まずアンダーサンプリングなしで、「random_state」「n_estimators」を変えて確認した結果です。「n_estimators」は「20、30、50、100、200」と値を変えてます。「random_state」は毎回ブレないように本来ランダムに選ばれる数値を固定する(seedと呼ばれることもあるようです)ためのものなので、数値の違いで結果が大幅に違わないかを確認するため3通り(1,15,42としてます)を試してます。</p><p>　ただ、1回の学習・予測でアホみたいに時間がかかるため「random_state」の変更時は全パターンを試しませんでした。</p><p>&nbsp;</p><p>※表では「random_state」：RS、「n_estimators」：ESTと略してます。</p><p>&nbsp;</p><div class="dvt"><table><caption><b>10%以上上昇したか？の結果</b></caption><tbody><tr><th rowspan="2">EST</th><th colspan="3">RS=1</th><th colspan="3">RS=42</th><th colspan="3">RS=15</th></tr><tr><th>×</th><th>〇</th><th>率</th><th>×</th><th>〇</th><th>率</th><th>×</th><th>〇</th><th>率</th></tr><tr><td align="center">20</td><td align="center">160</td><td align="center">29</td><td align="center">15.3%</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">-</td></tr><tr><td align="center">30</td><td align="center">21</td><td align="center">98</td><td align="center">17.6%</td><td align="center">107</td><td align="center">19</td><td align="center">15.1%</td><td align="center">95</td><td align="center">17</td><td align="center">15.2%</td></tr><tr><td align="center">50</td><td align="center">59</td><td align="center">14</td><td align="center">19.2%</td><td align="center">52</td><td align="center">12</td><td align="center">18.8%</td><td align="center">-</td><td align="center">-</td><td align="center">-</td></tr><tr><td align="center">100</td><td align="center">25</td><td align="center">8</td><td align="center">24.2%</td><td align="center">33</td><td align="center">7</td><td align="center">17.5%</td><td align="center">-</td><td align="center">-</td><td align="center">-</td></tr><tr><td align="center">200</td><td align="center">18</td><td align="center">5</td><td align="center">21.7%</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">-</td></tr></tbody></table></div><p>&nbsp;</p><p>　「n_estimators」で回数増やしても安定してきてるようにも見えないし、多少確率は高くなってきてるようでも騰がると予測する数がこんなに少なくなると「n_estimators」をこれ以上上げても使い物になりません。</p><p>とりあえず騰がったかどうか(0%以上上昇したか？)でも見てみます。</p><p>&nbsp;</p><div class="dvt"><table><caption><b>とにかく上昇したか？(0%以上上昇)の結果</b></caption><tbody><tr><th rowspan="2">EST</th><th colspan="3">RS=1</th><th colspan="3">RS=42</th><th colspan="3">RS=15</th></tr><tr><th>×</th><th>〇</th><th>率</th><th>×</th><th>〇</th><th>率</th><th>×</th><th>〇</th><th>率</th></tr><tr><td align="center">20</td><td align="center">108</td><td align="center">81</td><td align="center">42.9%</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">-</td></tr><tr><td align="center">30</td><td align="center">71</td><td align="center">48</td><td align="center">40.3%</td><td align="center">64</td><td align="center">62</td><td align="center">49.2%</td><td align="center">65</td><td align="center">47</td><td align="center">42.0%</td></tr><tr><td align="center">50</td><td align="center">42</td><td align="center">31</td><td align="center">42.5%</td><td align="center">35</td><td align="center">29</td><td align="center">45.3%</td><td align="center">-</td><td align="center">-</td><td align="center">-</td></tr><tr><td align="center">100</td><td align="center">17</td><td align="center">16</td><td align="center">48.5%</td><td align="center">21</td><td align="center">19</td><td align="center">47.5%</td><td align="center">-</td><td align="center">-</td><td align="center">-</td></tr><tr><td align="center">200</td><td align="center">15</td><td align="center">8</td><td align="center">34.8%</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">-</td></tr></tbody></table></div><p>&nbsp;</p><p>　正答率が50%を切るくらいの数値になってます。これは線形回帰よりも悪い成績ですし、2022年は予測対象銘柄で実際に騰がった回数は50%以上あるのでまあ当ててないと言って良いでしょう。</p><p>&nbsp;</p><p>　期待持てないながらも、学習データのアンダーサンプリングありの場合も確認してみます。 「random_state」=42で固定したので、比較表のアンダーサンプリングなしは42のケースで載せてます。</p><p>&nbsp;</p><p>　アンダーサンプリングの倍率：USで表記してます。</p><div class="dvt"><table><caption><b>10%以上上昇したか？の結果(アンダーサンプリングあり)</b></caption><tbody><tr><th rowspan="2">EST</th><th colspan="3">USなし</th><th colspan="3">US=5</th><th colspan="3">US=4</th></tr><tr><th>×</th><th>〇</th><th>率</th><th>×</th><th>〇</th><th>率</th><th>×</th><th>〇</th><th>率</th></tr><tr><td align="center">30</td><td align="center">107</td><td align="center">19</td><td align="center">15.1%</td><td align="center">434</td><td align="center">137</td><td align="center">24.0%</td><td align="center">760</td><td align="center">168</td><td align="center">18.1%</td></tr><tr><td align="center">50</td><td align="center">52</td><td align="center">12</td><td align="center">18.8%</td><td align="center">273</td><td align="center">51</td><td align="center">15.7%</td><td align="center">486</td><td align="center">132</td><td align="center">21.4%</td></tr><tr><td align="center">100</td><td align="center">33</td><td align="center">7</td><td align="center">17.5%</td><td align="center">140</td><td align="center">57</td><td align="center">28.9%</td><td align="center">221</td><td align="center">87</td><td align="center">28.2%</td></tr></tbody></table></div><p>&nbsp;</p><p>　多少改善はありますがたいして正答率は上がってきてくれません。LightGBMの時のように予測数は格段に増えましたのでそういった効果は得られるようです。アンダーサンプリングはあったほうが良いということは間違いなさそうです。</p><p>　一応騰がったかどうかでの正答率も見てみます。</p><p>&nbsp;</p><div class="dvt"><table><caption><b>とにかく上昇したか？(0%以上上昇)の結果(アンダーサンプリングあり)</b></caption><tbody><tr><th rowspan="2">EST</th><th colspan="3">USなし</th><th colspan="3">US=5</th><th colspan="3">US=4</th></tr><tr><th>×</th><th>〇</th><th>率</th><th>×</th><th>〇</th><th>率</th><th>×</th><th>〇</th><th>率</th></tr><tr><td align="center">30</td><td align="center">64</td><td align="center">62</td><td align="center">49.2%</td><td align="center">276</td><td align="center">274</td><td align="center">49.8%</td><td align="center">505</td><td align="center">497</td><td align="center">49.6%</td></tr><tr><td align="center">50</td><td align="center">35</td><td align="center">29</td><td align="center">45.3%</td><td align="center">172</td><td align="center">154</td><td align="center">47.2%</td><td align="center">275</td><td align="center">252</td><td align="center">47.8%</td></tr><tr><td align="center">100</td><td align="center">21</td><td align="center">19</td><td align="center">47.5%</td><td align="center">74</td><td align="center">59</td><td align="center">44.4%</td><td align="center">146</td><td align="center">153</td><td align="center">51.2%</td></tr></tbody></table></div><p>&nbsp;</p><p>　良くて正答率50%程度でした。回数増やしても安定して正答率が上がって来るわけでないし、random_stateの検証結果見てもここを変えれば結構上下しそうです。これだけバラつきあると使いものにはならないという結論に達しました。</p><p>　他のパラメータを変えて劇的に良くなる可能性がゼロではないですが、あまりにも予測に時間かかるのでもうこれ以上探るのはやめました。n_estimete=200の場合1時間以上かかった・・・。</p><p>&nbsp;</p>
]]>
</description>
<link>https://ameblo.jp/pikopiko9911/entry-12800528352.html</link>
<pubDate>Tue, 09 May 2023 21:39:37 +0900</pubDate>
</item>
<item>
<title>学習・検証をする⑧　線形回帰をもう少し探る(シグモイド関数の利用)</title>
<description>
<![CDATA[ <p><style type="text/css">table {margin: auto; border-collapse: collapse; border: 1px solid #333;text-align:center ;padding: 1px;}td {border-collapse: collapse; border: 1px solid #333;text-align:center ;padding: 1px;}th {background: #fff3B8 ;border-collapse: collapse; border: 1px solid #333 ;text-align:center ;padding: 1px;}  caption{text-align:center;font-weight: bold;}  .dvt{overflow: auto ; white-space: nowrap;}</style></p><p>　線形回帰モデルは散々な結果でした。あっさり見限っても良かったんですが、工夫することで何か変わってこないか少しだけ考えてみることにしました。</p><p>　取り組んでみたのはシグモイド関数の利用です。シグモイド関数って何？って方はどっかのサイトを検索して調べてみてください。</p><p>&nbsp;</p><h2 class="limited_heading09" data-entrydesign-alignment="center" data-entrydesign-count-input="part" data-entrydesign-part="limited_heading09" data-entrydesign-tag="h2" data-entrydesign-type="heading" data-entrydesign-ver="1.54.1" style="background:url(https://stat100.ameba.jp/ameblo/entry_designs/v1/sources/assets/limited044_heading.png) no-repeat;background-size:178px 11px;padding-bottom:19px;margin:8px 0;font-weight:bold;color:#424242;font-size:20px;line-height:1.6;min-height:32px;line-break:loose;overflow-wrap:break-word;text-align:center;background-position:center bottom"><span style="display:block"><span data-entrydesign-content="" style="display:block">シグモイド関数で目的変数を変換</span></span></h2><p>　シグモイド関数を通すと０～１の数値に変換してくれて、図のようなイメージの曲線になります。</p><p>&nbsp;</p><figure><img align="center" alt="" height="235" src="https://stat.ameba.jp/user_images/20230406/23/pikopiko9911/54/6d/p/o0746045015266425351.png" width="420"></figure><p>&nbsp;</p><p>　ざっくり言うと2値モデルに近いくらい上昇率を上か下かに振り分けてくれる感じですね。上昇した銘柄と上昇しなかった銘柄に差をつけてみて線形回帰で試してみようという考えです。</p><p>pythonでの計算式はnumpyモジュールを使うとこんな感じ。</p><p>&nbsp;</p><div style="text-align:center;"><span><b>1/(1 + numpy.exp(-x * m)) </b>　　</span></div><p>&nbsp;</p><ul><li>x : 変換する元数値</li><li>m : 傾きを決める数値　100とかにすると傾きが急になる。</li></ul><p>&nbsp;</p><p>　このままだと「0」が中央値で変換後に0.5となるがこれをずらすこともできる。(ズラしたい数を n とすれば x から n を引いてあげれば良い。引き算の計算後に0となる値が0.5になるので。)</p><p>　あと、結果を分かりやすく0～100までに広げてみるために100もかけてみた(これは何％か分かりやすくなるからで見え方の問題)。</p><p>&nbsp;</p><div style="text-align:center;"><span><b>1/(1 + numpy.exp(-(x-n) * m) ) ＊ 100 </b>　　</span></div><p>&nbsp;</p><p>という式でパラメータは変えれるように実装しました。</p><p>&nbsp;</p><p>　nについて考えると、まず10%上昇時にはシグモイド変換後に1の値に近くになるように維持したいです。が数％程度の上昇時は逆に0に近づくようにしてあげれば2値クラスの目的変数に近づく感じになるはずです。中央値が0.5になるので、例えば5%上昇程度を0.5になるようにすれば0%～4.9%くらいまでは0に近くなってくれます。ということで関数変換後に0.5となる中央値を元の目的変数の上昇率5%～10%程度の間で変更しながら試すことにしました。</p><p>　学習・予測のプログラムは目的変数の変換以外は元々の線形回帰と一緒です。</p><p>&nbsp;</p><h2 class="limited_heading09" data-entrydesign-alignment="center" data-entrydesign-count-input="part" data-entrydesign-part="limited_heading09" data-entrydesign-tag="h2" data-entrydesign-type="heading" data-entrydesign-ver="1.54.1" style="background:url(https://stat100.ameba.jp/ameblo/entry_designs/v1/sources/assets/limited044_heading.png) no-repeat;background-size:178px 11px;padding-bottom:19px;margin:8px 0;font-weight:bold;color:#424242;font-size:20px;line-height:1.6;min-height:32px;line-break:loose;overflow-wrap:break-word;text-align:center;background-position:center bottom"><span style="display:block"><span data-entrydesign-content="" style="display:block">シグモイド関数利用の線形回帰モデル成績</span></span></h2><p>&nbsp;</p><p>　結果は以下のような感じ。まずn=0.03から。傾きのmは100に固定してます。これまでは結果が10%以上上昇の正答率、0%以上の正答率を出してましたがめんどくさいのでとにかく騰がったかどうか(0%以上上昇)だけにしてます。</p><p>&nbsp;</p><div class="tvd"><table><caption>とにかく騰がったか(0%以上上昇) n=0.03(3%) m=100</caption><tbody><tr><th>採用閾値</th><th>×</th><th>〇</th><th>正答率</th></tr><tr><td>30</td><td>16286</td><td>1688</td><td>50.9%</td></tr><tr><td>50</td><td>698</td><td>659</td><td>48.6%</td></tr><tr><td>70</td><td>320</td><td>340</td><td>51.5%</td></tr><tr><td>100</td><td>276</td><td>304</td><td>52.4%</td></tr><tr><td>500</td><td>253</td><td>285</td><td>53.0%</td></tr></tbody></table></div><p>&nbsp;</p><p>　予測値が高くても大して正答率は上がってきません。さらにシグモイド関数の特性上正解の最大値は100( 関数通した結果に100を掛ける式にしてるので)にしかならないのに、500以上の予測値をたたき出してくれるものもかなりある感じで。他も見てみます。</p><p>&nbsp;</p><div class="tvd"><table><caption>とにかく騰がったか(0%以上上昇) n=0.09(9%) m=100</caption><tbody><tr><th>採用閾値</th><th>×</th><th>〇</th><th>正答率</th></tr><tr><td>70</td><td>316</td><td>331</td><td>51.2%</td></tr><tr><td>100</td><td>296</td><td>319</td><td>51.9%</td></tr><tr><td>1000</td><td>284</td><td>303</td><td>51.6%</td></tr></tbody></table></div><p>&nbsp;</p><p>　nを9%に設定しても成績は変わらず。異常値(1000)とかより大きい予想も大量にあります。nを9%にすれば目的変数自体はクラス分類に近くなりますが、やはり線形回帰だと正答率は上がりませんね。</p><p>&nbsp;</p><p>　mを大きくしたり小さくしたりで傾きを変えてみたり、nも0～0.5とかまで変動させましたが対して結果は変わりません。だいたい50%前後から動きがなく、それぞれ採用する予測上昇確率の閾値を変えても大して正答率は変わりません。見事にまんべんなく正解も不正解も同確率で散らばるという結果でした。私の学習データではそもそも線形回帰自体が向いてないんですね。線形回帰を追いかけるのはもうここでやめようと思います。</p>
]]>
</description>
<link>https://ameblo.jp/pikopiko9911/entry-12797280237.html</link>
<pubDate>Sun, 30 Apr 2023 23:45:54 +0900</pubDate>
</item>
<item>
<title>学習・検証をする⑦　違うアルゴリズムを試す(線形回帰)</title>
<description>
<![CDATA[ <p><style type="text/css">table {margin: auto; border-collapse: collapse; border: 1px solid #333;text-align:center ;padding: 1px;}td {border-collapse: collapse; border: 1px solid #333;text-align:center ;padding: 1px;}th {background: #fff3B8 ;border-collapse: collapse; border: 1px solid #333 ;text-align:center ;padding: 1px;}.dvt{overflow: auto ; white-space: nowrap;}</style></p><p>　これまではLightGBMの2値分類で学習・検証を行ってきましたが、他のアルゴリズムだとどうなるんでしょうか。今回は線形回帰を試してみます。</p><p>&nbsp;</p><p>&nbsp;</p><h2 class="limited_heading09" data-entrydesign-alignment="center" data-entrydesign-count-input="part" data-entrydesign-part="limited_heading09" data-entrydesign-tag="h2" data-entrydesign-type="heading" data-entrydesign-ver="1.54.1" style="background:url(https://stat100.ameba.jp/ameblo/entry_designs/v1/sources/assets/limited044_heading.png) no-repeat;background-size:178px 11px;padding-bottom:19px;margin:8px 0;font-weight:bold;color:#424242;font-size:20px;line-height:1.6;min-height:32px;line-break:loose;overflow-wrap:break-word;text-align:center;background-position:center bottom"><span style="display:block"><span data-entrydesign-content="" style="display:block">利用するアルゴリズムと学習方法</span></span></h2><p>　線形回帰の学習・予測には「Scikit-learn」の「LinearRegression」を利用しました。anaconda環境なので</p><p>&nbsp;</p><div style="text-align:left;"><span>「conda install -c conda-forge scikit-learn」</span></div><p>&nbsp;</p><p>でちゃちゃっとインストール。</p><p>　というか、これまでのプログラムでも正答率の検証の「confusion_matrix」やLightGBMに学習させる前のデータ分割で「train_test_split」でも使ってたので既ににインストールされてましたが。</p><p>&nbsp;</p><p>　今回は線形回帰なので、対象銘柄が何%上昇するかを予測します。このため説明変数・目的変数は以下のようにします。</p><ul><li>　学習データ(説明変数)　：　これまでと同じ。週次ベースの過去からの騰落率などのデータ</li><li>　目的変数　：　2週間後の株価上昇率をそのまま利用</li></ul><p>　単純に元データで線形回帰で予測するパターン、アンダーサンプリングするパターン(元データがランダムになるのでバギングもする)の2パターンを試します。</p><p>&nbsp;</p><p>プログラムはこんな感じ</p><p>&nbsp;</p><pre class="code" data-lang="" data-unlink="" style=" color: #0000FF; background-color: #F2F2F2; ,margin: 0px 0px 10px; padding: 20px; border: 1px solid #eceef1; overflow: auto; font-family: Monaco, Consolas, 'Courier New', Courier, monospace, sans-serif; font-size: 1em; white-space: pre;">import pandas as pd import numpy as np from sklearn.metrics import confusion_matrixfrom imblearn.under_sampling import RandomUnderSamplerfrom sklearn.linear_model import LinearRegressionunder = 4 ##アンダーサンプリングの倍数R1 = 0.1 ##アンダーサンプリングのカット(倍数計算)用に利用。10%以上を1に設定するためR2 = 0.1 ##正解とする上昇率の下限 10%なら0.1。　0にすると0%以上アップで上昇銘柄全てを正解とするshikii=0.1 ##予測後の上昇率予想の閾値。「〇%以上騰がるという予測以上を採用」####アンダーサンプリング ＋ バギング用###def bagging_L(seed,X2,y2,Ztest2,under2):    ##アンダーサンプリングをする。under2を倍数として設定    f_count = y2.value_counts()[1] * under2    t_count = y2.value_counts()[1]    rus2 = RandomUnderSampler(sampling_strategy={0:f_count, 1:t_count},random_state=seed, replacement=True)    X2_resampled, y2_resampled = rus2.fit_resample(X2, y2)    ##アンダーサンプリング後の学習データ(X3)と目的変数(y3を作成    ##目的変数の元をXとしているのはF2week(騰落率)自体を目的変数にするので。引数で渡されてきたｙ2はアンダーサンプリングのための倍数設定用に10%以上で2値化されてるので利用不可    y3 = X2_resampled[['F2week']]     X3 = X2_resampled.drop('F2week',axis=1) ##学習データから目的変数をカット    print(seed) ##実行時に回数を表示する    ##モデルの作成    model_l = LinearRegression()    model_l.fit(X3,y3)       ##予測の実行    y_pred_up = model_l.predict(Ztest2)    return y_pred_updf1filename = "C:/HY-SBI/加工データ/kabu_ALL20172021.txt" #学習用の2017年～2021年のデータdf2filename = "C:/HY-SBI/加工データ/t_forpre/pred/AL22_2022.txt" #検証用の2022年のデータdf1 = pd.read_csv(df1filename) #pandasデータフレームのdf1に学習用データを設定df2 = pd.read_csv(df2filename) #pandasデータフレームのdf2に検証用データを設定####結果出力用にデータフレームを作成。銘柄コード・予測対象基準日の列で作成df_kekka=df2[['Mcode','kijyun_date']]###データ前処理 学習用データ### ##ノイズになりそうな情報をカットdf1=df1.drop('Mcode',axis=1) ##銘柄コードを削除　※銘柄コードによって学習結果が左右されないようにするためdf1=df1.drop('kijyun_date',axis=1) ##基準日を削除 ※日付によって学習結果が左右されないようにするため ##学習用データから目的変数をカット。基準日から先4週分の2週目以外削除(2週目はバギング先でyに利用)X=df1.drop('F1week',axis=1)X=X.drop('F3week',axis=1)X=X.drop('F4week',axis=1)XL=X.drop('F2week',axis=1) ####目的変数とアンダーサンプリング用。2週間先で10%以上上がった場合を「1」にセット、目的変数は2週間後の騰落値そのままdfy=df1.copy()dfy['F2week_pred'] = 0 ##一旦すべてゼロに。これを先にやっておくとnanにならないので。dfy.loc[dfy['F2week'] &gt;= R1,['F2week_pred']] = 1y =  dfy[['F2week_pred']] ##アンダーサンプリング＋バギングバージョンに渡すデータを作成yL= dfy[['F2week']] ##バギングなしバージョンの目的変数を作成###データ前処理 検証用データ### ##学習用データに項目合わせるためノイズになりそうな情報をカットdf2=df2.drop('Mcode',axis=1)df2=df2.drop('kijyun_date',axis=1) ##検証用データから目的変数をカット。基準日から先4週分の騰落率を削除Ztest=df2.drop('F1week',axis=1)Ztest=Ztest.drop('F2week',axis=1)Ztest=Ztest.drop('F3week',axis=1)Ztest=Ztest.drop('F4week',axis=1) ####目的変数の設定。2週間先で10%以上上がった場合を「1」にセット ※騰落率ではなく騰がったら正解dfZ=df2.copy()dfZ['F2week_pred'] = 0dfZ.loc[dfZ['F2week'] &gt;= R2,['F2week_pred']] = 1 #22年度検証の結果データとして2週間先のデータで10%以上騰がった場合を1にセット。 Zkekka = dfZ[['F2week_pred']] ##検証用に結果データの列だけにしておく####線形回帰モデル１(全データ単純型・・バギングなし)####学習の実施model_l = LinearRegression()model_l.fit(XL,yL)####22年データで予測し結果を格納y_pred_up = model_l.predict(Ztest)####線形回帰モデル２(アンダーサンプリング・バギング)y_pred_p=[]    for i in range(10):    y_pred_p.append(bagging_L(i,X,y,Ztest,under))y_pred_up2 = sum(y_pred_p)/len(y_pred_p)####結果出力用データフレームに結果を格納df_kekka['target_up']=y_pred_updf_kekka['target_up2']=y_pred_up2####予測採用する閾値(R2)以上を購入対象扱いとして１をセットdf_kekka['target_pred']=0df_kekka['target_pred2']=0df_kekka.loc[df_kekka['target_up'] &gt;= shikii , ['target_pred']] = 1df_kekka.loc[df_kekka['target_up2'] &gt;= shikii , ['target_pred2']] = 1###########結果の検証。cmatrix = confusion_matrix(Zkekka,df_kekka['target_pred'])cmatrix2 = confusion_matrix(Zkekka,df_kekka['target_pred2'])print(cmatrix)print(cmatrix2)</pre><p>&nbsp;</p><h2 class="limited_heading09" data-entrydesign-alignment="center" data-entrydesign-count-input="part" data-entrydesign-part="limited_heading09" data-entrydesign-tag="h2" data-entrydesign-type="heading" data-entrydesign-ver="1.54.1" style="background:url(https://stat100.ameba.jp/ameblo/entry_designs/v1/sources/assets/limited044_heading.png) no-repeat;background-size:178px 11px;padding-bottom:19px;margin:8px 0;font-weight:bold;color:#424242;font-size:20px;line-height:1.6;min-height:32px;line-break:loose;overflow-wrap:break-word;text-align:center;background-position:center bottom"><span style="display:block"><span data-entrydesign-content="" style="display:block">学習・検証の結果</span></span></h2><p>　結果についてです。予測結果は上昇率そのものを予測してますので、機械学習としてのモデル自体の評価は10%(0.1)以上を売買対象とした際の正解を見るべきなんでしょうが、実際は株の購入対象をどうしていくかが目的です。このためLightGBMの2値モデルと同じく、予測をカットする閾値を上げていって成績が変わっていくかを見ていく必要があります。</p><p>&nbsp;</p><p>　閾値を5%(0.05)～100%(1.0)近くまで変化させて、アンダーサンプリングなし、アンダーサンプリングあり(バギング10回)の結果を確認しました。</p><p>&nbsp;</p><div class="dvt"><table><caption><b>10%以上上昇したか？の結果</b></caption><tbody><tr><th rowspan="3">予測上昇率閾値</th><th colspan="3" rowspan="2">USなし</th><th colspan="9">USあり</th></tr><tr><th colspan="3">US６倍</th><th colspan="3">US５倍</th><th colspan="3">US４倍</th></tr><tr><th>×</th><th>〇</th><th>率</th><th>×</th><th>〇</th><th>率</th><th>×</th><th>〇</th><th>率</th><th>×</th><th>〇</th><th>率</th></tr><tr><td align="center">5%以上</td><td align="center">1797</td><td align="center">242</td><td align="center">11.9%</td><td align="center">4137</td><td align="center">658</td><td align="center">13.7%</td><td align="center">5487</td><td align="center">868</td><td align="center">13.7%</td><td align="center">8367</td><td align="center">1223</td><td align="center">12.8%</td></tr><tr><td align="center">8%以上</td><td align="center">819</td><td align="center">81</td><td align="center">9.0%</td><td align="center">1459</td><td align="center">191</td><td align="center">11.6%</td><td align="center">1760</td><td align="center">239</td><td align="center">12.0%</td><td align="center">2325</td><td align="center">358</td><td align="center">13.3%</td></tr><tr><td align="center">10%以上</td><td align="center">637</td><td align="center">46</td><td align="center">6.7%</td><td align="center">990</td><td align="center">112</td><td align="center">10.2%</td><td align="center">1124</td><td align="center">133</td><td align="center">10.6%</td><td align="center">1416</td><td align="center">182</td><td align="center">11.4%</td></tr><tr><td align="center">20%以上</td><td align="center">484</td><td align="center">14</td><td align="center">2.8%</td><td align="center">584</td><td align="center">21</td><td align="center">3.5%</td><td align="center">594</td><td align="center">24</td><td align="center">3.9%</td><td align="center">631</td><td align="center">34</td><td align="center">5.1%</td></tr></tbody></table></div><p>　※US：アンダーサンプリングの略です</p><p>&nbsp;</p><p>&nbsp;</p><p>　上昇率予想の閾値を上げるとどんどん成績が悪くなっていってしまいました。10%以上上昇するはずだと予測しているものの正解率が3%程度の成績では使い物になりません。また、予測数値5%以上を集計した方が実際に10%以上上昇した銘柄を当てているということは、10%以上の上昇予測よりも5%～10％間の上昇予測の方が成績が良いということですよね。なんだこれはという感じです。</p><p>&nbsp;</p><p>　10%以上上昇を正解とする検証はここで止めて、とにかく騰がったのかどうか(0%以上上昇を正解とする)ケースでもう少し見てみました。アンダーサンプリング数は5倍に固定して試してます。</p><p>&nbsp;</p><div style="overflow: auto; white-space: nowrap;"><table align="center" border="1" cellpadding="0" cellspacing="0"><caption align="center"><b>とにかく騰がったか(0%以上上昇)の結果)</b></caption><tbody><tr><th rowspan="2">予測上昇率閾値</th><th colspan="3">USなし</th><th colspan="3">US５倍</th></tr><tr><th>×</th><th>〇</th><th>率</th><th>×</th><th>〇</th><th>率</th></tr><tr><td align="center">5%以上</td><td align="center">1101</td><td align="center">938</td><td align="center">46.0%</td><td align="center">3439</td><td align="center">2916</td><td align="center">45.9%</td></tr><tr><td align="center">8%以上</td><td align="center">433</td><td align="center">467</td><td align="center">51.9%</td><td align="center">1091</td><td align="center">988</td><td align="center">47.5%</td></tr><tr><td align="center">10%以上</td><td align="center">335</td><td align="center">348</td><td align="center">51.0%</td><td align="center">673</td><td align="center">584</td><td align="center">46.5%</td></tr><tr><td align="center">15%以上</td><td align="center">246</td><td align="center">279</td><td align="center">53.1%</td><td align="center">366</td><td align="center">381</td><td align="center">51.0%</td></tr><tr><td align="center">20%以上</td><td align="center">226</td><td align="center">272</td><td align="center">54.6%</td><td align="center">295</td><td align="center">323</td><td align="center">52.3%</td></tr><tr><td align="center">30%以上</td><td align="center">217</td><td align="center">261</td><td align="center">54.6%</td><td align="center">271</td><td align="center">309</td><td align="center">53.3%</td></tr><tr><td align="center">50%以上</td><td align="center">213</td><td align="center">260</td><td align="center">55.0%</td><td align="center">257</td><td align="center">299</td><td align="center">53.8%</td></tr><tr><td align="center">60%以上</td><td align="center">212</td><td align="center">260</td><td align="center">55.1%</td><td align="center">255</td><td align="center">296</td><td align="center">53.7%</td></tr><tr><td align="center">90%以上</td><td align="center">212</td><td align="center">255</td><td align="center">54.6%</td><td align="center">252</td><td align="center">292</td><td align="center">53.7%</td></tr></tbody></table></div><p>&nbsp;</p><p>　上昇したかどうかを正解とした場合は上昇予測確率が上がるほど落ち込むということはなかったですが、かといって成績もそんなに上がってきてくれてません。また、20%上昇あたりを境にほとんど予測数も減ってこないということは、2週間後に100%以上上昇する(2倍になる)！ってとんでもない予測(要は異常値ですよねー)が結構あるようです。</p><p>&nbsp;</p><p>　ただ、もし異常値カットしても結局は平均的に予測が散っていてどの上昇確率でも似たような成績にしかなってないですけど、なのでこのモデルは株に向いた予測にはならないってことですかね。線形回帰モデルは失敗でした。</p>
]]>
</description>
<link>https://ameblo.jp/pikopiko9911/entry-12795527303.html</link>
<pubDate>Sun, 09 Apr 2023 21:26:46 +0900</pubDate>
</item>
<item>
<title>22年の仮想売買成績を再度チェック(学習データ量が増加したので)。ついでに21年以前も</title>
<description>
<![CDATA[ <p><style type="text/css">table {margin: auto; border-collapse: collapse; border: 1px solid #333;text-align:center ;padding: 1px;}td {border-collapse: collapse; border: 1px solid #333;text-align:center ;padding: 1px;}th {background: #fff3B8 ;border-collapse: collapse; border: 1px solid #333 ;text-align:center ;padding: 1px;}.dvt{overflow: auto ; white-space: nowrap;}</style></p><p>　データ量を増加させて新しく学習したモデルは格段に成績がアップしました。</p><p>(モデルの正答率の検証結果は<a href="https://ameblo.jp/pikopiko9911/entry-12795524637.html"><b>こちら(22年分)</b></a>と<a href="https://ameblo.jp/pikopiko9911/entry-12794598098.html"><b>こちら(21年以前分)</b></a>)</p><p>&nbsp;</p><p>　それに伴って2022年にもし買っていたら？という売買成績も再度チェックしてみたいと思います。</p><p>&nbsp;</p><h2 class="limited_heading09" data-entrydesign-alignment="center" data-entrydesign-count-input="part" data-entrydesign-part="limited_heading09" data-entrydesign-tag="h2" data-entrydesign-type="heading" data-entrydesign-ver="1.54.1" style="background:url(https://stat100.ameba.jp/ameblo/entry_designs/v1/sources/assets/limited044_heading.png) no-repeat;background-size:178px 11px;padding-bottom:19px;margin:8px 0;font-weight:bold;color:#424242;font-size:20px;line-height:1.6;min-height:32px;line-break:loose;overflow-wrap:break-word;text-align:center;background-position:center bottom"><span style="display:block"><span data-entrydesign-content="" style="display:block">売買実績検証のパターン</span></span></h2><p>&nbsp;</p><p>　前回は5パターンの購入方法・売却方法で確認しましたが、</p><ol><li>とにかく全部買っていった場合</li><li>500万の持ち高制限＋1単元が100万以上購入なし＋少額銘柄は20万MAXで購入単元数アップ＋10%損失時はロスカット</li></ol><p>の2パターンを検証してみました。</p><p>&nbsp;</p><h2 class="limited_heading09" data-entrydesign-alignment="center" data-entrydesign-count-input="part" data-entrydesign-part="limited_heading09" data-entrydesign-tag="h2" data-entrydesign-type="heading" data-entrydesign-ver="1.54.1" style="background:url(https://stat100.ameba.jp/ameblo/entry_designs/v1/sources/assets/limited044_heading.png) no-repeat;background-size:178px 11px;padding-bottom:19px;margin:8px 0;font-weight:bold;color:#424242;font-size:20px;line-height:1.6;min-height:32px;line-break:loose;overflow-wrap:break-word;text-align:center;background-position:center bottom"><span style="display:block"><span data-entrydesign-content="" style="display:block">仮想売買実績の結果(22年の場合)</span></span></h2><p>&nbsp;</p><p>　もし22年に購入していたら以下のような結果でした。アンダーサンプリング数は5倍に固定してます。</p><p>　今回は予想確率の採用する閾値も変えてみます。正答率の確認結果からも分かるように、実際に上昇した銘柄が含まれる結果確率(上昇期待値とでも名付けましょうか)も変わりますので、この閾値も変えてみたいと思います。</p><p>　※上昇期待値：実際に騰がった(0%以上上昇した)回数　÷　10%以上上昇すると予測した全数</p><p>&nbsp;</p><div class="dvt"><table align="center" border="1" cellpadding="0" cellspacing="0"><caption><b>22年に購入していたら？</b></caption><tbody><tr><th rowspan="2">採用確率閾値</th><th rowspan="2">上昇期待値</th><th colspan="3">パターン１(予想全１単元購入)</th><th colspan="2">パターン１(持ち高制限等あり)</th></tr><tr><th>利益</th><th>購入回数</th><th>最大持ち高</th><th>利益</th><th>購入回数</th></tr><tr><td align="center">40%以上</td><td align="center">63.7%</td><td align="center">8,480,450</td><td align="center">1353</td><td align="center">134,420,200</td><td align="center">-914,885</td><td align="center">457</td></tr><tr><td align="center">45%以上</td><td align="center">75.0%</td><td align="center">11,453,380</td><td align="center">876</td><td align="center">113,958,570</td><td align="center">1,301,360</td><td align="center">238</td></tr><tr><td align="center">50%以上</td><td align="center">86.9%</td><td align="center">10,141,890</td><td align="center">618</td><td align="center">94,446,550</td><td align="center">1,887,430</td><td align="center">103</td></tr><tr><td align="center">55%以上</td><td align="center">90.9%</td><td align="center">7,850,720</td><td align="center">459</td><td align="center">74,160,360</td><td align="center">1,624,530</td><td align="center">66</td></tr><tr><td align="center">60%以上</td><td align="center">94.9%</td><td align="center">5,533,850</td><td align="center">297</td><td align="center">46,640,500</td><td align="center">1,776,140</td><td align="center">52</td></tr></tbody></table></div><p>&nbsp;</p><p>　予想の上昇確率50%以上が結果は良さそうですね。40%以上を閾値にした場合は期待値が63%程度ですが全数購入では儲かってます。下落する銘柄もかなり含まれるようになりますが、それでも大幅上昇銘柄を当てているからトータルでは勝ってるようです。ただ、最大の持ち高が1億円を超えてくれてますのでこんな資産はないし実際は持ち高制限かけながらの購入になります。その場合は見事にマイナスに転落してますしバランス考えながら買うなら、さすがにこの閾値で運用するのは危険すぎる。</p><p>　上昇確率50%以上は無条件に採用し、45%以上は持ち高小さいときには追加的に買ってみるというような使い方が良いかもしれません。</p><p>&nbsp;</p><p>　まず22年の仮想運用ではかなり好結果となったのがうれしいですね。機械学習のお勉強で始めただけでしたが本当に良いモデルなのでは(使えるのでは？)と思ってきました。</p><p>&nbsp;</p><h2 class="limited_heading09" data-entrydesign-alignment="center" data-entrydesign-count-input="part" data-entrydesign-part="limited_heading09" data-entrydesign-tag="h2" data-entrydesign-type="heading" data-entrydesign-ver="1.54.1" style="background:url(https://stat100.ameba.jp/ameblo/entry_designs/v1/sources/assets/limited044_heading.png) no-repeat;background-size:178px 11px;padding-bottom:19px;margin:8px 0;font-weight:bold;color:#424242;font-size:20px;line-height:1.6;min-height:32px;line-break:loose;overflow-wrap:break-word;text-align:center;background-position:center bottom"><span style="display:block"><span data-entrydesign-content="" style="display:block">21年以前の仮想売買の結果</span></span></h2><p>　21年以前の場合も見てみます。分割によってデータ量は半減しますが、それなりの正答率は出てましたので参考にはなりそうです。</p><p>　予想確率の採用閾値を変えながら、2017年～2021年までの年毎の成績を確認しました。</p><p>&nbsp;</p><div style="overflow: auto; white-space: nowrap;"><table align="center" border="1" cellpadding="0" cellspacing="0"><caption align="center"><b>2021年以前 確率閾値60%以上</b></caption><tbody><tr><th rowspan="2">対象年</th><th colspan="2">全対象購入(1単元づつ)</th><th colspan="2">持ち高500万等制限あり</th></tr><tr><th>利益</th><th>購入回数</th><th>利益</th><th>購入回数</th></tr><tr><td align="center">2017年</td><td align="center">0</td><td align="center">0</td><td align="center">0</td><td align="center">0</td></tr><tr><td align="center">2018年</td><td align="center">6,088,350</td><td align="center">595</td><td align="center">1,045,868</td><td align="center">61</td></tr><tr><td align="center">2019年</td><td align="center">0</td><td align="center">0</td><td align="center">-17,250</td><td align="center">1</td></tr><tr><td align="center">2020年</td><td align="center">12,396,760</td><td align="center">1002</td><td align="center">2,423,574</td><td align="center">112</td></tr><tr><td align="center">2021年</td><td align="center">0</td><td align="center">0</td><td align="center">0</td><td align="center">0</td></tr><tr><td>合計</td><td align="center" colspan="2">1,8485,110</td><td align="center" colspan="2">3,452,192</td></tr></tbody></table></div><p>&nbsp;</p><div style="overflow: auto; white-space: nowrap;"><table align="center" border="1" cellpadding="0" cellspacing="0"><caption align="center"><b>2021年以前 確率閾値55%以上</b></caption><tbody><tr><th rowspan="2">対象年</th><th colspan="2">全対象購入(1単元づつ)</th><th colspan="2">持ち高500万等制限あり</th></tr><tr><th>利益</th><th>購入回数</th><th>利益</th><th>購入回数</th></tr><tr><td align="center">2017年</td><td align="center">0</td><td align="center">0</td><td align="center">0</td><td align="center">0</td></tr><tr><td align="center">2018年</td><td align="center">6,594,990</td><td align="center">668</td><td align="center">1,164,403</td><td align="center">71</td></tr><tr><td align="center">2019年</td><td align="center">144,400</td><td align="center">14</td><td align="center">114,020</td><td align="center">20</td></tr><tr><td align="center">2020年</td><td align="center">15,560,810</td><td align="center">1253</td><td align="center">3,593,523</td><td align="center">135</td></tr><tr><td align="center">2021年</td><td align="center">126,180</td><td align="center">5</td><td align="center">254,554</td><td align="center">6</td></tr><tr><td align="center">合計</td><td align="center" colspan="2">22,426,380</td><td align="center" colspan="2">5,126,500</td></tr></tbody></table></div><p>&nbsp;</p><div class="dvt"><table><tbody></tbody><caption><b>2021年以前 確率閾値50%以上</b></caption><tbody><tr><th rowspan="2">対象年</th><th colspan="2">全対象購入(1単元づつ)</th><th colspan="2">持ち高500万等制限あり</th></tr><tr><th>利益</th><th>購入回数</th><th>利益</th><th>購入回数</th></tr><tr><td>2017年</td><td>161,600</td><td>4</td><td>158,910</td><td>4</td></tr><tr><td>2018年</td><td>7,915,890</td><td>802</td><td>1,608,333</td><td>114</td></tr><tr><td>2019年</td><td>362,900</td><td>46</td><td>192,880</td><td>57</td></tr><tr><td>2020年</td><td>18,558,810</td><td>1532</td><td>4,165,943</td><td>185</td></tr><tr><td>2021年</td><td>519,930</td><td>56</td><td>960,253</td><td>26</td></tr><tr><td>合計</td><td colspan="2">22,426,380</td><td colspan="2">5,126,500</td></tr></tbody></table></div><p>&nbsp;</p><p>　過去も確実に儲かってるのでそこは成功です。が、採用閾値上げると2017年も2019年も2021年も購入機会がゼロ回だと？　閾値下げても異常に少ない。 まあ日経平均自体の騰落に各銘柄の騰落数も影響は受けるので年によってバラつきは出るんでしょうが、それにしてもちょっと偏りがあるモデルですね。</p><p>&nbsp;</p><p>　じっと耐えてチャンスがあるときに買って儲けていくことには使えるので、このモデルを軸としつつどう改良していくかが課題です。とりあえず一定の成果は得られたので一旦このモデルの検証はここまでにしようかなと思います。</p><p>&nbsp;</p><p>　※2019年に持ち高MAX版で1件発生しているのは、売買を仮想でするプログラムの関係で発生しただけで予想自体は2件出てました。連続週で予想が出た場合銘柄の購入はせずに前週購入分の売却時期延長をする仕様にしたので、単純売買の場合は延長購入なしになり、持ち高制限の場合は持ち高の関係で前週購入してなかったから購入対象になったみたいな感じです。ちょうど予想対象も1月冒頭でしたし。気にしないでください。</p>
]]>
</description>
<link>https://ameblo.jp/pikopiko9911/entry-12795565328.html</link>
<pubDate>Sat, 08 Apr 2023 10:44:50 +0900</pubDate>
</item>
</channel>
</rss>
