パクリ投資法。
ようするに他人と同じ銘柄を購入して利益を狙う投資法。
自分で銘柄を調べて分析、判断するよりも、とりあえず成績の良い投資信託や有名投資家の保有銘柄を買う。
1970~80年代の最高のトレーダーの1人として知られるエド・スィコータは、
「普通のトレーダーに贈るアドバイスとして一番重要なことは何か?」
と問われ
「自分より優れたトレーダーを探すこと」
だと断言している。
ただし、かぶ1000氏がツイキャスで
「真似ても良いけど、購入理由まで含めて理解しないと成長しない」
と語っていた記憶がある。
きれいごとぬかしてるじゃねーーーっ!!
この世に自分ほど信じられんものがほかにあるかあああっ!!
(C)椎名高志 / GS美神 極楽大作戦!!
システムトレードが上手くいかないから、ちょくちょく裁量に手を出してしまう。
そんな時の私の購入方法をまとめてみた。
- ①ネットのファイナンスニュースで「最近調子が良い」「注目している」など書かれた記事を発見する
- ②Yahooファイナンス・みんかぶの掲示板でコメントを確認する
- ③ポジティブコメントだと(個人的に)判断したら即購入する
……あっ、これ「カモ」そのものじゃない?
何も成長していないww
パクリ投資ぐらいやった方が良いんじゃない?
例えば多くの個人投資家が「買い」だと売買予想している銘柄ってどうだろう?
今回は、これを検証をしてみよう。
みんかぶの売買予想とは何か?
みんかぶには、個人投資家が24時間毎に投稿した売買予想の数を基に、「買い」と「売り」で個別に集計した結果が表示されている。
2週間さかのぼって確認できる。
実際にこのデータを使ってバックテストを行ったブログを見つけた。
そこで、5月17日に、一方的に買い、売りの支持を集めている銘柄を買い、売り、それぞれ10銘柄づつPICKしてみました。
その結果、20銘柄の平均獲得ポイントが、5月21日21.7ポイント、23日23.3ポイント、25日21.1ポイントと、大幅プラスの成績となりました。
大幅なプラス成績!!
これは期待が高まる!!
Python+Seleniumを使ったHTMLデータの抽出
Webスクレイピングのお時間です。動的にコンテンツが変わるサイトなので諦めSeleniumを使いましょう。
下記のスクリプトを平日だけ実行するようにしておけば、データがどんどんCSVに溜まっていく。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 |
import re import bs4 import sys import csv import time import urllib import datetime import requests from selenium import webdriver from selenium.common.exceptions import NoSuchElementException from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import Select import functools print = functools.partial(print, flush=True) _BASE_URL = "https://minkabu.jp/pick/balance/buy" class Minkabu: """ Minkabuの売買銘柄取得 """ def __init__(self, proxy=None, proxy_user=None, proxy_password=None): """ コンストラクタ :param str proxy: プロキシ :param str proxy_user: プロキシのユーザ名 :param str proxy_password: プロキシのパスワード """ self._proxy = proxy self._proxy_user = proxy_user self._proxy_password = proxy_password # open browser self._br = self._open_browser(_BASE_URL) def __del__(self): """ デストラクタ """ self._br.close() self._br.quit() def _add_url_param(self, url, params): return url + '?' + urllib.parse.urlencode(params) def _get_authorized_webdriver(self, url): """ Go though azure certification :param str url: Opened url(str :return Instance of selenium """ options = webdriver.ChromeOptions() options.add_argument('--headless') options.add_argument('--log-level=3') options.add_argument('--no-sandbox') # Bypass OS security model driver = webdriver.Chrome('chromedriver.exe', options=options) driver.get(url) while True: # print(driver.current_url) if url in driver.current_url: break time.sleep(1) return driver def _open_browser(self, page): """ Open url on selenium :param str url: Opened url(str :return Instance of selenium """ # print(page) driver = self._get_authorized_webdriver(page) session = requests.session() for cookie in driver.get_cookies(): session.cookies.set(cookie["name"], cookie["value"]) return driver def get_stock_list(self): """ 売買銘柄を入手 :param str url: """ print(_BASE_URL) self._br.get(_BASE_URL) html = self._br.page_source # 切り出す result = html.split('現在 の予想数ランキング',1) t_stock = "" if (len(result) >= 2): tmp = result[1].split('売り',1) # UTF-8 を指定してファイルを出力する if ("買い" in tmp[0]): soup = bs4.BeautifulSoup(tmp[0], "html.parser") h = soup.select(".theme_buy") for s in h: text = re.findall(r'(\d{4})',s.get_text()) t_stock = t_stock + "," + text[0] return t_stock # 購入銘柄毎に購入処理 def main(): start = time.time() day = datetime.date.today() today = day.strftime('%Y/%m/%d') # サイトアクセス kabu = Minkabu() result = kabu.get_stock_list() del kabu with open('all_names.csv', 'a', encoding='UTF-8') as f: f.write(today + result + "\n") elapsed_time = time.time() - start print ("elapsed_time:{0}".format(elapsed_time) + "[sec]") return True if __name__ == '__main__': main() |
ある程度溜まったら、バックテストを行う。
すでに2ヶ月分の結果を既に入手済だ。
1 2 3 4 5 6 7 8 9 |
2022/3/12,2345,2666,4996,5218,5698 2022/3/11,6269,7203,7792,9101,1605 2022/3/10,7064,7078,3409,2038,2923 2022/3/09,3409,7064,7078,4238,7203 2022/3/08,7203,4238,7205,9927,3409 2022/3/07,2038,7203,1443,5713,5781 2022/3/06,6758,3962,4493,5781,7203 2022/3/05,2353,3962,3315,5721,1518 .... |
みんかぶで買い傾向の強い銘柄の購入期待値検証
売買ルールは適当に決めた。
【基本条件】
- 1) 初期費用 300万円
- 2) 単利運用
- 3) 現物取引:1銘柄当たり仕掛け金額50万円
- 4) 買い
【買いルール】
次を満たす場合に、ランキングに従い翌日寄り付きで買い
- みんかぶの売買予想「買い」上位5位
【売りルール】
売るタイミングは分からないので、幾つかの実験を行う。
- 実験1)3日後に売る
- 実験2)購入日に売る(デイトレード)
- 実験3)5日後に売る
バックテスト結果
バックテスト時間は全銘柄で1分。
約2ヶ月だからね。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
株価データ: 日足 銘柄リスト: 全銘柄 2022/01/24~2022/03/11における成績です。 ---------------------------------------- 全トレード数 47 勝ちトレード数(勝率) 18(38.30%) 負けトレード数(負率) 29(61.70%) 全トレード平均利率 -1.70% 勝ちトレード平均利率 6.95% 負けトレード平均損率 -7.07% 勝ちトレード最大利率 24.19% 負けトレード最大損率 -21.64% 全トレード平均期間 4.55 勝ちトレード平均期間 4.67 負けトレード平均期間 4.48 ---------------------------------------- 必要資金 ¥3,212,045 最大ポジション(簿価) ¥2,981,600 最大ポジション(時価) ¥3,202,400 純利益 -¥431,231 勝ちトレード総利益 ¥587,700 負けトレード総損失 -¥1,018,931 全トレード平均利益 -¥9,175 勝ちトレード平均利益 ¥32,650 負けトレード平均損失 -¥35,136 勝ちトレード最大利益 ¥126,500 負けトレード最大損失 -¥108,800 プロフィットファクター 0.58 最大ドローダウン(簿価) -¥638,131 最大ドローダウン(時価) -¥588,031 ---------------------------------------- 現在進行中のトレード数 3 ---------------------------------------- 平均年利 -13.43% 平均年利(直近5年) -2.69% 最大連勝 4回 最大連敗 6回 ---------------------------------------- [年度別レポート] 年度 取引回数 運用損益 年利 勝率 PF 最大DD 2022年 47回 -¥431,231円 -13.43% 42.55% 0.58倍 -21.64% ---------------------------------------- [年度別ドローダウンレポート] 年度 最大DD(簿価) 最大DD(時価) 2022年 -¥108,800(2022/03/04) -¥153,400(2022/03/02) ---------------------------------------- [月別レポート] [2022年] 月度 取引回数 運用損益 勝率 PF 最大DD 12月 0回 ¥0円 NaN NaN倍 0.00% 11月 0回 ¥0円 NaN NaN倍 0.00% 10月 0回 ¥0円 NaN NaN倍 0.00% 9月 0回 ¥0円 NaN NaN倍 0.00% 8月 0回 ¥0円 NaN NaN倍 0.00% 7月 0回 ¥0円 NaN NaN倍 0.00% 6月 0回 ¥0円 NaN NaN倍 0.00% 5月 0回 ¥0円 NaN NaN倍 0.00% 4月 0回 ¥0円 NaN NaN倍 0.00% 3月 14回 -¥439,631円 28.57% 0.14倍 -21.64% 2月 27回 ¥111,700円 51.85% 1.30倍 -17.18% 1月 6回 -¥103,300円 33.33% 0.23倍 -10.93% |
利益曲線は次の通り。
予想に反して損失計上。
デイトレードの場合
こちらも同じくバックテスト時間は全銘柄で1分。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
株価データ: 日足 銘柄リスト: 全銘柄 2022/01/24~2022/03/11における成績です。 ---------------------------------------- 全トレード数 63 勝ちトレード数(勝率) 22(34.92%) 負けトレード数(負率) 41(65.08%) 全トレード平均利率 -0.23% 勝ちトレード平均利率 4.58% 負けトレード平均損率 -2.82% 勝ちトレード最大利率 14.71% 負けトレード最大損率 -16.31% 全トレード平均期間 1.46 勝ちトレード平均期間 1.64 負けトレード平均期間 1.37 ---------------------------------------- 必要資金 ¥2,038,000 最大ポジション(簿価) ¥2,016,200 最大ポジション(時価) ¥2,068,800 純利益 -¥62,163 勝ちトレード総利益 ¥480,137 負けトレード総損失 -¥542,300 全トレード平均利益 -¥987 勝ちトレード平均利益 ¥21,824 負けトレード平均損失 -¥13,227 勝ちトレード最大利益 ¥69,000 負けトレード最大損失 -¥64,200 プロフィットファクター 0.89 最大ドローダウン(簿価) -¥130,963 最大ドローダウン(時価) -¥140,475 ---------------------------------------- 現在進行中のトレード数 2 ---------------------------------------- 平均年利 -3.05% 平均年利(直近5年) -0.61% 最大連勝 5回 最大連敗 6回 ---------------------------------------- [年度別レポート] 年度 取引回数 運用損益 年利 勝率 PF 最大DD 2022年 63回 -¥62,163円 -3.05% 50.79% 0.89倍 -16.31% ---------------------------------------- [年度別ドローダウンレポート] 年度 最大DD(簿価) 最大DD(時価) 2022年 -¥64,200(2022/03/09) -¥60,000(2022/02/08) ---------------------------------------- [月別レポート] [2022年] 月度 取引回数 運用損益 勝率 PF 最大DD 12月 0回 ¥0円 NaN NaN倍 0.00% 11月 0回 ¥0円 NaN NaN倍 0.00% 10月 0回 ¥0円 NaN NaN倍 0.00% 9月 0回 ¥0円 NaN NaN倍 0.00% 8月 0回 ¥0円 NaN NaN倍 0.00% 7月 0回 ¥0円 NaN NaN倍 0.00% 6月 0回 ¥0円 NaN NaN倍 0.00% 5月 0回 ¥0円 NaN NaN倍 0.00% 4月 0回 ¥0円 NaN NaN倍 0.00% 3月 17回 -¥77,863円 41.18% 0.59倍 -16.31% 2月 34回 ¥68,200円 61.76% 1.33倍 -12.02% 1月 12回 -¥52,500円 33.33% 0.64倍 -8.52% |
利益曲線は次の通り。
デイトレなら可能性があるかも!
と思っていたが夢は儚く消えた……。
5日間保有する場合
バックテスト時間は全銘柄で1分。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
株価データ: 日足 銘柄リスト: 全銘柄 2022/01/24~2022/03/11における成績です。 ---------------------------------------- 全トレード数 30 勝ちトレード数(勝率) 10(33.33%) 負けトレード数(負率) 20(66.67%) 全トレード平均利率 -2.47% 勝ちトレード平均利率 10.50% 負けトレード平均損率 -8.95% 勝ちトレード最大利率 24.00% 負けトレード最大損率 -26.13% 全トレード平均期間 7.50 勝ちトレード平均期間 7.90 負けトレード平均期間 7.30 ---------------------------------------- 必要資金 ¥3,284,400 最大ポジション(簿価) ¥2,959,500 最大ポジション(時価) ¥3,253,500 純利益 -¥394,400 勝ちトレード総利益 ¥516,300 負けトレード総損失 -¥910,700 全トレード平均利益 -¥13,147 勝ちトレード平均利益 ¥51,630 負けトレード平均損失 -¥45,535 勝ちトレード最大利益 ¥125,500 負けトレード最大損失 -¥156,800 プロフィットファクター 0.57 最大ドローダウン(簿価) -¥416,300 最大ドローダウン(時価) -¥476,900 ---------------------------------------- 現在進行中のトレード数 5 ---------------------------------------- 平均年利 -12.01% 平均年利(直近5年) -2.40% 最大連勝 5回 最大連敗 7回 ---------------------------------------- [年度別レポート] 年度 取引回数 運用損益 年利 勝率 PF 最大DD 2022年 30回 -¥394,400円 -12.01% 33.33% 0.57倍 -26.13% ---------------------------------------- [年度別ドローダウンレポート] 年度 最大DD(簿価) 最大DD(時価) 2022年 -¥156,800(2022/03/08) -¥85,600(2022/01/31) ---------------------------------------- [月別レポート] [2022年] 月度 取引回数 運用損益 勝率 PF 最大DD 12月 0回 ¥0円 NaN NaN倍 0.00% 11月 0回 ¥0円 NaN NaN倍 0.00% 10月 0回 ¥0円 NaN NaN倍 0.00% 9月 0回 ¥0円 NaN NaN倍 0.00% 8月 0回 ¥0円 NaN NaN倍 0.00% 7月 0回 ¥0円 NaN NaN倍 0.00% 6月 0回 ¥0円 NaN NaN倍 0.00% 5月 0回 ¥0円 NaN NaN倍 0.00% 4月 0回 ¥0円 NaN NaN倍 0.00% 3月 10回 -¥416,300円 10.00% 0.01倍 -26.13% 2月 16回 ¥268,800円 56.25% 2.11倍 -10.78% 1月 4回 -¥246,900円 0.00% 0.00倍 -22.17% |
利益曲線は次の通り。
話にならねーな!
まとめ
結論。
大衆が言うことは信じるな
素人が何人集まって予想しても意味が無い。そもそも投資家の9割は負けているって言うしね。
と結論づけても良いけど、買うタイミングと売るタイミングがパクれていないのが問題なのかもしれない。
そして2ヶ月程度のバックテスト結果では真偽は分からない。
コロナやロシアによるウクライナ侵攻により、誰にも読めない難しい時期だしね。
ソースコード
バックテストには無料OSSの「Protra」を利用した。
TIlib、Utility、TrendCheck、TOPIXライブラリはGitHubに置いている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
import datetime # Protraファイルの作成 def create_protra_dataset(code, date): s = "" s += " if ((int)Code == " + code + ")\n" s += " if ( \\\n" (year, month, day) = date.split('/') s += "(Year == " + str(int(year)) + " && Month == " + str(int(month)) + " && Day == " + str(int(day)) + ") || \\\n" s += " (Year == 3000))\n" s += " return 1\n" s += " end\n" s += " end\n" return s def merge_protra_dataset(s): a = "def IsBUYDATE\n" b = " return 0\n" b += "end\n" return a + s + b # CSVの読み込み def read_csv(): s = "" with open("minkabu.csv", 'r') as f: file_data = f.readlines() for line in file_data: ten = line.replace('\n', '').split(',') for i in range(1,6): tmp = create_protra_dataset(ten[i], ten[0]) # print(ten[0] + "," + ten[i]) i = i + 1 s = s + tmp return s # Protraの価格リストの読み出し if __name__ == '__main__': s = read_csv() with open("Minkabu.pt", mode='w') as f: f.write(merge_protra_dataset(s)) |
作成された「Minkabu.pt」をProtraのLibの下に起き、下記のバックテストを走らせる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 |
# loop-type: date-only //============================== require "TIlib" require "Utility" require "TrendCheck" require "TOPIX500" require "Minkabu" // ====================================== // // ====================================== codes = CodeList if ($code_num && $code_num != Length(codes)) Print("前回と異なる銘柄リストでは実行できません。") Dummy end $code_num = Length(codes) //グローバル変数を初期化 if (!$__INIT__) $budgetIni = 3000000 $buyUnit = 500000 // 1回の購入資金 (300万円) $MaxHoldDay = 5 // 最大保有日数 $shortSelling = 0 // 空売り戦略 Yes(1)/No(0) $Interest = 1 // 無制限(0) / 単利(1) / 複利(2) $reverse = 0 // 購入順序 昇順(0) / 降順(1) $udcount = 0 // 騰落レシオ利用数 Init() //------------------------------------------------ //------------------------------------------------ InitDone() // 騰落レシオ初期化 $__INIT__ = 1 end def Main(i) //================================================== // 条件(買条件, 売条件共通部分) //================================================== //まだ上場していない銘柄は株価データがないためnullが返る if (Index == null) return end if ($order[(int)Code] == -1) $hold[i] = 0 $order[(int)Code] = i end //================================================== // 保有してない→購入 //================================================== if (! $hold[i]) //================================================== // 売買(買い) //================================================== flag1 = IsBUYDATE() if (flag1) $buyflag[i][0] = 1 $buyflag[i][1] = flag1 // 好きなパラメータをもとにソート $buyflag[i][2] = 1 $buyCnt = $buyCnt + 1 end //================================================== // 保有している→売却 //================================================== elsif ($hold[i]) if ($set[i] < 1) $set[i] = 1 return end $set[i] = $set[i] + 1 //================================================== // 売買(売り) //================================================== if ($set[i] >= $MaxHoldDay) PrintLog("手仕舞い") $sellflag[i] = 1 $set[i] = 0 end end end //==================== // 買い処理 //==================== def SortBuy() if ! (HasPricedata(Close)) return end $long = 0 $long = Num($buyUnit, Close) codeset = $order[(int)Code] Buying(codeset) end //==================== // 売り処理 //==================== def Sell_(i) if ($sellflag[i]) Selling(i) $sellflag[i] = 0 $buyflag[i][2] = 0 end // 使用した$buyflag 配列を初期化 if ($buyflag[i][0]) $buyflag[i][0] = 0 $buyflag[i][1] = 0 end end //==================== // 銘柄コードを変えながらMain関数,BuySell関数を実行 //==================== if ! (Year >= 2022) return end Print("-------------------------------------------------") Print("日付 = "+ Year + "/" + Month + "/" + Day) $buyCnt = 0 // 購入数初期化 i = -1 while (i + 1 < $code_num) i = i + 1 {codes[i]}Main(i) end i = 0 if ($buyCnt) sortList = SelectionSort(10, 0) cnt = $buyCnt if ($buyCnt > 10) cnt = 10 end while i < cnt {sortList[i]}SortBuy() i = i + 1 end end i = -1 while i + 1 < $code_num i = i + 1 {codes[i]}Sell_(i) end |