市场分析:ETF全市场数据分析,从20日动量来看,除了标普信息科技之外,其余动量最强的是商品,煤炭、原油、能源等等。
01 数据下载
汇报一下最新数据进展:历史至今1270支etf的价量后复权数据打包下载。
数据是量化的基础,在机器学习领域,大家大量的时间都花在整理数据上,我希望把这些事情给大家准备好。大家把心思更多花在金融逻辑与策略上。
OHLCV及换手率,量价数据都是“后复权”(量化一般使用后复权,与你看到的真实价格可能会有不同)之后的。如果你自己处理,需要下载复权因子,然后合并之类的,1000多支etf(含LOF)是个不小的工作量,而且调试挺繁琐的。
之前发过沪深300成份股的历史量价及估值数据:
02 系统升级
关于系统升级,昨天大家报了说与老版本收益率差距较大的问题。早起我就起来调试了。使用同样的最新的数据集。
等权+月底再平衡的策略:
from engine.backtest import run from engine.algos import * from config import DATA_DIR from engine.engine_utils import load_data, get_backtest, get_bench_bkts, show_results symbols = ['510300.SH', # 沪深300 '511220.SH', # 城投债 '518880.SH', # 黄金 '513100.SH', # 纳指100 ] fields = ['close/shift(close,20)-1', 'close/shift(close,1)-1'] fields.append('roc_20>0') names = ['roc_20', 'return_0'] names.append('roc_20_gt_0') df = load_data(fields, names, symbols, path=DATA_DIR.joinpath('etfs')) data = df.pivot_table(values='close',columns='symbol', index='date') data.fillna(method='ffill', inplace=True) import bt # create the strategy s = bt.Strategy('s1', [bt.algos.RunMonthly(), bt.algos.SelectAll(), bt.algos.WeighEqually(), bt.algos.Rebalance()]) test = bt.Backtest(s, data) res = bt.run(test) print(res.stats)
老版本年化:8.6%,最大回撤:-18.87%,
老版本的bt内核会把日期往前一天,但这一天,本身不参与运算,我们真实输入的数据其实是2012-05-28开始。
新版本:年化8.4%,最大回撤数据一模一样。
从调试的角度,大家可以把交易记录打印出来,甚至保存到csv里对比:
小结
七年之约,只是开始。
践行长期主义。
万物之中,希望至美。
人工智能与金融投资,都是长坡厚雪,且还是为数不多,可以满足个人英雄主义情结的地方。
走,一起赶路吧。
做一个年化50%的策略容易,但做出一个年化15%,但夏普超过1个策略不容易。
回测系统,如果你读过几个系统源码的话,开发一个回测系统也不是很难的事情,当然把回测逻辑搞透,对于理解策略开发会有很多好处——我们已经开发完成了,并开放了源代码多策略、高性能、积木式框架(代码+数据)。
重点就是针对不同投资市场的策略构建。
要构建一个稳健的高夏普策略投入实盘,风险平价是绕不开的话题。
计算投资标的的协方差:
风险平价配置:
按给定的“风险预算”分配权重:
带约束的风险预算:
未配置约束的情况,等同于风险平价:
C = None d = None from engine.pyrb import ConstrainedRiskBudgeting CRB = ConstrainedRiskBudgeting(cov,C=C,d=d) CRB.solve() print(CRB)
投资组合的预期收益与波动率计算:
R = returns R_mean = R.mean()*252 #计算年化协方差 R_cov = R.cov()*252 #计算相关系数 R_corr = R.corr() #计算年化标准差 R_std = R.std()*np.sqrt(252) #投资组合的预期年化收益 weights = np.array([0.15,0.2,0.15,0.5]) # R_port = np.sum(weights*R_mean) #向量乘法计算 R_port = np.dot(weights,R_mean) #数组计算 # weights.shape # R_mean.shape vol_port = np.sqrt(np.dot(weights,np.dot(R_cov,weights.T))) print('投资组合的年化预期收益率:',round(R_port,4))
print(‘投资组合的年化收益波动率:‘,round(vol_port,4))
根据趋势交易选出当前可持仓的标的,然后使用风险平价分配权重,计算年化波动率。若波动率大于或小于预设值,则等比例降低风险资产的风险风险预算。比如[1,1,1*w,1*w]后归一化得到风险预算,循环计算,直到符合波动率要求。
一些感悟
人生最重要的几件事:赚钱,健康以及平静的心态。
不好的人或事,其中也许还包含的个人的误会与偏见,只要不触及底线,就随它去吧。与之纠缠,只会徒增烦恼。远离事非,反倒轻松。以静制动,以逸待劳。
要说不被流量裹挟,是很难的事情。
内心依然需要保持清醒,做长期有价值的事情,而不必特别去关心流量、转化,至少一开始是这样。
你若盛开,蝴蝶自来,你若精彩,天自安排。
但行好事,莫问前程!
发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/103919
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!