1995年,图莎尔·钱德(Tushar Chande)发明了阿隆指标(Aroon),目前还是一个比较冷门的指标。
它通过计算自价格达到近期最高值和最低值以来所经过的期间数,可以帮助预测价格趋势到区域,或趋势区域到趋势的变化。
该指标由三部分组成:
其中:N=确定的时间段,HH=在此期间出现最高价后的天数,LL=在此期间出现最低价后的天数。
1.阿隆向上(Aroon-Up): [(N – HH)/ N]×100% ] ;
2.阿隆向下(Aroon-Down): [(N – LL)/ N]×100% ] ;
3.阿隆震荡线(Aroon Oscillator):阿隆Up – 阿隆Down 。
观察三种状态来分析Aroon指标:
1.Up线:达到100时,表示市场处于多头强势,跌破50表示向上的趋势正在失去动力,达到0时,表示多头处于极弱势;
Down线:达到100时,市场正处于空头强势,跌破50时表示向下的趋势正在失去动力,达到0时,表示空头处于极弱势;
两条线如果同处于底部,股票则处于盘整阶段,无趋势。
2.两条线平行运动时,表明市场原有趋势仍在继续,直到由极值水平或交叉穿行而改变市场方向为止。
3.当下行线上穿上行线时,表明原有趋势逐渐减弱,预计趋势将开始反转,反之亦然。
阿隆指标可以说是一个跟踪趋势的指标,如果把它用来择时会有什么效果呢?
def aroonIndex(account,timeLength=20):
#构建指数阿隆指标
indexSeries = pd.Series(account.get_symbol_history(‘benchmark’, timeLength)[‘closeIndex’])
indexAronUp = (nlargest(1,range(len(indexSeries)),key=indexSeries.get)[0]+1)*100/timeLength
indexAronDown = (nsmallest(1,range(len(indexSeries)),key=indexSeries.get)[0]+1)*100/timeLength
indexOsc = indexAronUp – indexAronDown
return indexOsc
当indexOsc 大于 0时,可以考虑开仓
start = ‘-08-01’ # 回测起始时间
end = ‘-08-31’ # 回测结束时间
benchmark = ‘HS300’ # 策略参考标准
universe = set_universe(‘HS300’) # 证券池,支持股票和基金
capital_base = 100000 # 起始资金
freq = ‘d’ # 策略类型,’d’表示日间策略使用日线回测,’m’表示日内策略使用分钟线回测
refresh_rate = 10 # 调仓频率,表示执行handle_data的时间间隔,若freq = ‘d’时间间隔的单位为交易日,若freq = ‘m’时间间隔为分钟
def initialize(account):# 初始化虚拟账户状态
pass
def handle_data(account): # 每个交易日的买入卖出指令
eq_AroonUp = aroonUp(account,20)
eq_AroonDown = aroonDown(account,20)
index_osc = aroonIndex(account,20)
buyList = []
for stk in account.valid_secpos:
order_to(stk, 0)
if index_osc > 0:
for stk in account.universe:
if eq_AroonUp[stk] – eq_AroonDown[stk] > 50:
buyList.append(stk)
for stk in buyList[:]:
if stk not in account.universe or account.referencePrice[stk] == 0 or np.isnan(account.referencePrice[stk]):
buyList.remove(stk)
for stk in buyList:
order(stk, account.referencePortfolioValue/account.referencePrice[stk]/len(buyList))
如果让indexOsc > 50呢:
start = ‘-08-01’ # 回测起始时间
end = ‘-08-31’ # 回测结束时间
benchmark = ‘HS300’ # 策略参考标准
universe = set_universe(‘HS300’) # 证券池,支持股票和基金
capital_base = 100000 # 起始资金
freq = ‘d’ # 策略类型,’d’表示日间策略使用日线回测,’m’表示日内策略使用分钟线回测
refresh_rate = 10 # 调仓频率,表示执行handle_data的时间间隔,若freq = ‘d’时间间隔的单位为交易日,若freq = ‘m’时间间隔为分钟
def initialize(account):# 初始化虚拟账户状态
pass
def handle_data(account): # 每个交易日的买入卖出指令
eq_AroonUp = aroonUp(account,20)
eq_AroonDown = aroonDown(account,20)
index_osc = aroonIndex(account,20)
buyList = []
for stk in account.valid_secpos:
order_to(stk, 0)
if index_osc > 50:
for stk in account.universe:
if eq_AroonUp[stk] – eq_AroonDown[stk] > 50:
buyList.append(stk)
for stk in buyList[:]:
if stk not in account.universe or account.referencePrice[stk] == 0 or np.isnan(account.referencePrice[stk]):
buyList.remove(stk)
for stk in buyList:
order(stk, account.referencePortfolioValue/account.referencePrice[stk]/len(buyList))