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

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

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

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

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MIF指标是一种量化选股策略,它是根据市场利率反映经济情况的指标进行选股。MIF指标全称Market Interest Factor,它基于市场利率的变化来判断股票的投资价值和潜在收益。 MIF指标的计算过程包括多个步骤。首先,收集并分析历史市场利率数据,得出市场利率的趋势。然后,将这些数据与个股的基本面分析相结合,考虑公司的盈利能力、市值、行业地位等因素,综合评估股票的投资价值。根据这些指标,对股票进行打分或排名,从中选取潜力较大的个股进行投资。 MIF指标的优势在于能够利用市场利率的变化来判断股票的投资价值,从而规避市场风险。市场利率的变化对公司的盈利能力、财务状况等有一定影响,通过考虑这些因素,可以更准确地评估个股的投资回报。此外,MIF指标还可以帮助投资者进行投资组合管理,根据市场的整体情况进行资产配置,从而实现风险分散和收益最大化。 然而,MIF指标也有一些局限性。由于市场利率只是影响股票投资价值的一个因素,而其他因素如行业发展、公司治理等同样重要,仅依靠MIF指标可能无法全面评估个股的投资价值。此外,市场利率的波动也可能受到其他因素的影响,因此单一依据市场利率进行选股可能无法完全准确预测股票的表现。 综上所述,MIF指标是一种基于市场利率的量化选股策略,能够通过分析市场利率的变化来评估个股的投资价值。它能够帮助投资者进行风险管理和资产配置,但也需要注意其他因素的影响,避免单一化评估股票投资价值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神出鬼没,指的就是我!

必须花钱,数据超好

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值