常用公式
[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