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