Skip to main content

常用公式

[TOC]

1. 涨跌幅

    涨跌幅 = (当期收盘价-前期收盘价) / 前期收盘价
  daily_return = data['close'].pct_change()  # pct_change()表示当前元素与先前元素的相差百分比,就是涨跌幅

2. 总盈亏

    总盈亏 = ( 市价-成本价) * 股价

3. 浮动盈亏比

    浮动盈亏比 =  ( 市价-成本价) / 成本价

4. 成本价

    成本价 = 买入金额 / 持有股数

5. 累计收益率

    累计收益率 = ( 1 + 当天收益率 )的累计乘积 - 1
def calculate_cum_prof(data):
"""
计算累计收益率(个股收益率)
:param data: dataframe
:return:
"""
# 累计收益
data['cum_profit'] = pd.DataFrame(1 + data['profit_pct']).cumprod() - 1
return data

def calculate_prof_pct(data):
"""
计算单次收益率:开仓、平仓(开仓的全部股数)
:param data:
:return:
"""
# 筛选信号不为0的,并且计算涨跌幅
data.loc[data['signal'] != 0, 'profit_pct'] = data['close'].pct_change()
data = data[data['signal'] == -1] # 筛选平仓后的数据:单次收益
return data

6. 投组收益率

    投组收益率(等权重)= 收益率之和 / 股票个数

7. 最大回撤

    最大回撤 = (周期内的最低值 - 周期内的最高值) /  周期内的最高值
当天的回撤比 = (谷值 — 峰值)/峰值 = 谷值/峰值 - 1
def caculate_max_drawdown(data, window=252):
"""
计算最大回撤比
:param data:
:param window: int, 时间窗口设置,默认为252(日k)
:return:
"""
# 模拟持仓金额:投入的总金额 *(1+收益率)
data['close'] = 10000 * (1 + data['cum_profit'])
# 选取时间周期中的最大净值
data['roll_max'] = data['close'].rolling(window=window, min_periods=1).max()
# 计算当天的回撤比 = (谷值 — 峰值)/峰值 = 谷值/峰值 - 1
data['daily_dd'] = data['close'] / data['roll_max'] - 1
# 选取时间周期内最大的回撤比,即最大回撤
data['max_dd'] = data['daily_dd'].rolling(window, min_periods=1).min()

8. 夏普比率

        夏普比率 = (期望的投资回报率 - 无风险利率) / 投资回报率的标准差

无风险利率 国债比率 投资回报率的标准差 = 每个数据项-均值的总和 / 数据项个数

def calculate_sharpe(data):
"""
计算夏普比率,返回的是年化的夏普比率
:param data: dataframe, stock
:return: float
"""
# 公式:sharpe = (回报率的均值 - 无风险利率) / 回报率的标准差
# daily_return = data['close'].pct_change() # pct_change()表示当前元素与先前元素的相差百分比,就是涨跌幅
daily_return = data['profit_pct'] # 策略应用后
avg_return = daily_return.mean() # 回报率均值
sd_reutrn = daily_return.std() # 回报率的标准差
# 计算夏普:每日收益率 * 252 = 每年收益率
sharpe = avg_return / sd_reutrn
sharpe_year = sharpe * np.sqrt(252)
return sharpe, sharpe_year

8. 假设检验:t-test

t 统计量 = ( 样本均值 - 理论平均值) / (样本标准差/ 根号下 样本数量 )

计算组合收益率

def caculate_portfolio_return(data, signal, n):
"""
计算组合收益率
:param data: dataframe
:param signal: dataframe
:param n: int
:return returns: dataframe
"""
returns = data.copy()
# 投组收益率(等权重)= 收益率之和 / 股票个数
returns['profit_pct'] = (signal * returns.shift(-1)).T.sum() / n
returns = calculate_cum_prof(returns)
return returns.shift(1) # 匹配对应的交易月份

评估策略收益表现

def evaluate_strategy(data):
"""
评估策略收益表现
:param data: dataframe, 包含单次收益率数据
:return results: dict, 评估指标数据
"""
# 评估策略效果:总收益率、年化收益率、最大回撤、夏普比
data = calculate_cum_prof(data)

# 获取总收益率
total_return = data['cum_profit'].iloc[-1]
# 计算年化收益率(每月开仓)
annual_return = data['profit_pct'].mean() * 12

# 计算近一年最大回撤
data = caculate_max_drawdown(data, window=12)
# print(data)
# 获取近一年最大回撤
max_drawdown = data['max_dd'].iloc[-1]

# 计算夏普比率
sharpe, annual_sharpe = calculate_sharpe(data)

# 放到dict中
results = {'总收益率': total_return, '年化收益率': annual_return,
'最大回撤': max_drawdown, '夏普比率': annual_sharpe}

# 打印评估指标
for key, value in results.items():
print(key, value)

return data