作者:麥克煎蛋 出處: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