量化学习——策略判断指标
用于计算一些指标,例如最大回撤,年化收益率,胜率,夏普率,所提诺比率,判断当前策略是否适合进行交易。
1.年化收益率:
NH=(cum[-1]-1)*100*252/len(cum.index)2.年化夏普率:
NH=(cum[-1]-1)*100*252/len(cum.index)
BD=np.std(np.log(cum/cum.shift(-1)))*np.sqrt(252)*100
SR=(NH-4)/BD #4为基准收益率
3.最大回撤:
MHC=((np.maximum.accumulate(return_list) - return_list) / np.maximum.accumulate(return_list)).max()*100
4.日线改为周线,月线,年线
end =datetime.now().strftime('%Y%m%d')
#code= str(stock_pool['代码'].values[0])
code = '000001'
data = ak.stock_zh_a_hist(symbol=str(code), period="daily", start_date="19900301", end_date=end, adjust="")
data['日期'] = pd.to_datetime(data['日期'], format='%Y-%m-%d')
data.rename(columns= {'日期':'date1','开盘':'open','最高':'high','最低':'low','收盘':'close','成交量':'volume'},inplace=True)
data['code'] = code
data = data[['date1','open','close','high','low','volume','code']]
#data = data.set_index(data.date)
data.head()
stock2 = data
#导入数据转为周线,W周,M月,Q季度
period_type='m'
#日期设为索引
stock2.insert(0,column='date',value=stock2['date1'])
stock2.set_index('date1',inplace=True)
#最后一天收盘价
stock2.index = pd.to_datetime(stock2.index)
period_stock_data = stock2.resample(period_type).last()
period_stock_data['open'] = stock2['open'].resample(period_type).first()
period_stock_data['high'] = stock2['high'].resample(period_type).max()
period_stock_data['low'] = stock2['low'].resample(period_type).min()
period_stock_data['volume'] = stock2['volume'].resample(period_type).sum()
#去掉无数据周条目
period_stock_data = period_stock_data [period_stock_data['code'].notnull()]
5.统一计算函数组:
def calculate_statistics(df):
'''
输入:
DataFrame类型,包含价格数据和仓位、开平仓标志
position列:仓位标志位,0表示空仓,1表示持有标的
flag列:买入卖出标志位,1表示在该时刻买入,-1表示在该时刻卖出
close列:日收盘价
输出:dict类型,包含夏普比率、最大回撤等策略结果的统计数据
'''
#净值序列
df['net_asset_pct_chg'] = df.net_asset_value.pct_change(1).fillna(0)
#总收益率与年化收益率
total_return = (df['net_asset_value'][df.shape[0]-1] -1)
annual_return = (total_return)**(1/(df.shape[0]/252)) -1
total_return = total_return*100
annual_return = annual_return*100
#夏普比率
df['ex_pct_chg'] = df['net_asset_pct_chg']
sharp_ratio = df['ex_pct_chg'].mean() * math.sqrt(252)/df['ex_pct_chg'].std()
#回撤
df['high_level'] = (
df['net_asset_value'].rolling(
min_periods=1, window=len(df), center=False).max()
)
df['draw_down'] = df['net_asset_value'] - df['high_level']
df['draw_down_percent'] = df["draw_down"] / df["high_level"] * 100
max_draw_down = df["draw_down"].min()
max_draw_percent = df["draw_down_percent"].min()
#持仓总天数
hold_days = df['position'].sum()
#交易次数
trade_count = df[df['flag']!=0].shape[0]/2
#平均持仓天数
avg_hold_days = int(hold_days/trade_count)
#获利天数
profit_days = df[df['net_asset_pct_chg'] > 0].shape[0]
#亏损天数
loss_days = df[df['net_asset_pct_chg'] < 0].shape[0]
#胜率(按天)
winrate_by_day = profit_days/(profit_days+loss_days)*100
#平均盈利率(按天)
avg_profit_rate_day = df[df['net_asset_pct_chg'] > 0]['net_asset_pct_chg'].mean()*100
#平均亏损率(按天)
avg_loss_rate_day = df[df['net_asset_pct_chg'] < 0]['net_asset_pct_chg'].mean()*100
#平均盈亏比(按天)
avg_profit_loss_ratio_day = avg_profit_rate_day/abs(avg_loss_rate_day)
#每一次交易情况
buy_trades = df[df['flag']==1].reset_index()
sell_trades = df[df['flag']==-1].reset_index()
result_by_trade = {
'buy':buy_trades['close'],
'sell':sell_trades['close'],
'pct_chg':(sell_trades['close']-buy_trades['close'])/buy_trades['close']
}
result_by_trade = pd.DataFrame(result_by_trade)
#盈利次数
profit_trades = result_by_trade[result_by_trade['pct_chg']>0].shape[0]
#亏损次数
loss_trades = result_by_trade[result_by_trade['pct_chg']<0].shape[0]
#单次最大盈利
max_profit_trade = result_by_trade['pct_chg'].max()*100
#单次最大亏损
max_loss_trade = result_by_trade['pct_chg'].min()*100
#胜率(按次)
winrate_by_trade = profit_trades/(profit_trades+loss_trades)*100
#平均盈利率(按次)
avg_profit_rate_trade = result_by_trade[result_by_trade['pct_chg'] > 0]['pct_chg'].mean()*100
#平均亏损率(按次)
avg_loss_rate_trade = result_by_trade[result_by_trade['pct_chg'] < 0]['pct_chg'].mean()*100
#平均盈亏比(按次)
avg_profit_loss_ratio_trade = avg_profit_rate_trade/abs(avg_loss_rate_trade)
statistics_result = {
'net_asset_value':df['net_asset_value'][df.shape[0]-1],#最终净值
'total_return':total_return,#收益率
'annual_return':annual_return,#年化收益率
'sharp_ratio':sharp_ratio,#夏普比率
'max_draw_percent':max_draw_percent,#最大回撤
'hold_days':hold_days,#持仓天数
'trade_count':trade_count,#交易次数
'avg_hold_days':avg_hold_days,#平均持仓天数
'profit_days':profit_days,#盈利天数
'loss_days':loss_days,#亏损天数
'winrate_by_day':winrate_by_day,#胜率(按天)
'avg_profit_rate_day':avg_profit_rate_day,#平均盈利率(按天)
'avg_loss_rate_day':avg_loss_rate_day,#平均亏损率(按天)
'avg_profit_loss_ratio_day':avg_profit_loss_ratio_day,#平均盈亏比(按天)
'profit_trades':profit_trades,#盈利次数
'loss_trades':loss_trades,#亏损次数
'max_profit_trade':max_profit_trade,#单次最大盈利
'max_loss_trade':max_loss_trade,#单次最大亏损
'winrate_by_trade':winrate_by_trade,#胜率(按次)
'avg_profit_rate_trade':avg_profit_rate_trade,#平均盈利率(按次)
'avg_loss_rate_trade':avg_loss_rate_trade,#平均亏损率(按次)
'avg_profit_loss_ratio_trade':avg_profit_loss_ratio_trade#平均盈亏比(按次)
}
return statistics_result
(数据格式:)

画图:
使用qs做策略分析
import pandas as pdimport akshare as ak
import quantstats as qs
# 获取沪深300历史交易数据
df_300 = ak.stock_zh_index_daily_em(symbol="sh000300")
# 获取工商银行历史交易数据
df = ak.stock_zh_a_hist(symbol="601398", adjust="hfq")
# 将列名日期改为date,使其与df_300具备同名日期列
df['date'] = df['日期']
# 合并两个数据表
df_merge = df.merge(df_300, how='inner', on='date')
# 将合并数据表的日期列改为时间格式
df_merge['date'] = pd.to_datetime(df_merge['date'] , format='%Y-%m-%d')
# 目标策略收益率Series,pct_change的作用是根据价格计算收益率
target = df_merge['收盘'].pct_change()
# 将索引设置为日期列
target.index = df_merge['date']
# 基准策略收益率Series,计算方法相同
base = df_merge['close'].pct_change()
base.index = df_merge['date']
# 输出网页格式的分析结果
qs.reports.html(target, base, output='Output.html')
使用自己的策略什么的,最后把结果调成同样的格式即可

郑重声明: 本文只是个人(本单位)复盘记录,文内提到的所有信息仅为分享和盘面结构梳理,不构成投资或投机建议,买卖自行决策,结果自己负责。
购买点数和充值VIP全部支持支付宝或微信扫码支付,登陆会员中心侧面板>>财务选择相关操作即可。
在线预览主旨方便移动设备使用和临时查看,直观浏览,对需要的文章再下载,预览了的文件且能秒速下载。
阅读与下载说明
1.『会员阅览(扣点)』为普通会员扣点(1元=1点)通道,已浏览过的只扣一次。
2.『VIP阅览 (VIP)』 为VIP特权通道,充值成VIP用户直接无任何限制高速在线阅览,VIP会员分包月,包年和终身VIP三种。
3.『免费阅览(免费)』为未付费会员通道,可无任何限制免费阅览该资源,推荐购买点数或充值VIP,以获取超值资源。
4. 阅览的资讯文件过大,根据您的网速而会有相应的延迟,请耐心等待;如果提示其他问题请联系客户解决。
购买点数和充值VIP全部支持支付宝或微信扫码支付,登陆会员中心侧面板>>财务选择相关操作即可。
在线预览主旨方便移动设备使用和临时查看,直观浏览,对需要的文章再下载,预览了的文件且能秒速下载。