分类
掌握正確投資心法

BBands与RSI复合指标组合

©2022 Baidu 使用百度前必读 | 百科协议 | 隐私政策 | 百度百科合作平台 | 京ICP证030173号

相对强弱指数

RSI是在1978年6月由美国机械工程师 威列斯·威尔德 ( BBands与RSI复合指标组合 英语 : Welles Wilder JR. ) ( Welles Wilder JR. )提出的技术分析方法,发表在美国《Commodities》杂志中(现为《Futures》杂志),并收录于同年推出的《New Concepts in Technical Trading Systems》书中。相比起其他分析工具,RSI是其中一种较容易向大众传译的计量工具,故甫推出便大受欢迎。

“相对强弱”亦可用作比较某证券与整个市场或整个产业的强度,例如,股票甲在某天上升百分之二,同日市场仅上升百分之一,这种比较通常被称为“相对强弱比较”( Relative Strength comparative ,简称 RSP )。一般情况下,RSP之量度方法及用途与RSI毫无关连。

  • 设每天向上变动为U,向下变动为D。
  • U及D的平均值皆需用上“指数移动平均法”(在n日内)。所谓“相对强度”BBands与RSI复合指标组合 ,即U平均值及D平均值的比例:
  1. RS:相对强度(Relative Strength);
  2. RSI: 相对强弱指数(Relative Strength Index);
  3. E M A ( U , n ) EMA_\end>> :U在n日内的指数平均值;
  4. E M A ( D , n ) EMA_\end>> :D在n日内的指数平均值。
  • 在指数移动平均理论中,U及D的平均值应由过去无限个数据计算而成。为了增加指数的可靠性,我们必须找寻足够旧数据,或直接从价格存在的首日起,开始计算出n日内“简单移动平均值”:
  1. α = 1 n >>
  2. 初始值 A v g U y e s t e r d a y = A v g U i n i t i a l =AvgU_>
  3. D平均值的计算方法亦相若

计算结果的意义

根据 威尔德 ( 英语 : J. Welles BBands与RSI复合指标组合 Wilder ) 的测量结果,当n=14时,指数最具代表性。他指出当某证券的RSI升至70时,代表该证券已被超买(Overbought),投资者应考虑出售该证券。相反,当证券RSI跌至30时,代表证券被超卖(Oversold),投资者应购入该证券。

卡特勒相对强弱指数

卡特勒相对强弱指数(Culter's RSI)摒弃了繁琐的指数移动平均法,改用简单移动平均法来计算出U及D的平均值,而两种方法所计算出的结果差别并不显著,因此为较多人所采用。

相对强弱平均线

本人编辑

©2022 Baidu 使用百度前必读 | 百科协议 | 隐私政策 | 百度百科合作平台 | 京ICP证030173号

R: Error in xts - order.by

After BBands与RSI复合指标组合 some research I realize that the problem is with the ordering, and it seems to lack ordering as is required for the underlying zoo package.

Is there an elegant way to solve this issue?! Thanks in advance

Answers

I wasted hours BBands与RSI复合指标组合 running into this error. Regardless of whether or not I had the exact same problem, I'll show how I solved for this error message in case it saves you the pain I had.

I imported an Excel or CSV file (tried both) through several importing functions, then tried to convert my data (as either a data.frame or .zoo object) into an xts object and kept getting errors, this one BBands与RSI复合指标组合 included.

I tried creating a vector of dates seperately to pass in as the order.BBands与RSI复合指标组合 by parameter. I tried making sure the date vector the rows of the data.frame were the same. Sometimes it worked and sometimes it didn't, for reasons I can't explain. Even when it did work, R had "coerced" all my numeric data into character data. (Causing me endless problems, later. Watch for coercion, BBands与RSI复合指标组合 I learned.)

These errors kept happening until:

For xts conversion I used the date column from the imported Excel sheet as the order.by parameter with an as.Date() modifier, AND BBands与RSI复合指标组合 I *dropped the date column during the conversion to xts.*

Here's the working code:

Note my date column was the first column, so the xl_sheet[-1] removed the first column.

backtrader股票技术指标自定义与量化回测

import backtrader as bt
import pandas as pd
import numpy as np
import tushare as ts
def get_data(code,start='2010-01-01',end='2020-08-31'):
df=ts.get_k_data(code,autype='qfq',start=start,end=end)
df.index=pd.to_datetime(df.date)
df['BBands与RSI复合指标组合 openinterest']=0
df=df'open','high','low','close','volume','openinterest'
return df

def __init__(self):
bt.ind.MACD(self.data)
bt.ind.MACDHisto(self.data)
bt.ind.RSI(self.data,period=14)
bt.ind.BBands(self.data)

def main(data,strategy,pf=False):
cerebro = bt.Cerebro()
feed = bt.feeds.PandasData(dataname=data)
cerebro.adddata(feed)
#加载策略
cerebro.addstrategy(strategy)
# 设置初始资本为10,000
startcash = 100000
cerebro.broker.setcash(startcash)
# 设置交易手续费为 0.BBands与RSI复合指标组合 1%
cerebro.broker.setcommission(commission=0.001)
cerebro.run()
#获取回测结束后的总资金
portvalue = cerebro.broker.getvalue()
pnl = portvalue - startcash
if pf:
print(f'总资金: < round(portvalue,2) >')
print(f'净收益: < round(pnl,2) >')
%matplotlib inline
cerebro.plot()

class TradeStrategy(bt.Strategy):
params=(('p1',12),('p2',26),('p3',9),)
def __init__(self):
self.order = None
#获取MACD柱
self.macdhist = bt.ind.MACDHisto(self.data,
period_me1=self.p.p1,
period_me2=self.p.p2,
period_signal=self.p.p3)
def next(self):
if not self.position:
# 得到当前的账户价值
total_value = self.broker.getvalue()
#1手=100股,满仓买入
ss=int((total_value/100)/self.datas[0].close[0])*100
#当MACD柱大于0(红柱)且无持仓时满仓买入
if self.macdhist > 0:
self.order=self.buy(size=ss)
else: BBands与RSI复合指标组合
#当MACD柱小于0(绿柱)且持仓时全部清仓
if self.macdhist < 0:
self.close()

#期初资金:100000
#期末资金: 225440.47
#净收益: 125440.47

03 自定义指标

lines = ('mid','top','bot',)
params = (('maperiod',20),
('period',3),
('highRate',1.2),
('lowRate',0.85),)
#与价格在同一张图 BBands与RSI复合指标组合
plotinfo = dict(subplot=False)

def __init__(self):
ema = bt.ind.EMA(self.data, period=self.p.maperiod)
#计算上中下轨线
self.l.mid=bt.ind.EMA(ema,period=self.p.period)
self.l.top=bt.ind.EMA(self.mid*self.p.highRate,\
period=self.p.period)
self.l.bot=bt.ind.EMA(self.mid*self.p.lowRate,\
period=self.p.period)
super(TrendBand, self).__init__()

class TestStrategy2(bt.Strategy):
def __init__(self):
TrendBand(self.data)

class MyStrategy(bt.Strategy):
params=(('period',20),)
def __init__(self):
self.BBands与RSI复合指标组合 order = None
self.mid = TrendBand(self.data).mid
self.top = TrendBand(self.data).top
self.bot = TrendBand(self.data).bot
#设置买入信号
self.buy_sig=bt.And(\
self.data.BBands与RSI复合指标组合 close>self.mid,\
self.data.volume==bt.ind.Highest(\
self.data.volume,period=self.p.period))
#卖出信号
self.sell_sig=self.data.close>self.top
def next(self):
if not self.position:
# 得到当前的账户价值
total_value = self.broker.getvalue()
#1手=100股,满仓买入
ss=int((total_value/100)/self.datas[0].close[0])*100
if self.buy_sig:
self.order=self.buy(size=ss)
else:
if self.sell_sig:
self.close()

#期初资金:100000.00
#期末资金: 398949.39
#净收益: 298949.39

04 结语

本文主要介绍了backtrader回测框架中indicators的调用、自定义指标的编写以及历史回测。其中自定义指标主要是示例作用,不构成任何投资建议。历史回测中仅以中国平安个股为例,具有一定的局限性,感兴趣的读者可以参考组合回测那篇推文,对全市场股票进行组合回测以进一步判断自定义指标的实用性。最后再强调一句,学习没有捷径,要想全面而深入地学习backtrader回测框架,最好的方法是研读其官方文档。公众号后台回复“backtrader”可获取《backtrader入门指南》的中文文档