ASI指标是一种技术分析工具,全名为“Accumulation Swing Index”,即“积累横摆指标”,由J. Welles Wilder Jr.于1976年提出,其主要用途是用来判断趋势的强度和方向。ASI综合了价格变化和成交量关系的变化,通过体现成交量的分布特性,有效地消除了成交量的噪音干扰。
下面我们将基于easytrader库,编写一个ASI指标的交易策略。首先,导入easytrader库和Pandas库。
import easytrader as etimport pandas as pd
其次,定义一个函数来计算ASI指标。ASI指标的计算方法比较复杂,具体计算方法如下:
其中,AF增量通常为0.01,但当某一条件满足时,AF增量可以逐渐增大,以反映市场的真实情况。
def calculate_asi(df, af=0.01): asi = [df.Close[0]] si = [0] af_list = [] for i in range(1, len(df)): curr_high, curr_low, prev_close = df.High[i], df.Low[i], df.Close[i-1] curr_close, prev_asi, prev_si = df.Close[i], asi[-1], si[-1] a = curr_high - prev_close b = curr_low - prev_close c = curr_high - curr_low if a > b and a > 0: today_si = a elif b > a and b > 0: today_si = b else: today_si = c if today_si != prev_si: af_list.append(af) else: af_list.append(0) if len(af_list) > 1 and af_list[-1] != af_list[-2]: af_list[-1] = min(af_list[-1], af_list[-2]+af) af = af_list[-1] si.append(today_si) asi.append(prev_asi + af*today_si) return asi
再次,获取股票数据并计算ASI指标。这里我们以“万科A”(000002.SZ)为例。
user = et.use('yh_client')user.prepare('config.json')df = user.get_k_data('000002', start='2021-01-01', end='2022-12-31', index=False, ktype='D')df['ASI'] = calculate_asi(df)
最后,定义交易逻辑。当ASI指标值上穿MA5时,我们认为市场处于上涨趋势,此时应该买入;当ASI指标值下穿MA5时,我们认为市场处于下跌趋势,此时应该卖出。
balance = user.balance[0]['asset_balance']for i in range(1, len(df)): ma5 = df.Close[i-4:i+1].mean() if df.ASI[i-1] < ma5 and df.ASI[i] >= ma5: user.buy('000002', price=df.Close[i], amount=100) balance = user.balance[0]['asset_balance'] elif df.ASI[i-1] > ma5 and df.ASI[i] <= ma5: user.sell('000002', price=df.Close[i], amount=100) balance = user.balance[0]['asset_balance']
运行上述代码即可实现基于ASI指标的交易策略。需要注意的是,该策略仅作为参考,并不能保证盈利。
联系客服