株価の取引ボットを作成して大儲け(したかった)軌跡
はじめに
表題通りです。素人が見よう見まねで、もがいている様が見たい方はご覧ください。
アプローチ
大体、取引ボットには以下のアプローチで行うので整理を行なった
言語
Python
豊富なLibraryを使ってゴリゴリ実装していくアプローチ、HFTなど行うわけではないので、今回はパス
MT5, MT4
MetaTraderというツールで使用する言語を使ったアプローチ。ただこれもHFTやFXで使われるツールなので、今回はパス
Pine Script
TradingViewというサービスで使用される言語を使ったアプローチ。バックテストなどが容易で敷居が低い。今回はこちらを使って色々試してみる
取引手法
HFT
High Frequency Trading と呼ばれる高速取引手法のこと、高速で取引を行うことで売買時のアービトラージを行うことが基本手法となる。マイケル・ルイスのフラッシュ・ボーイズなどが参考になると思います。
現在は仮想通貨の取引所などで戦える場所はあるらしいが、ガチ勢ではないので今回はパス
ファンダメンタル分析
基本的には将来的に上がるであろう個別株を企業情報などから分析し、バイアンドホールドする戦略。
最近は生成AIなどを使って分析を行うことが流行っているらしい。ちょっとだけやったが、文章には起こさない。(有意な結果は得られなかったので)
テクニカル分析
移動平均線などの計算で算出できる手法を利用して短中長期での取引を行い利益を得るアプローチ。
今回はこちらの手法を使う
まず、年初にS&P500を購入し、そのままバイアンドホールドしている戦略を比較対象とする。
コードは以下
//@version=5
strategy("Simple Buy and Hold Strategy", overlay=true)
// 入力パラメータ
initialCapital = input.float(10000, "Initial Capital", minval=1000)
entryDate = input.time(timestamp("2024-01-01"), "Entry Date")
var float quantity = 0.0
var bool inPosition = false
if (not inPosition and time >= entryDate)
quantity := initialCapital / close
strategy.entry("Buy", strategy.long, qty=quantity)
inPosition := true
// プロット
plotshape(inPosition and not inPosition[1], title="Buy", text="Buy", location=location.belowbar, color=color.green, style=shape.triangleup, size=size.small)
// パフォーマンス表示
if (barstate.islast)
currentValue = quantity * close
profitLoss = currentValue - initialCapital
percentReturn = (currentValue / initialCapital - 1) * 100
label.new(bar_index, high, text="Current Value: $" + str.tostring(currentValue, "#.##") + "\n" + "Profit/Loss: $" + str.tostring(profitLoss, "#.##") + "\n" + "Return: " + str.tostring(percentReturn, "#.##") + "%",style=label.style_label_down,color=color.new(color.blue, 0),textcolor=color.white)
Trading View の Strategy Tester から結果を確認できる。
今回は売却もしてないのでProfit部分のみとなるが、+16.97%の結果となっている
次は単純移動平均からクロスしている部分を検知し、短期の移動平均線が長期の移動平均線を上回ったときに買い。逆の場合は逆に売りを行うロジック
/@version=5
strategy("Simple Moving Average Crossover Bot", overlay=true)
// 入力パラメータ
fastLength = input(10, "Fast SMA Length")
slowLength = input(20, "Slow SMA Length")
// 移動平均の計算
fastSMA = ta.sma(close, fastLength)
slowSMA = ta.sma(close, slowLength)
// クロスオーバーの検出
buySignal = ta.crossover(fastSMA, slowSMA)
sellSignal = ta.crossunder(fastSMA, slowSMA)
// ポジションの取得
if (buySignal)
strategy.entry("Buy", strategy.long)
if (sellSignal)
strategy.close("Buy")
// プロット
plot(fastSMA, color=color.blue, title="Fast SMA")
plot(slowSMA, color=color.red, title="Slow SMA")
Trading View の Strategy Tester から結果を確認できる。
意外と結果が良いぞ。。?
割合で比較できなかったが、バイアンドホールドより2倍(+30%程度)の成績を上げることができた。本当か。。?
はい。ネタバラシですが、超長期でこのロジックが使えるかというと5年このボットを使用した場合の結果を見ると。。?
そうなんです。いいところでの成績は良いが、超長期や短期のトレードになるとそんなにパフォーマンスが出ないことがわかりました。
本来であれば、この5倍程度の金額を稼いでないと、このモデルの成績は良くないのです。
他にもいくつか作ってみたのですが、Buy/Sell回数が極端に低かったり(基本ずっと移動平均線の上に株価がいることが多いのでインするタイミングがない)して全然ダメでした。。
まあ、こんな単純な戦略でも通用するフェーズだったことは事実なので、パフォーマンスが悪くなるまでこのボットを使った戦略を実施するのはありなのかも知れません。(大体、おんなじことする人が出てきてメタが回るので通用しなくなる)
個人的にはトレンドフォロー戦略の再現性は高いと思っているので、トレンド転換のタイミングを測るボットを作れればいいなーと考えていますが、できるのはいつになることやら。。
ただ、徐々に知識はついてきているので、どこかで活かせればなー、と思います!
なんにもわからない人でもわかるような形にしたので、これを契機に興味を持ってくれる人がいれば嬉しいです!
以上、ご覧いただきありがとうございました。