結論
5種類の投資手法を試したが、ユニクロの株価にはDonchian Channels戦略が有効であり、2023/1/1から2023/8/10まで8ヵ月トレードした結果は¥696,666円のプラスでした。
以下、5種類の投資手法
①MACD
②BBAND
③RSI
④Donchian Channels
⑤Momentum
では、以下詳細をご覧ください。
表題の通りです。
Google Colaboratoryでコピペで動作しますので、お試しください。
以下、コードです。
!pip install stock-backtest
※すべてのコードは、 ticker:9983.T という箇所を任意の銘柄に変更することでお好きな銘柄のバックテストが出来ます。
例:アップル社(apple)の場合は、 ticker:AAPL と入力しればOKです。
ユニクロ(ファーストリテイリング TYO:9983)でバックテストをしていきます。
まずは、①MACDです。
以下、マネックス証券より引用
MACD(通称マックディー)は、移動平均の発展版で、更に売買シグナルにおいて精度を高くした、トレンド分析の中でも人気のある指標の一つです。「移動平均収束拡散」又は「移動平均収束乖離」などとも呼ばれています。
トレンド形成時に威力を発揮するため、逆にボックス相場に弱いのが特徴です。
主にMACDとMACDシグナルという2本のラインの交差を売買のタイミングとして用いられることが多く、初心者の方でもシグナルの発見が容易です。
結果は△¥1,246,333円のマイナスでした。

#@title バックテスト MACD
from stock_backtest import Backtest
from rich.pretty import pprint
import datetime
number = "2023-1-1" #@param {type:"string"}
start = number
end = datetime.date.today()
ticker = "9983.T" #@param [""] {allow-input: true}
shares = 100 #@param {type:"number"}
class MyBacktest(Backtest):
def strategy(self):
macd, signal = self.macd(fast_period=12, slow_period=26, signal_period=9)
self.sell_exit = self.buy_entry = (macd > signal) & (
macd.shift() <= signal.shift()
)
self.buy_exit = self.sell_entry = (macd < signal) & (
macd.shift() >= signal.shift()
)
bt = MyBacktest(
ticker, # ticker
shares=shares, # number of shares (default=1)
start=start, # start date (default="")
end=end, # end date (default="")
data_dir="data", # data directory (default=.)
)
pprint(bt.run())
次です。
②BBAND。ボリンジャーバンドです。
以下、マネックス証券より引用
ボリンジャーバンドは、移動平均線と標準偏差で構成されており、移動平均を表す線とその上下に値動きの幅を示す線を加えた指標で、「価格の大半がこの帯(バンド)の中に収まる」という統計学を応用したテクニカル指標のひとつです。
特徴は、収束と拡散を繰り返していることで、この動きにあわせて「順張り」「逆張り」それぞれの投資に利用することができます。
結果は¥684,000円のプラスでした。

#@title バックテスト BBands
from stock_backtest import Backtest
from rich.pretty import pprint
import datetime
number = "2023-1-1" #@param {type:"string"}
start = number
end = datetime.date.today()
ticker = "9983.T" #@param [""] {allow-input: true}
shares = 100 #@param {type:"number"}
class MyBacktest(Backtest):
def strategy(self):
upper, mid, lower = self.bbands(period=20, band=2)
self.sell_exit = self.buy_entry = (upper > self.df.C) & (
upper.shift() <= self.df.C.shift()
)
self.buy_exit = self.sell_entry = (lower < self.df.C) & (
lower.shift() >= self.df.C.shift()
)
bt = MyBacktest(
ticker, # ticker
shares=shares, # number of shares (default=1)
start=start, # start date (default="")
end=end, # end date (default="")
data_dir="data", # data directory (default=.)
)
pprint(bt.run())
次です。
③RSI。
以下、マネックス証券より引用
RSI(相対力指数)は、オシレーター系のテクニカル指標の代表格で、人気ある指標の一つです。パラボリック・DMI・ピボットなど数多くのテクニカル指標を生み出したミスターテクニカル分析とも言えるJ.W.ワイルダー(米国)が考案し、現在の相場の相対的な強弱(又は過熱感)を表す指標です。特徴としてボックス相場が続いているときの的中率は高いものの、上下に強いトレンドが出ると、売買シグナルが出ていたとしても、トレンドの勢いが止まらずに、結局ダマシに終わることがあります。
結果は¥52,666円のプラスでした。

#@title バックテスト RSI
from stock_backtest import Backtest
from rich.pretty import pprint
import datetime
number = "2023-1-1" #@param {type:"string"}
start = number
end = datetime.date.today()
ticker = "9983.T" #@param [""] {allow-input: true}
shares = 100 #@param {type:"number"}
class MyBacktest(Backtest):
def strategy(self):
rsi = self.rsi(period=14)
ema = self.ema(period=20)
atr = self.atr(period=20)
lower = ema - atr
upper = ema + atr
self.buy_entry = (rsi < 30) & (self.df.C < lower)
self.sell_entry = (rsi > 70) & (self.df.C > upper)
self.sell_exit = ema > self.df.C
self.buy_exit = ema < self.df.C
bt = MyBacktest(
ticker, # ticker
shares=shares, # number of shares (default=1)
start=start, # start date (default="")
end=end, # end date (default="")
data_dir="data", # data directory (default=.)
)
pprint(bt.run())
次です。
④Donchian Channels。
以下、トレーディングビューより引用
ドンチャンチャネル (DC)
ドンチャン・チャネル(DC)は、市場のボラティリティを測定するテクニカル分析に使用されます。 ボリンジャーバンドと同様、バンド状のインジケータです。 ドンチャン・チャネルは、市場のボラティリティを測定するだけでなく、主に価格がアッパーバンドまたはローワーバンドに達した場合のブレイクまたは買われすぎないしは売られ過ぎの状態を判別するために使用されます。 これらの発生は取引のシグナルの可能性を示しています。
結果は¥696,666円のプラスでした。

#@title バックテスト Donchian Channels
from stock_backtest import Backtest
from rich.pretty import pprint
import datetime
number = "2023-1-1" #@param {type:"string"}
start = number
end = datetime.date.today()
ticker = "9983.T" #@param [""] {allow-input: true}
shares = 100 #@param {type:"number"}
class MyBacktest(Backtest):
def strategy(self):
high = self.df.H.rolling(20).max()
low = self.df.L.rolling(20).min()
self.sell_exit = self.buy_entry = (high > self.df.C) & (
high.shift() <= self.df.C
)
self.buy_exit = self.sell_entry = (low < self.df.C) & (
low.shift() >= self.df.C
)
bt = MyBacktest(
ticker, # ticker
shares=shares, # number of shares (default=1)
start=start, # start date (default="")
end=end, # end date (default="")
data_dir="data", # data directory (default=.)
)
pprint(bt.run())
次です。
⑤Momentum。
以下、IG証券より引用
モメンタムトレードとは
モメンタムトレードとは、トレンドの勢いを見ながら取引することです。トレンドの勢いが強ければ強いほど、そのトレンドが今後も続くと予想して順張り戦略をとります。
例えば、アップル(AAPL)が高値を更新すると、多くのトレーダーや投資家の関心を集めます。高値を更新するということは、上昇トレンドに勢いがあること意味しているため、アップル株に注目しているトレーダーや投資家は買いを入れます。買いが買いを呼び、さらに株価が上昇することで、さらに多くのトレーダーや投資家の注目が集まり『ハーディング(トレーダーが多数派に従う傾向)』の状況となります。このハーディングが上昇トレンドの勢いを強めるというわけです。
結果は¥76,000円のプラスでした。
