量化学习 您所在的位置:网站首页 np是指什么 量化学习

量化学习

2023-03-04 04:16| 来源: 网络整理| 查看: 265

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

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]['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')

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

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有