TradingViewで検証:時限式ドンチアン・トレンド

Posted on December 11th, 2018Updated on May 4th, 2019
TradingViewで検証:時限式ドンチアン・トレンド

※ この記事は最終更新日から5年以上が経過しています。

どんな記事

今回はなんといっても、「 〝常識はずれ〟な決済ロジック」がポイントです!

  1. 誰もが 〝躊躇してしまう〟ような手法の成績 がわかる(本に掲載されていた〝勝てる〟手法)
  2. あなたも好きな銘柄で、この記事と同じバックテスト ができる(コードを公開、TradingViewでも公開)

ぜひ、お読みください^^

タートルズ流 投資の魔術 からの引用

まずは、「時限式ドンチアン・トレンド」について書かれている箇所を、書籍「伝説のトレーダー集団 タートルズ流投資の魔術」から引用します。

 ドンチアン・トレンド・システムの変形、時限退出付きドンチアン・トレンド・システムは、ブレイクアウトの退出のかわりに時間にもとづいた退出を用いる。80日経てば退出し、どんなストップも使わない。

 仕掛けは問題ではなく、手じまいだけが問題だというトレーダーは多い。このシステムがその発言への筆者の答えだ。このシステムのパフォーマンスを他のシステムのそれと比べると、この非常に単純なシステムがもっと複雑な退出にまったく引けをとらないことがわかるだろう。

引用元
伝説のトレーダー集団 タートルズ流投資の魔術(P.169)

「この非常に単純なシステムがもっと複雑な退出にまったく引けをとらないことがわかるだろう。」

別の記事でまとめる予定ですが、確かに、書籍に掲載されているバックテストの結果を見ると〝まったく引きをとらない〟ものになっています。しかし、書いてあることをただ鵜呑みにしてしまうのは〝あまりにも安易〟です。

  • 本当に良い結果になるのか?
  • 銘柄が変わって、テスト期間が変わっても、同じような結果になるのか?

この記事は、上記の手法をTradingViewで再現することを目的としたものです。

ストラテジーを作成

TradingViewストラテジー 時限式ドンチアン・トレンド

エントリーとイグジット

ポイントはなんと言っても「80営業日の経過で決済」です。他の一切の決済は行いません。エントリーしたら、80営業日を経過するまで〝何が起ころうとも〟決済しない。そういうスキームです。

にわかには信じられませんが、これで「勝てる」と紹介されているわけです。

買いエントリー

  • 「EMA25 が EMA350 を上回っている + 20日間の最高値をブレイク」で買いエントリー
  • 80営業日の経過で決済(他の一切の決済を行わない)
※ EMA●●:●●日指数平滑移動平均
TradingViewストラテジー 時限式ドンチアン・トレンド 買いシグナルとイグジット

売りエントリー

  • 「EMA25 が EMA350 を下回っている + 20日間の最安値をブレイク」で売りエントリー
  • 80営業日の経過で決済(他の一切の決済を行わない)
TradingViewストラテジー 時限式ドンチアン・トレンド 売りシグナルとイグジット

信じがたいですが、簡単な話です。疑わしいなら「試してみれば良いだけ」です。

バックテスト

同じ条件で手法を比べるために、以下の「基本条件」でテストしていきます。

バックテストの基本条件

期間

  • 2005年1月1日 ~ 2017年12月31日(12年間)

資金管理

  • 単利

銘柄

為替USDJPY、EURJPY、GBPJPY、CHFJPY、CADJPY
株価指数NKY日経225、DJI NYダウ、DAXドイツ、UKXイギリスFTSE、HSI香港ハンセン
日本株6098リクルート、4452花王、5711三菱マテリアル、7201日産、9984ソフトバンクグループ
米株AAPLアップル、AXPアメリカン・エクスプレス、BAボーイング、JNJジョンソン・エンド・ジョンソン、MCDマクドナルド
海外商品金、白金、原油、コーン、大豆

手法は、市場との相性があるケースも多いので、主要な各市場から5銘柄ずつピックアップしてテストしています。

テスト1

まずは、いつものように「こうだっただろう」と思われる設定でテストをしていきます。

テスト1 設定

DC-enEMA-mEMA-lTime-exPyramiding
202535080-daysNone

ドンチアンの決済とロスカットの機能は削除しました。あくまでも、この記事における決済は「時限式の決済」のみにします。

テスト1 結果

損益最大DD取引数勝数勝率RR比
Total84844752.711.24
USDJPY21.2620.88361644.441.626
EURJPY24.1230.54342161.760.753
GBPJPY129.9627.13362158.331.6
CHFJPY-22.8746.33361747.220.848
CADJPY17.2127.39361644.441.536
NKY6165.027838.22341647.061.454
DJI9609.523697.51352262.861.231
DAX4783.093590.56372239.461.062
UKX-548.53116.4372054.050.772
HSI10765.3814060.68341852.941.263
60988363056466.671.374
445228271398331648.481.875
5711-49509030351542.860.87
7201-752.3800.3341441.180.973
998430194067331854.551.129
AAPL117.640.69352674.290.843
AXP53.4723.53352365.710.843
BA234.9751.033521602.031
JNJ-8.2640.38351645.711.077
MCD74.9920.63341852.941.85
GOLD11052044680352262.861.353
PLATINUM2019543480351954.290.993
WTI4583084110351748.571.316
CORN-1600034762.5371540.541.152
SOY BEANS-192544087.5361438.891.539

まず、ここで読み取れる特長を列挙してみます。

  • これまでの手法と比べて「勝率」が高め
  • 「ドンチアン・トレンド・システム」と比較して「取引回数」が減少
  • 『「損益」がマイナスの銘柄数』が増えている気がする(感覚)

テスト1 統計

破産の確率期待値/リスク収益の見込み
0.00%0.179152.12

破産の確率は、損失の許容=2%で算出しています。期待値と収益の見込みは以下の計算式で算出しています。

期待値=勝率×RR比1勝率\text{期待値} = \text{勝率} \times \text{RR比} - | 1 - \text{勝率}|
収益の見込み=期待値×取引回数\text{収益の見込み} = \text{期待値} \times \text{取引回数}

1項目ずつTradingViewの結果を手入力していくのですが(CSVとかで吐き出せたら良いのに)、「損益」がマイナスの銘柄が多くて「あれ、やっぱりこの手法ダメなんじゃないか」なんて思っていたのですが、集計してみると意外と勝てています。ただ、前回の「ドンチアン・トレンド・システム」よりは悪いですね。

テスト2

せっかくなので、いくつかの変数を調整できるように作りました。まずは、「Pyramiding(増し玉)」の設定を変更してテストしてみます。

テスト2 設定

DC-enEMA-mEMA-lTime-exPyramiding
202535080-days1-ATR 上限4

「エントリーした価格からプラス方向にATRの1倍動いたらポジションを追加する」というものです。最初のものを含めて4回のエントリーが上限です。

テスト2 結果

損益最大DD取引数勝数勝率RR比
Total2749147853.77%1.23
USDJPY95.9850.761126255.361.232
EURJPY118.3276.461147061.40.915
GBPJPY282.86111.631316952.671.483
CHFJPY-48.39117.941094944.950.984
CADJPY10.67112.011154942.611.396
NKY23513.7725263.581135447.791.472
DJI31549.428931.51227863.931.283
DAX14123.6912607.591227662.30.92
UKX-649713339.21226049.180.724
HSI20123.852012.491196554.621.013
609833155892016801.177
4452108632858994747.472.331
5711-89552359511044401.145
7201-2451.22751.21034442.720.892
99841397773931025351.961.499
AAPL388.41144.161269776.980.764
AXP147.8770.71217158.681.092
BA789.72154.671176757.262.235
JNJ-97.67116.231105146.360.791
MCD227.3968.371156153.041.739
GOLD3501601201401197462.181.446
PLATINUM8402515923511066600.843
WTI3274901606401026159.81.223
CORN21737.547737.51054643.811.457
SOY BEANS-44925181237.51114843.241.135
  • 「取引回数」が「848 → 2749」で3倍強に
  • 「勝率」が 1% 上昇
  • 「RR比」が 0.007 低下
  • 「買い保有」「売り保有」にムラがでた

比較的、成績の変化が少なく「取引回数」を増やすことができています。優秀です。

「保有期間」のムラは、ピラミッティング分の決済を最初のエントリーのものと同じタイミングに設定しているために発生してものです。

テスト2 統計

破産の確率期待値/リスク収益の見込み
0.00%0.200551.16

破産の確率は、損失の許容=2%で算出しています。期待値と収益の見込みは以下の計算式で算出しています。

期待値=勝率×RR比1勝率\text{期待値} = \text{勝率} \times \text{RR比} - | 1 - \text{勝率}|
収益の見込み=期待値×取引回数\text{収益の見込み} = \text{期待値} \times \text{取引回数}
  • 「期待値」とすると「0.179 → 0.200」で上昇
  • 当然、「収益の見込み」も増加

普通は、「取引回数を増やすアプローチ」をすると、取引回数は増えるんだけど期待値は下がって、でも『取引回数が増えたので「収益の見込み」は大幅増だね』というのが大体のパターンです。

しかし、今回は「期待値の上昇」と「取引回数の増加」の両方を達成することができています。「収益の見込み」については、これまでで上から2番目くらいの結果です。優秀。

テスト3

テスト3と4は「決済にかかる日数」を調整してみたいと思います。

テスト3 設定

DC-enEMA-mEMA-lTime-exPyramiding
202535040-daysNone

まずは「80営業日 → 40営業日」として、「短期間にするとどのような影響があるのか」をテストしてみます。ちゃんと比較できるように「Pyramiding」の設定を「None」に。結果がたのしみです。

テスト3 結果

損益最大DD取引数勝数勝率RR比
Total145977052.78%1.15
USDJPY5.0336.1643148.441.123
EURJPY40.6822.8623658.060.997
GBPJPY129.7628.38633657.141.594
CHFJPY6.0224.96603151.671.001
CADJPY11.633.75622743.551.455
NKY9587.645678.06603151.671.354
DJI9373.775007.23614065.570.892
DAX-1254.046912.16432500.92
UKX-2736.44384.8623353.320.609
HSI22728.4910890.9553665.451.088
6098799192106602.442
445210422346582644.831.362
5711-7605220582848.281.015
7201-592.71043.7562341.071.086
998429513194572849.121.289
AAPL106.2231.66593762.711.15
AXP72.9815.28613455.741.544
BA207.3335.15573663.161.593
JNJ-30.8549.816027451.008
MCD67.828.03623556.451.33
GOLD11480024800584068.970.993
PLATINUM1486546995633047.621.218
WTI-101990196600633352.380.625
CORN-455067487.5622540.321.343
SOY BEANS-38187.572312.5622946.770.845
  • 取引回数: 848 → 1459(増加)
  • 勝率: 52.71% → 52.78%(ちょっとだけアップ)
  • RR比: 1.237 → 1.150(低下)

「勝率」はほぼ変わらずなのが不思議です。適当に一定期間のポジションにしているだけなのに、ほぼ変わらず。エッジはエントリーが重要で、イグジットはさほど重要じゃないということなんでしょうか。「取引回数の増加」と「RR比の低下」は、期間が「80営業日 → 40営業日」になっていることで説明がつきそうですね。

テスト3 統計

破産の確率期待値/リスク収益の見込み
0.00%0.135196.44

破産の確率は、損失の許容=2%で算出しています。期待値と収益の見込みは以下の計算式で算出しています。

期待値=勝率×RR比1勝率\text{期待値} = \text{勝率} \times \text{RR比} - | 1 - \text{勝率}|
収益の見込み=期待値×取引回数\text{収益の見込み} = \text{期待値} \times \text{取引回数}

結果、「期待値」は低下しましたが、「取引回数」の増加によって「収益の見込み」も伸びました。

テスト4

最後です。テスト3に引き続き「決済にかかる日数」を調整します。

テスト4 設定

DC-enEMA-mEMA-lTime-exPyramiding
2025350120-daysNone

今度は「80営業日 → 120営業日」として期間をのばしてみます。

テスト4 結果

損益最大DD取引数勝数勝率RR比
Total60434056.29%1.17
USDJPY8.7221.82271762.960.668
EURJPY-59.0784.592511440.716
GBPJPY118.7331.44261661.541.329
CHFJPY6.0736.612511441.396
CADJPY23.6621.852613501.39
NKY3220.2810689.41241354.170.98
DJI5607.987838.832517680.718
DAX5738.462402.35261661.541.116
UKX2078.51581.5261765.380.835
HSI19820.578754.55241666.671.04
609882223743751.489
445249871081241458.332.09
5711-1320525024937.51.491
7201-503.71106.72510401.109
998444523872231252.171.402
AAPL156.7937.112418751.407
AXP44.0823.72261661.540.978
BA201.266.3241458.331.814
JNJ12.0821.912412501.168
MCD66.9521.55261557.691.393
GOLD131890173902519761.182
PLATINUM-10915688452512480.994
WTI-79170149160261142.310.898
CORN-2367530637.52517321.295
SOY BEANS-52337.570562.52511440.678
  • 取引回数: 848 → 604
  • 勝率: 52.71% → 56.29%
  • RR比: 1.237 → 1.170

「取引回数」の減少はまるっと期間の変更で説明がつきそうな変化です。「勝率」と「RR比」も変化があるものの〝ほぼ変わらず〟な印象。テスト3の結果を踏まえると大きな驚きがありません(期間を変えても「勝率」「RR比」が大きく変わらないのはスゴイことなんです、本当は)。

それよりも気になるのは、決済期間を伸ばしたことで勝率が上がってしまったことです。なんか、「〝塩漬けトレーダー〟にポジティブな材料を与えてしまうのでは」と懸念を持ちました。

これは、あくまでも一定期間に限った戦略的な長期保有です。「なんか損してるし切りづらいから〝なんとなく〟長期保有する」のとは、まったく違います。「ダメな銘柄を長期保有する」ことほど(本当に!)無駄なことはありません。(ちょっと辛口になりましたが)誤解のないようにお願いします。

テスト4 統計

破産の確率期待値/リスク収益の見込み
0.00%0.221133.64

破産の確率は、損失の許容=2%で算出しています。期待値と収益の見込みは以下の計算式で算出しています。

期待値=勝率×RR比1勝率\text{期待値} = \text{勝率} \times \text{RR比} - | 1 - \text{勝率}|
収益の見込み=期待値×取引回数\text{収益の見込み} = \text{期待値} \times \text{取引回数}

結果、「期待値」は上昇しましたが「収益の見込み」が減少。「手法自体の悪化」ではなく、「取引回数の減少による悪化」であると考えます。(というか、結果がそう物語っています)

テスト結果の比較

テスト結果をまとめて、比較をしてみます。

取引回数勝率RR比破産の確率期待値収益の見込み
テスト184852.711.2400.000.179152.12
テスト2274953.771.2300.000.200551.16
テスト3145952.781.1500.000.135196.44
テスト460456.291.1700.000.221133.64
  • 全体的に、これまでの手法よりも「勝率」が高い
  • ピラミッティング導入(テスト2)で期待値が上昇(不思議)
  • 保有期間の調整(テスト3・4)で「収益の見込み」に大きな変化がなかった(すごい)

考察

今回は、一風変わった手法のバックテストでした。

「時間にもとづいた退出を用いる。80日経てば退出し、どんなストップも使わない。」

こんな決済で本当に勝てるのか・・・。筆者自身、疑問しかありませんでしが、やってみると本当に勝てました。見当はずれな資金管理をしなければ実践でも勝てそうです。ビックリ。

しかも、本に掲載されていたのが2006年ごろまでのテスト結果。今回は、期間を変更し、銘柄も変更して行ったものです(資金管理は含めず単利のテスト。取引回数、サンプルの〝質〟はともに十分)。それでも勝てていることが、また説得力を高めているように思います。

さて、今回のテストによって「決済よりもエントリーのエッジが重要であること」が示されたと思います(決済を軽視しているわけではありません)。

  • 仮に「『保有期間:80営業日』の優位性」で勝てている手法だとすると「保有期間」を変えることで成績の著しい悪化が生じるはず
  • 保有期間:80 → 40(テスト3)
    • 期待値:0.179 → 0.139
    • 取引回数:848 → 1459
    • 収益の見込み:152.12 → 196.44
  • 保有期間:80 → 120(テスト4)
    • 期待値:0.179 → 0.221
    • 取引回数:848 → 604
    • 収益の見込み:152.12 → 133.64
  • 著しい悪化はみられない
  • この手法において、重要なのは「エントリーの優位性」であると言えそう

テスト3は期待値の低下を取引回数でカバーし、テスト4については取引回数の減少を期待値でカバーしました。「もっともシンプルな決済(イグジット)」で良い結果がでていることから、「エントリーのエッジでの利益」であると考えています。

当然ですが、いくつかの注意点もあると思います。

  • エントリーのエッジとかけ離れた期間を「保有期間」とするのは有効でないと思われる
  • エントリーのエッジがなければ成り立たない
  • あまりにもシンプルで怖い(メンタルが必要なのでは)

念のため書いておくと、実践で使うにはあまりにも無防備なのでオススメしません。

こんな手法でもバックテストしてみると面白いですね。得るものがあります。TradingViewで、同じバックテストが簡単にできます。もし気になる方がいれば、お試しください。

Pineスクリプト

今回行ったバックテストに用いたストラテジーのコード(Pineスクリプト)を公開します。販売や二次配布 "以外" は自由にご利用いただいて差し支えありません。ご自由にお使いください!

Pineスクリプト

strategy("Strategy Turtle Time Exit Donchian Trend"
  ,default_qty_type=strategy.fixed
  ,default_qty_value=1
  ,pyramiding=4
  ,overlay=true)



src = close
len_dc_entry = input(20   ,minval=1 ,title="length of dc entry")
len_ema_m    = input(25   ,minval=1 ,title="length of middle ema")
len_ema_l    = input(350  ,minval=1 ,title="length of long ema")
MAX_N    = input(1    ,type=integer ,minval=1 ,maxval=4 ,title="maximun num of unit")
LO_len   = input(20   ,type=integer ,minval=1 ,title="pyramiding ATR length")
LO_N     = input(1    ,type=float   ,minval=0.5 ,title="pyramiding ATR*N")
Tm_len   = input(80   ,type=integer ,minval=1 ,title="timed exit length")
fromYear = input(2005 ,type=integer ,minval=1900 ,title="test start")
endYear  = input(2017 ,type=integer ,minval=1900 ,title="test end")

isWork   = timestamp(fromYear ,1 ,1 ,00 ,00) <= time and time < timestamp(endYear+1 ,1 ,1 ,00 ,00)

upper_en = highest(high ,len_dc_entry)[1]
lower_en = lowest(low ,len_dc_entry)[1]
ema_m    = ema(src ,len_ema_m)
ema_l    = ema(src ,len_ema_l)

atr_LO_ = ema(tr ,LO_len)
atr_LO  = atr_LO_*LO_N



countTradingDays     = na
countNonTradingDays  = na
countTradingDays    := strategy.position_size==0 ? 0 : countTradingDays[1] + 1
countNonTradingDays := strategy.position_size!=0 ? 0 : countNonTradingDays[1] + 1
entry1   = close
entry2   = close
entry3   = close
entry4   = close
entry1  := strategy.position_size==0 ? na : entry1[1]
entry2  := strategy.position_size==0 ? na : entry2[1]
entry3  := strategy.position_size==0 ? na : entry3[1]
entry4  := strategy.position_size==0 ? na : entry4[1]
lo2      = close
lo3      = close
lo4      = close
lo2     := strategy.position_size==0 ? na : lo2[1]
lo3     := strategy.position_size==0 ? na : lo3[1]
lo4     := strategy.position_size==0 ? na : lo4[1]



L_EntrySig = strategy.position_size==0 and high >= upper_en and ema_m >= ema_l
S_EntrySig = strategy.position_size==0 and low  <= lower_en and ema_m <= ema_l
lo_sig2    = strategy.position_size>0 ? lo2 < high : strategy.position_size<0 ? lo2 > low : na
lo_sig3    = strategy.position_size>0 ? lo3 < high : strategy.position_size<0 ? lo3 > low : na
lo_sig4    = strategy.position_size>0 ? lo4 < high : strategy.position_size<0 ? lo4 > low : na



if(strategy.position_size != 0)

    TimedSig = countTradingDays >= Tm_len
    strategy.close_all(when = TimedSig)

    if(TimedSig)
        entry1  := na
        entry2  := na
        entry3  := na
        entry4  := na
        lo2     := na
        lo3     := na
        lo4     := na



if(strategy.position_size > 0)

    if(lo_sig2 and MAX_N >= 2)
        lo2 := na
        strategy.entry("L-Entry2" ,strategy.long ,comment="L-Entry2")
    if(lo_sig3 and MAX_N >= 3)
        lo3 := na
        strategy.entry("L-Entry3" ,strategy.long ,comment="L-Entry3")
    if(lo_sig4 and MAX_N >= 4)
        lo4 := na
        strategy.entry("L-Entry4" ,strategy.long ,comment="L-Entry4")



if(strategy.position_size < 0)

    if(lo_sig2 and MAX_N >= 2)
        lo2 := na
        strategy.entry("S-Entry2" ,strategy.short ,comment="S-Entry2")
    if(lo_sig3 and MAX_N >= 3)
        lo3 := na
        strategy.entry("S-Entry3" ,strategy.short ,comment="S-Entry3")
    if(lo_sig4 and MAX_N >= 4)
        lo4 := na
        strategy.entry("S-Entry4" ,strategy.short ,comment="S-Entry4")



if((L_EntrySig or S_EntrySig) and isWork)
    countTradingDays := 1
    entry1           := close

    if(L_EntrySig)
        strategy.entry("L-Entry1" ,strategy.long ,comment="L-Entry1")
        lo2 := MAX_N >= 2 ? close + atr_LO     : na
        lo3 := MAX_N >= 3 ? close + atr_LO * 2 : na
        lo4 := MAX_N >= 4 ? close + atr_LO * 3 : na

    if(S_EntrySig)    
        strategy.entry("S-Entry1" ,strategy.short ,comment="S-Entry1")
        lo2  := MAX_N >= 2 ? close - atr_LO     : na
        lo3  := MAX_N >= 3 ? close - atr_LO * 2 : na
        lo4  := MAX_N >= 4 ? close - atr_LO * 3 : na


plot(strategy.position_size ,transp=0 ,title="保有ポジションの数")
plot(strategy.openprofit    ,transp=0 ,title="未決済の損益")
plot(strategy.netprofit     ,transp=0 ,title="決済済みの損益")
plot(strategy.closedtrades  ,transp=0 ,title="決済済み取引数")
plot(countTradingDays       ,transp=0 ,title="取引日数")
plot(countNonTradingDays    ,transp=0 ,title="ノンポジ日数")
plot(entry1    ,title="entry1"    ,color=blue ,transp=0 ,style=linebr)
plot(lo2       ,title="lo2"       ,color=red  ,transp=0 ,style=linebr)
plot(lo3       ,title="lo3"       ,color=red  ,transp=0 ,style=linebr)
plot(lo4       ,title="lo4"       ,color=red  ,transp=0 ,style=linebr)
plot(atr_LO    ,transp=0 ,title="ATR_LO")



p1 = plot(ema_m ,color=#303F9F ,title="ema_m" ,style=line ,linewidth=1, transp=0)
p2 = plot(ema_l ,color=#4CAF50 ,title="ema_l" ,style=line ,linewidth=1, transp=0)
fill(p1 ,p2 ,color=#2196F3 ,title="fill" ,transp=80)

p3 = plot(lower_en ,color=gray ,title="lower_entry" ,style=linebr ,linewidth=1 ,transp=40)
p4 = plot(upper_en ,color=gray ,title="upper_entry" ,style=linebr ,linewidth=1 ,transp=40)
fill(p3 ,p4 ,color=gray ,title="fill" ,transp=90)

TradingViewでも公開しています!

TradingView で ストラテジー「Donchian Trend System」を見つける

TradingView のインジケーターの検索で「Time Exit」と検索するとでてきます。上記のコードと同じストラテジーを使用することができます。

バックテストならTradingView

TradingViewのテストは大変便利で、

  • かなり自由の効くバックテストを
  • 短時間で簡単に、
  • 価格データを用意することなく
  • 豊富な銘柄と足種を対象に

行うことができます。

一方で、その簡便さと引き換えに「TradingViewではできないバックテスト」も多くあります。

たとえば「分散投資」や「資金管理」があげられますが、これらは投資において非常に重要な要素でもあり、これらを含めたバックテストをするならリアルさが不可欠です。こういったバックテストをするためには、やはりPythonなどのプログラミング言語で自作していくしかないと考えています。

とはいえ、TradingViewが便利であることは間違いなく、最近では、手法の検証はTradingViewで行い、良い手法が見つかったら更に詳細なテストをPythonで行うようにしています。できるものはTradingViewでサクサクやってしまいます。

わりと、30分くらいあればインジケーターを作成することもできます。便利。

yuya takahashi

タカハシ / 11年目の兼業投資家

投資やプログラミング、動画コンテンツの撮影・制作・編集などが得意。更新のお知らせは、LINE、メールで行っています。

このブログと筆者についてご質問はこちら

  • 記事をシェア
© Investment Tech Hack 2023.