什么是ATR,在聚宽量化平台如何计算ATR

海龟们使用两种资金管理方法。首先,我们把头寸分成一个个小块。这样,即使一笔交易赔了钱,我们损失的也只是一个头寸的一部分。里奇和比尔把这些小块称作头寸单位。其次,我们使用里奇和比尔发明的一种创新性的头寸规模决定方法。这种方法以市场的每日上下波动为基础,而波动幅度是以不变美元价衡量的。他们会为每一个市场计算出一个特定的合约数量,目的是让所有市场的绝对波动幅度大致相等。里奇和比尔把他们的波动性指标称为N,尽管现在的人更习惯称它为真实波动幅度均值(average true range,ATR)。

在量化投资平台聚宽上面,可以用下面的代码来计算:

# 本文用于测算ATR,ATR是用于测算波动率的重要指标,其定义为:

# 1、昨日收盘价-当日最高价

# 2、昨日收盘价-当日最低价

# 3、当日最高价-当日最低价

# 三者的最大值

import pandas as pd

#显示所有列

pd.set_option('display.max_columns', None)

#显示所有行

pd.set_option('display.max_rows', None)

#设置value的显示长度为100,默认为50

pd.set_option('max_colwidth',100)

def get_ATR(stockname, begindate, enddate):

    # 获取行情数据

    df_stockdata = get_price(stockname, start_date=begindate, end_date=enddate, frequency='daily')

    df_stockdata = df_stockdata.reset_index()

    df_stockdata.rename(columns={'index':'stockdate'}, inplace=True)

#     print(df_stockdata)

    if type(df_stockdata) == int:

        print(stockname, '在这段时间内,没有数据!')

        return -1

    # 数据清理,首先要删掉空格行

    df_stockdata = df_stockdata.replace(0, np.nan)

    df_stockdata = df_stockdata.dropna()

    df_stockdata = df_stockdata.reset_index(drop=True)

    # 获取昨日收盘价

    df_yesterday_close = df_stockdata.loc[0:len(df_stockdata) - 2, 'close']

    df_yesterday_close.index = df_yesterday_close.index + 1

    df_yesterday_close.rename('yesterday_Close', inplace=True)  # 更新Series的名字,一定要加 inplace=True,否则改不过来

    # print(type(df_yesterday_close))

    df_stockdata = pd.concat([df_stockdata, df_yesterday_close], axis=1)

    df_stockdata = df_stockdata.dropna(axis=0)  # 删掉空值数据

    df_stockdata = df_stockdata.reset_index(drop=True)

    df_stockdata['ATR_3'] = (df_stockdata['high'] - df_stockdata['low'])  # 当日最高价-当日最低价

    df_stockdata['ATR_2'] = abs(df_stockdata['yesterday_Close'] - df_stockdata['low'])  # 昨日收盘价-当日最低价

    df_stockdata['ATR_1'] = abs(df_stockdata['yesterday_Close'] - df_stockdata['high'])  # 昨日收盘价-当日最低价

    # 重新构建一个临时DataFrame,用于取最大值

    df_temp_atr = df_stockdata[['ATR_3', 'ATR_2', 'ATR_1']]

    df_atr = df_temp_atr.max(axis=1)

    df_atr.rename('ATR', inplace=True)    # 重命名

    

    df_stockdata = pd.concat([df_stockdata, df_atr], axis=1)

    return df_stockdata

get_ATR('300144.XSHE', '2022-02-01', '2022-02-18')

你可能感兴趣的:(python,量化交易)