# 导入所需库import pandas as pdimport numpy as npfrom sklearn.linear_model import LinearRegressionfrom sklearn.linear_model import Ridge# 初始化函数def initialize(context): set_params() set_backtest() run_daily(trade, time='every_bar')# 设置参数def set_params(): g.days = 0 g.refresh_rate = 5 g.stocknum = 10# 设置回测参数def set_backtest(): set_benchmark('000001.XSHG') set_option('use_real_price', True) log.set_level('order', 'error')# 每日交易逻辑def trade(context): if g.days % g.refresh_rate == 0: # 获取上证50成分股 stocks = get_index_stocks('000016.XSHG', date=context.current_dt) # 获取基本面数据 q = query( valuation.code, valuation.market_cap, balance.total_assets - balance.total_liability, balance.total_assets / balance.total_liability, income.net_profit, indicator.inc_revenue_year_on_year, balance.development_expenditure ).filter(valuation.code.in_(stocks)) df = get_fundamentals(q, date=context.current_dt) # 重命名列 df.columns = ['code', 'mcap', 'na', '1/DA_ratio', 'net_income', 'growth', 'RD'] df.set_index('code', inplace=True) df.fillna(0, inplace=True) # 特征和目标 X = df.drop(columns=['mcap']) y = df['mcap'] # 训练线性回归模型 reg = LinearRegression() reg.fit(X, y) # 预测市值 predict = pd.DataFrame(reg.predict(X), index=X.index, columns=['predict_mcap']) diff = df['mcap'] - predict['predict_mcap'] diff = pd.DataFrame(diff, index=X.index, columns=['diff']) diff = diff.sort_values(by='diff', ascending=True) # 获取买入前g.stocknum只股票 stockset = list(diff.index[:g.stocknum]) # 获取当前持仓股票 sell_list = list(context.portfolio.positions.keys()) # 卖出不在买入列表中的股票 for stock in sell_list: if stock not in stockset: order_target_value(stock, 0) # 计算买入金额 if len(context.portfolio.positions) < g.stocknum: num = g.stocknum - len(context.portfolio.positions) cash = context.portfolio.available_cash / num else: cash = 0 num = 0 # 买入新股票 for stock in stockset[:g.stocknum]: if stock in context.portfolio.positions: continue if num == 0: break order_target_value(stock, cash) num -= 1 # 每天更新天数 g.days += 1
回测结果分析:根据系统返回的收益概述情况。直观来看,这个策略有点拉垮。再来看具体指标:策略的累计收益率为23.48%,年化收益率为7.51%,超额收益率为12.43%。紧随其后的还有“阿尔法”“贝塔”“夏普比率”“最大回撤”等若干个指标。这些指标对于朋友们来说,还有点儿陌生。咱们就用一点儿篇幅来简单介绍一下几个重点指标。
阿尔法:也就是Alpha,指的是通过投资,获得的与市场波动无关的回报,简单来说,就是策略收益比基准收益多(或者少)的部分。它的计算公式是
Alpha=Rp-(Rf+βp(Rm -Rf))
其中,Rp是策略的年化收益率,Rf是无风险利润(默认取0.04),Rm是基准收益率,β是策略的贝塔值。阿尔法值越大,说明策略的收益越高。如果有个策略的阿尔法值小于0,那说明使用这个策略进行交易,还不如直接买指数基金赚得多。
贝塔:也就是Beta,指的是策略对与大盘变化的敏感性。举例来说,假如大盘上涨了1%,而策略的收益上涨了2%,说明贝塔值在2左右。当然这是粗略的说法,详细的计算公式是:
式中,Dp 指的是每日策略的收益,Dm指的是每日的基准收益。Cov指的是协方差,Var指的是方差。
简单地讲,
如果贝塔值小于0,说明策略收益与大盘的走势相反;
如果贝塔值等于0,说明策略收益与大盘的走势没有关系;
如果贝塔值大于0且小于1,说明策略收益与大盘的走势相同,但是波动幅度比大盘的波动幅度小;
如果贝塔值大于1,说明策略的收益与大盘的走势相同,而且波动幅度比大盘的波动幅度还要大。
夏普比率:也就是Sharpe Ratio,指的是策略每承受一单位的风险,能够产生多少超额回报。它的计算公式是:
式中,Rp是策略的年化收益率,Rf是基准收益。σp是策略收益的标准差,也就是策略收益的波动率。对于策略来说,夏普比率的值越高越好。
最大回撤:也就是 Max DrawDown,指的是在一定时间范围内,总资产的最大值与最小值的差与最大值的比率。这个指标衡量的是策略可能带来的亏损,其计算公式为:
Ppeak:历史最高净值
Ptrough:历史最低净值
通俗地说,假设某日我们的总资产P是1万元,而过了若干天,总资产缩水到了8000元,则最大回撤是(10000-8000)/10000x100%=20%。也就是说,该策略的最大回撤是 20%。
述几个指标之外,回测结果还包含了一些其他指标。这里我们不详细展开,留给大家自己了解即可。回过头来,咱们再说一说策略的表现--策略的累计收益率为23.48%,年化收益率为7.51%--虽然整体跑赢了大盘基准收益,但显然,不管是看到这里的各位还是西西对这个结果是不满意的--费了那么大劲,结果却比买保本理财产品的年化收益率高不了多少,那还不如买理财产品呢。看起来,我们还得继续优化我们的策略才行。
注意:在本策略中,我们使用了线性回归模型来进行选股。限于篇幅,我们就不展示其他线性模型的使用方法了。感兴趣的朋友可以尝试替换成岭回归或其他的线性模型算法,对比一下看策略的收益能否有效提高。
Copyright © 2024-2025 成都宁时科技有限公司 版权所有