用 Pandas 进行向量化回测
导入依赖的库
import numpy as np import pandas as pd import matplotlib.pyplot as plt plt.style.use('seaborn') import warnings warnings.filterwarnings('ignore') import yfinance as yf
准备金融数据
f =yf.download('GOOG', end='2021-12-31', proxy="http://127.0.0.1:7890") return_serie = f['Adj Close'].pct_change(1).dropna() return_serie.name = 'return' return_serie
计算索提诺比率(Sortino ratio)
(索提诺比率越高越好,大于1最理想,小于0最差)
然后我们要计算 Sortino 比率,首先,我们需要这个serie的平均值,然后我们需要下行波动率,所以我们计算所有低于零的值的标准差。这意味着我们计算所有负收益的波动率。所以要获得负回报,我们只需告诉 pandas 我们希望所有系列回报值都低于 0。
然后,我可以创建一个 Sortino 比率,然后我可以使用 f-string 打印它。我想用三位小数计算这个 Sortino 比率的值。
mean = np.mean(return_serie) vol = np.std(return_serie[return_serie<0]) sortino = mean/vol print(f"Sortino: {'%.3f' % sortino}")
但是现在,正如我们所见,我们的 Sortino 比率约为 0.1,但我们需要一个像 1.32 或 1.23 这样的结果,我不记得像以前的结果。这是因为我们没有对所有指标进行年度化,它是如此重要,这就是为什么我只想看到这个错误,因为如果你没有对所有指标进行年度化,你就会遇到一些问题。当你想解释它时,你会很难比较不同的策略。因为如果一个策略以每日间隔进行交易,例如,如果从不以每月间隔进行交易,那么您将有一个策略的每日 Sortino 比率,以及另一个策略的每月 Sortino 比率。所以你真的不能将这两种策略放在一起比较。
因此,要解决此问题,您需要对所有 Sortino 比率进行年度化。
要做到这一点,我们需要乘以 252,因为它是当年的开放日数,为什么 sqrt(252)?这是因为对均值进行年化,需要乘以 252,而要对波动率进行年化, 我们需要将其乘以 sqrt(252),因为波动率是方差的平方 。现在我们有了 Google 的年化 Sortina 比率,因此我们可以看到,考虑到该资产的波动性,该资产具有非常好的回报。
import re # Compute the Sortino mean = np.mean(return_serie) vol = np.std(return_serie[return_serie<0]) sortino = np.sqrt(252) * mean/vol print(f"Sortino: {'%.3f' % sortino}")
原创文章,作者:朋远方,如若转载,请注明出处:https://caovan.com/10-shilianghuahuice/.html