策略評估指標計算
- 概述
- 獲取取票資料
- 回測收益率
- 回測年華收益率
- 最大回撤
- 夏普比率
概述
我們在創建策略的程序中, 需要通過不同的評估指標來驗證策略的有效性. 這些指標可以幫助我們調整策略, 得到更好的結果.

常見的策略評估指標有:
- 回測收益率
- 回測年化收益率
- 最大回撤
- 夏普比率
- Alpha, Beta

獲取取票資料
- 以伊利股份和貴州茅臺為例
- 分析區間 2019-01-01 到 2021-01-01
注: 貴州茅臺兌牛奶, 那叫一個爽.
代碼:
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
plt.style.use("fivethirtyeight")
# 定義獲取資料時間段
start_date = "2019-01-01" # 開始日期
end_date = "2021-01-01" # 結束日期
# 獲取洋河股份資料
data = get_price(["600887.XSHG", "600519.XSHG"], start_date=start_date, end_date=end_date, fields="close")
data = pd.DataFrame(data, index=data.index)
# 除錯輸出
print(data.head())
# 繪制走勢圖
data.plot(figsize=(16, 10), subplots=True)
輸出結果:
600887.XSHG 600519.XSHG
date
2019-01-02 21.3696 583.4249
2019-01-03 21.1985 574.6781
2019-01-04 21.4076 586.3665
2019-01-07 21.6453 589.7659
2019-01-08 21.4837 589.0840

回測收益率

代碼:
# 計算每天的累計收益
data_new = data / data.iloc[0]
print(data_new.head())
# 畫圖
data_new.plot(figsize=(16, 10))
# 區間累計收益率
total_return = data_new.iloc[-1] - 1 # 用最后一個值減去1
total_return = pd.DataFrame(total_return.values, columns=["累計收益"], index=total_return.index)
print(total_return)
輸出結果:
600887.XSHG 600519.XSHG
date
2019-01-02 1.000000 1.000000
2019-01-03 0.991993 0.985008
2019-01-04 1.001778 1.005042
2019-01-07 1.012902 1.010869
2019-01-08 1.005339 1.009700
累計收益
600887.XSHG 1.076314
600519.XSHG 2.424605

回測年華收益率

代碼:
# 查看資料長度
data_length = len(data_new)
print("資料長度:", data_length)
# 計算年化收益率
annual_return = pow(data_new.iloc[-1], 250 / data_length) - 1
# 除錯輸出
print("年化收益:")
print(annual_return)
除錯輸出:
資料長度: 487
年化收益:
600887.XSHG 0.455062
600519.XSHG 0.881225
Name: 2020-12-31 00:00:00, dtype: float64
最大回撤

代碼:
# 計算累計最大值
max = data.cummax()
# 除錯輸出
print(data.head())
print(max.head())
# 計算每天回撤
drawdown_daily = (data.cummax() - data) / data.cummax()
# 除錯輸出
print(drawdown_daily.head())
# 計算最大回測
total_drawdown = drawdown_daily.max()
# 改成df
total_drawdown = pd.DataFrame([str(i * 100) + "%" for i in total_drawdown], columns=["最大回撤"], index= total_drawdown.index)
# 除錯輸出
print(total_drawdown.head())
輸出結果:
# 計算累計最大值
max = data.cummax()
# 除錯輸出
print(data.head())
print(max.head())
# 計算每天回撤
drawdown_daily = (data.cummax() - data) / data.cummax()
# 除錯輸出
print(drawdown_daily.head())
# 計算最大回測
total_drawdown = drawdown_daily.max()
# 改成df
total_drawdown = pd.DataFrame([str(i * 100) + "%" for i in total_drawdown], columns=["最大回撤"], index= total_drawdown.index)
# 除錯輸出
print(total_drawdown.head())
輸出結果:
600887.XSHG 600519.XSHG
date
2019-01-02 21.3696 583.4249
2019-01-03 21.1985 574.6781
2019-01-04 21.4076 586.3665
2019-01-07 21.6453 589.7659
2019-01-08 21.4837 589.0840
600887.XSHG 600519.XSHG
date
2019-01-02 21.3696 583.4249
2019-01-03 21.3696 583.4249
2019-01-04 21.4076 586.3665
2019-01-07 21.6453 589.7659
2019-01-08 21.6453 589.7659
600887.XSHG 600519.XSHG
date
2019-01-02 0.000000 0.000000
2019-01-03 0.008007 0.014992
2019-01-04 0.000000 0.000000
2019-01-07 0.000000 0.000000
2019-01-08 0.007466 0.001156
最大回撤
600887.XSHG 21.322799729408366%
600519.XSHG 19.270518955514174%
夏普比率
夏普比率指的是策略承受一單位總風險, 會產生多少的超額報酬.
- 假設無風險收益率為年化 3%
- 超額收益率以無風險收益率為基準

代碼:
# 向后填補缺失值
data_fill = data.fillna(method='pad')
# 計算每日收益率
return_rate = data_fill.apply(lambda x: x / x.shift(1) - 1)[1:] # 去除首個NaN
# 除錯輸出
print(return_rate.head())
# 計算超額回報率
exReturn = return_rate - 0.03 / 250
#計算夏普比率
sharpe_rate = np.sqrt(len(exReturn)) * exReturn.mean() / exReturn.std()
#夏普比率的輸出結果
SHR = pd.DataFrame(sharpe_rate,columns=['夏普比率'])
# 輸出伊利和茅臺的夏普比率
print(SHR)
輸出結果:
| | |
|--|--|
| | |
600519.XSHG 600887.XSHG
date
2019-01-03 -0.014992 -0.008007
2019-01-04 0.020339 0.009864
2019-01-07 0.005797 0.011104
2019-01-08 -0.001156 -0.007466
2019-01-09 0.018734 0.008849
夏普比率
600519.XSHG 3.048383
600887.XSHG 1.715563
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/275801.html
標籤:python
上一篇:Python爬蟲:BeatifulSoap決議HTML報文的三個實用技巧
下一篇:多型,發生在繼承、重寫的情況。
