好啦!之前介绍过了如何用Backtesting套件来实做均线的策略,
前面也介绍过了如何安装Ta-lib套件,
相信大家一定很想知道如果使用Ta-lib内的套件要如何写策略,
今天就来和大家介绍RSI低买高卖策略罗!
def rsi_buy(s1,thres):
return s1[-1] < thres #收盘 RSI 值低於买进门槛,rsi_buy为 True
def rsi_sell(s1,thres):
return s1[-1] > thres #收盘 RSI 值高於卖出门槛,rsi_sell为 True
class RSI_(Strategy):
# 定义参数
n1 = 14 # rsi 要算几天的 RSI 值
n2 = 30 # rsi 低於多少买进
n3 = 50 # rsi 高於多少卖出
# 先算好技术指标价格
def init(self):
self.rsi = self.I(talib.RSI, self.data.Close, self.n1)
# 一次推进一根 K 棒
def next(self):
# 收盘 rsi低於 30 ,隔日开盘价买进
if rsi_buy(self.rsi, self.n2) and not (self.position.is_long):
self.buy()
# 收盘 rsi高於 50 ,隔日开盘价卖出
if rsi_sell(self.rsi, self.n3) and not (self.position.is_short):
self.position.close()
策略搞定之後就要来用Backtest回测罗!
#输入回测条件:df(台积电的资料)跑回测,策略是 RSI_,起始资金 10000元,交易成本 0.2%。
bt = Backtest(df, RSI_, cash=10000, commission=0.002)
#把回测完得到的数据存到stats
stats = bt.run()
#画图(如果不加 superimpose = False,会看到他把每五根日 K 棒合成一根周 K 棒 )
bt.plot(superimpose = False)
stats
资料:台积电2020-2021/9/22
策略:「RSI低於30做多,高於50出场」
绩效仅16%,虽然Sharpe Ratio高达2.2,但真的太早出场,超大鱼尾都没吃到!
Out:
---------------------------------------------
Start 2020-01-02 00:00:00
End 2021-09-22 00:00:00
Duration 629 days 00:00:00
Exposure [%] 7.790143
Equity Final [$] 11590.450906
Equity Peak [$] 11590.450906
Return [%] 15.904509
Buy & Hold Return [%] 72.861357
Max. Drawdown [%] -14.482759
Avg. Drawdown [%] -5.409828
Max. Drawdown Duration 431 days 00:00:00
Avg. Drawdown Duration 146 days 00:00:00
# Trades 3
Win Rate [%] 100.0
Best Trade [%] 7.045936
Worst Trade [%] 2.568966
Avg. Trade [%] 4.993597
Max. Trade Duration 34 days 00:00:00
Avg. Trade Duration 17 days 00:00:00
Expectancy [%] NaN
SQN 3.672751
Sharpe Ratio 2.208007
Sortino Ratio NaN
Calmar Ratio 0.344796
_strategy RSI_
接着我们用下面这行code就能把图画出来罗!
bt.plot(superimpose = False)
#这边会将rsi买进门槛和卖出门槛的参数从10~90去跑跑看哪组参数搭配能让最後帐户总净值最高
#至於constraint那一行,是指rsi买进门槛要低於卖出门槛,这样比较合理,也可以加速最佳化。
stats = bt.optimize(n2=range(10, 90, 1),
n3=range(10, 90, 1),
maximize='Equity Final [$]',
constraint=lambda p: p.n2 < p.n3)
stats
Out:
---------------------------------------------
Start 2020-01-02 00:00:00
End 2021-09-22 00:00:00
Duration 629 days 00:00:00
Exposure [%] 39.26868
Equity Final [$] 20354.235241
Equity Peak [$] 21917.273783
Return [%] 103.542352
Buy & Hold Return [%] 72.861357
Max. Drawdown [%] -25.970149
Avg. Drawdown [%] -4.714841
Max. Drawdown Duration 143 days 00:00:00
Avg. Drawdown Duration 29 days 00:00:00
# Trades 2
Win Rate [%] 100.0
Best Trade [%] 44.419077
Worst Trade [%] 36.99977
Avg. Trade [%] 40.709424
Max. Trade Duration 175 days 00:00:00
Avg. Trade Duration 124 days 00:00:00
Expectancy [%] NaN
SQN 11.32503
Sharpe Ratio 7.75973
Sortino Ratio NaN
Calmar Ratio 1.567547
_strategy RSI_(n2=40,n3=86)
#画图(如果不加 superimpose = False,会看到他把每五根日 K 棒合成一根周 K 棒 )
bt.plot(superimpose = False)
**不过这边还是要提醒读者:像这样过度最佳化後的参数并不适合实际拿来使用,
过去绩效不代表更不能保证未来走势,
所以大家还是多想想交易策略的逻辑,开发实用的策略比较实在喔!
>>: 【Day 22】Hook 05:useReducer
对thunkable的data sources还不是很清楚, 建立这个app练习并测试这个物件的特性...
前言 从这篇文章开始,我们要进入到 Obsidian 的操作了。在正式开始教学之前,我先快速简介 O...
终於最後一天,照惯例大家都在这里写後记吧~ 三年前第一次知道铁人赛,就是以社群身份去参加了颁奖典礼X...
在开始学习机器学习之前,我们得先准备好环境,我们使用python来当我们的程序语言,稍微介绍一下py...
因为心情太低落了,掉着泪看教学,我真的很认真的在学,但为什麽要被批评得一无是处。 也许在学技能的同时...