量化学习——策略判断指标

用于计算一些指标,例如最大回撤,年化收益率,胜率,夏普率,所提诺比率,判断当前策略是否适合进行交易。

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)) -1total_return = total_return*100annual_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"] * 100max_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 pd
import 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')

使用自己的策略什么的,最后把结果调成同样的格式即可

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部