先輩たちは持ち株会に入っており、1000万円近くの利益が出ているらしい。
システムトレードで全く勝てないから「持ち株」と「SBI・バンガード・S&P500インデックス・ファンド」だけで良いじゃん……(泣
UKI氏は今年は暗号通貨戦略に舵を切るとのこと。
暗号通貨の仕組みを知ったのは、2014年のアメリカ赴任中。
赴任直後に知り合い作りにmeetupの赴任者セミナーに参加すると、銀行マンがやたらビットコインの購入を進めてきた。
アメリカに来たばかりで、知らない人に「仮想通貨」を勧めれたら怖い・危険としか思わないでしょ!
それ以降、できる限り目に入れないようにしていた。
そして今や、ビットコインの価値は高騰。
もはや食わず嫌いをしているのが馬鹿なレベルだ。
右も左も分からないけど、ビットコイン(BTC)を使ったバックテストをやってみよう。
BTC/JPYの日足データを扱ってみる
まずはビットコイン(BTC)のOHLC (Open-High-Low-Close)を取得する必要がある。
CryptowatchのAPIなどを使えば取得できるっぽいが、既にCSVがダウンロードできるサイトを発見した。
bitFlyer(ビットフライヤー)から情報提供を受けているっぽい。
Webサイトには次のように見えているが、これらの日足を2015年6月25日からCSVで取得可能だった。
「日付」「始値」「高値」「安値」「終値」「出来高」のデータが存在している。
でも、暗号通貨市場って24時間365日購入可能なんじゃないの?「始値」「終値」って何なのさ?
- 始値は、午前9時が多い
- 終値は、午後3時 or 4時が多い
ProtraでBTC/JPYの日足データを読み込む
ProtraでのCSVの読み込み方法は以前説明済だ。
ダウンロードしたCSVファイルを次のように加工する。
- 「前日比(%)」の列を削除
- 「出来高」の「K」文字を削除し1000倍する
- 日付の「降順」を「昇順」に変更する
- 順序を「日付」「始値」「高値」「安値」「終値」「出来高」にする
- 日付から「年」「月」「日」を対応
- 数値から「,」を削除
- 「始値」「高値」「安値」「終値」を1/10にする(500万円以上の資金で計算するならオプション)
- 一行目を削除する(これはオプション)
で、いつものデータに変更された。
加工済のCSVファイル(ファイル名「2.csv」)を「Protra\data\price\2」に置いてProtraで読み込んでみる。
次にProtraの「Protra\data」直下にある「index.txt」に次の2行目を追加する。
1 2 3 |
date=20220105 2,BTC/JPY ビットコイン 日本円,,1 1301,極洋,T1,100,S:20160928:0.1 |
これで「Protra.exe」を起動するとグラフが表示される。
新鮮味無いけどね……
ついてる仙人の投資手法の期待値を検証
BitflyerがAPIを公開しており、Pythonで自動売買システムを作る人が沢山いることは知ってる。
でも、今回試したいのは、
株式市場向けに利用していたシステムトレード環境でビットコインのバックテストをしたらどうなるか?
だ。
斎藤正章氏の手法、三点チャージ法を使ったところ、5年間で2,3回しかシグナルが出なかった。
なので、シグナルが出やすかった記憶がある次の手法を使うことにする。
【基本条件】
- 1) 初期費用 300万円
- 2) 単利運用
- 3) 最大5日間保有
- 4) 現物取引:1銘柄当たり仕掛け金額300万円
- 5) 買い
- 売買対象:ビットコイン(BTC)
【買いルール】
- 当日の陰線が終値に対して1.1%以上になったら、翌日寄り付きで買い
【売りルール】
- 当日の陽線が終値に対して0.6%以上になったら、翌日寄り付きで売り
バックテスト結果
バックテスト時間はビットコイン(BTC)だけで19秒。
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 |
株価データ: 日足 銘柄リスト: ビットコイン(BTC) 2015/07/02~2021/12/20における成績です。 ---------------------------------------- 全トレード数 170 勝ちトレード数(勝率) 101(59.41%) 負けトレード数(負率) 69(40.59%) 全トレード平均利率 2.47% 勝ちトレード平均利率 9.65% 負けトレード平均損率 -8.04% 勝ちトレード最大利率 27.83% 負けトレード最大損率 -22.51% 全トレード平均期間 7.92 勝ちトレード平均期間 7.22 負けトレード平均期間 8.96 ---------------------------------------- 必要資金 ¥3,234,558 最大ポジション(簿価) ¥2,999,678 最大ポジション(時価) ¥4,115,781 純利益 ¥12,256,500 勝ちトレード総利益 ¥28,464,160 負けトレード総損失 -¥16,207,670 全トレード平均利益 ¥72,097 勝ちトレード平均利益 ¥281,823 負けトレード平均損失 -¥234,894 勝ちトレード最大利益 ¥830,960 負けトレード最大損失 -¥665,964 プロフィットファクター 1.76 最大ドローダウン(簿価) -¥1,965,576 最大ドローダウン(時価) -¥2,525,390 ---------------------------------------- 現在進行中のトレード数 1 ---------------------------------------- 平均年利 54.13% 平均年利(直近5年) 61.50% 最大連勝 8回 最大連敗 5回 ---------------------------------------- [年度別レポート] 年度 取引回数 運用損益 年利 勝率 PF 最大DD 2021年 32回 ¥2,956,801円 91.41% 59.38% 2.04倍 -12.69% 2020年 29回 ¥4,192,737円 129.62% 68.97% 4.13倍 -12.81% 2019年 26回 ¥292,066円 9.03% 53.85% 1.11倍 -20.19% 2018年 30回 -¥1,201,370円 -37.14% 46.67% 0.77倍 -22.51% 2017年 27回 ¥3,706,022円 114.58% 62.96% 2.52倍 -18.75% 2016年 18回 ¥1,804,904円 55.80% 66.67% 2.71倍 -17.21% 2015年 8回 ¥505,339円 15.62% 62.50% 1.61倍 -12.28% |
利益曲線は次の通り。
おお!
ほぼ単調増加じゃん!
もう、これで良くない?
2020年と2021年の月毎の結果
2020年から大幅にビットコイン(BTC)の価格が向上しているので、もう少し詳細に確認してみよう。
2020年と2021年の月毎の結果は次のとおり。
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 |
[月別レポート] [2021年] 月度 取引回数 運用損益 勝率 PF 最大DD 12月 2回 -¥223,197円 0.00% 0.00倍 -5.99% 11月 3回 -¥140,644円 66.67% 0.48倍 -9.33% 10月 2回 ¥676,784円 100.00% ∞倍 0.00% 9月 2回 ¥111,925円 100.00% ∞倍 0.00% 8月 2回 ¥820,169円 100.00% ∞倍 0.00% 7月 2回 -¥491,430円 0.00% 0.00倍 -10.37% 6月 5回 ¥593,075円 60.00% 2.40倍 -9.66% 5月 2回 -¥623,784円 0.00% 0.00倍 -12.14% 4月 2回 -¥140,000円 50.00% 0.59倍 -12.69% 3月 4回 ¥552,962円 50.00% 4.93倍 -2.80% 2月 3回 ¥1,269,682円 100.00% ∞倍 0.00% 1月 3回 ¥551,259円 66.67% 2.68倍 -12.25% [2020年] 月度 取引回数 運用損益 勝率 PF 最大DD 12月 4回 ¥1,377,142円 75.00% 39.87倍 -1.21% 11月 1回 ¥485,058円 100.00% ∞倍 0.00% 10月 3回 ¥665,642円 100.00% ∞倍 0.00% 9月 2回 -¥173,040円 50.00% 0.37倍 -9.40% 8月 2回 ¥321,836円 100.00% ∞倍 0.00% 7月 2回 -¥81,060円 0.00% 0.00倍 -1.71% 6月 2回 ¥146,060円 100.00% ∞倍 0.00% 5月 3回 ¥453,302円 66.67% 45.48倍 -0.35% 4月 3回 ¥11,630円 33.33% 1.04倍 -9.00% 3月 2回 -¥22,538円 50.00% 0.94倍 -12.81% 2月 2回 -¥72,416円 50.00% 0.73倍 -9.05% 1月 3回 ¥1,081,121円 100.00% ∞倍 0.00% |
うん。よく分からない。
利益曲線は次の通り。
300万円の運用で2倍以上に跳ね上がってる!イイね!
ただ、ビットコイン(BTC)のチャートを見る限り、チャートの値動きそのものな気がする。
ドローダウンの観点ではシステムトレードの方が優秀にみえる。
とはいえ、騰落レシオ的な横串指標が無ければ、暴落が発生すれば一緒に死ぬだけだけどね。
まとめ
暗号資産(仮想通貨)の事は何も分かってないが、OSSのシステムトレードのソフト「Protra」を使って初めてバックテストを行ってみた。
結果としてはOHLCさえ入出できれば問題なくバックテスト可能だということが分かった。
ということで、とりあえず bitFlyer の口座だけは作ってみた。
ソースコード
バックテストには無料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 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 145 146 147 148 149 150 151 152 153 154 155 156 157 |
# loop-type: date-only //============================== require "TIlib" require "Utility" require "TrendCheck" // ====================================== // ついてる仙人の投資手法 // ====================================== codes = CodeList if ($code_num && $code_num != Length(codes)) Print("前回と異なる銘柄リストでは実行できません。") Dummy end $code_num = Length(codes) //グローバル変数を初期化 if (!$__INIT__) $budgetIni = 3000000 $buyUnit = 3000000 // 1回の購入資金 (300万円) $MaxHoldDay = 5 // 最大保有日数 $shortSelling = 0 // 空売り戦略 Yes(1)/No(0) $Interest = 1 // 無制限(0) / 単利(1) / 複利(2) $reverse = 1 // 購入順序 昇順(0) / 降順(1) $udcount = 0 // 騰落レシオ利用数 Init() //------------------------------------------------ //------------------------------------------------ InitDone() // 騰落レシオ初期化 $__INIT__ = 1 end def Main(i) //================================================== // 条件(買条件, 売条件共通部分) //================================================== //まだ上場していない銘柄は株価データがないためnullが返る if (Index == null) return end if ($order[(int)Code] == -1) $order[(int)Code] = i //銘柄ごとのグローバル変数を初期化する $hold[i] = 0 end //================================================== // 保有してない→購入 //================================================== if (! $hold[i]) if ! (Close && Open) return end flag1 = Open - Close >= 0 flag2 = (float)(Open - Close) / Close >= 0.011 //================================================== // 売買(買い) //================================================== if (flag1 && flag2) PrintLog("購入候補") $buyflag[i][0] = 1 // 購入フラグ $buyflag[i][1] = 1 // 好きなパラメータをもとにソート $buyflag[i][2] = $buyflag[i][0] // 手法別に売りを変える場合 $buyCnt = $buyCnt + 1 end //================================================== // 保有している→売却 //================================================== elsif ($hold[i]) if ($set[i] < 1) $set[i] = 1 return end $set[i] = $set[i] + 1 //================================================== // 売買(売り) //================================================== // [終値]が[建て値(+15.00%)]より[大きい] if (Close >= 1.10 * $buy[i]) // 1) 利食い:10%のプラス PrintLog("利食い") $sellflag[i] = 1 $set[i] = 0 elsif ($set[i] > $MaxHoldDay) PrintLog("損切り") $sellflag[i] = 2 $set[i] = 0 end end end //==================== // 買い処理 //==================== def SortBuy() if ! (HasPricedata({1}Open)) 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 >= 2015) 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 |