Python量化交易系统实战--计算交易指标
作者:麦克煎蛋 出处:https://www.cnblogs.com/mazhiyong/ 转载请保留这段声明,谢谢!
本节主要包括以下内容:
1、计算涨跌幅
使用shift函数计算涨跌幅
def calculate_change_pct(data): """ 涨跌幅 = (当期收盘价-前期收盘价) / 前期收盘价 :param data: dataframe,带有收盘价 :return: dataframe,带有涨跌幅 """ data['close_pct'] = (data['close'] - data['close'].shift(1)) \ / data['close'].shift(1) return data
其实也可以用更简单的计算方法:
data['close'].pct_change()
2、计算单次收益率
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
3、计算累计收益率
累计收益率的计算理论:
理财产品(本金100元) 第1天:3% :(1+3%) ✖ 100 = 103 第2天:2% :(1+2%)✖ 以上 = 103 +2.06 第3天:5% : (1+5%)✖ 以上 = 收益 ✖ 以上 第4天:6% :(1+6%)✖ 以上 = 收益 ✖ 以上 第n天:累计收益 = (1+当天收益率)的累计乘积-1 这里的计算公式为什么需要减1呢? 因为我们上面的公式都是包括本金的,比如说103应该减去100,只有3元才是我们的利润,所以这里需要减去1,将本金去掉。
代码计算时重点是要理解cumprod的使用方法:
def calculate_cum_prof(data): """ 计算累计收益率(个股收益率) :param data: dataframe :return: """ # 累计收益 data['cum_profit'] = pd.DataFrame(1 + data['profit_pct']).cumprod() - 1 return data
4、计算风险指标:最大回撤
股票最大回撤是指股票或投资组合在特定时期内,从最高点跌至最低点的最大幅度。
这个指标反映了投资的潜在损失,是评估投资风险的一个重要方式。例如,如果某股票的价格在一段时间内从最高点100元降至最低点80元,那么其最大回撤为20%。
视频作者中采用了(谷值 — 峰值),我感觉是不是应该反过来计算。
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() return data
5、计算风险收益指标:夏普比率
夏普比率(Sharpe Ratio),又称为夏普指数,是一种用于评估基金或投资组合绩效的指标。
夏普比率基于现代投资理论,特别是在资本资产定价模型(CAPM)的基础上发展起来的。
夏普比率通过将投资组合的超额收益(即超过无风险利率的部分)除以该组合的标准差(即风险)来计算,这个比率反映了单位风险所带来的超额回报。
夏普比率越大,表明投资组合在相同风险下能够获得更高的超额回报,或者在同一超额回报下承担更低的风险。
夏普比率的一个重要应用是帮助投资者在承受相同风险的情况下选择那些能够提供更高预期回报的投资组合,或者在预期回报相同的情况下选择风险更低的投资组合。
def calculate_sharpe(data): """ 计算夏普比率,返回的是年化的夏普比率 :param data: dataframe, stock :return: float """ # 公式:sharpe = (回报率的均值 - 无风险利率) / 回报率的标准差 daily_return = data['close'].pct_change() # 演示部分 # daily_return = data['profit_pct'] # 策略应用后 avg_return = daily_return.mean() sd_return = daily_return.std() # 计算夏普:每日收益率 * 252 = 每年收益率 sharpe = avg_return / sd_return sharpe_year = sharpe * np.sqrt(252) return sharpe, sharpe_year