原创内容第957篇,专注量化投资,AGI和智能体落地、个人成长与财富自由。今天我们继续来聊聊,这个年化10%是不是比较容易获得。大类资产配置里,风险平价是一个有效的组合方式。下面我们用backtrader来实现一下。import backtrader as btimport ffnimport pandas as pdimport numpy as np
class RiskParityStrategy(bt.Strategy): params = ( ('lookback', 60), ('rebalance_freq', 22), ('covar_method', 'ledoit-wolf'), ('max_iter', 100), ('tol', 1e-08) )
def notify_order(self, order): """订单状态通知""" if order.status in [order.Submitted, order.Accepted]: return
if order.status in [order.Completed]: if order.isbuy(): self.buy_price = order.executed.price self.buy_date = self.datas[0].datetime.date(0) elif order.issell(): profit = order.executed.value - order.created.value
elif order.status in [order.Canceled, order.Margin, order.Rejected]: self.log(f"订单取消/保证金不足/拒绝")
self.order = None
def log(self, txt, dt=None, doprint=True): """日志记录函数""" if doprint: dt = dt or self.datas[0].datetime.date(0) print(f"{dt.isoformat()}, {txt}")
def __init__(self): self.day_counter = 0 self.assets = self.datas[0:] self.initial_weights = np.ones(len(self.assets)) / len(self.assets) self.last_month = -1
def next(self): self.day_counter += 1
current_date = self.datetime.date(0) current_month = current_date.month
if current_month != self.last_month: self.last_month = current_month
returns = self._prepare_returns() if returns is None: return
weights = self._calculate_erc_weights(returns)
self._rebalance_portfolio(weights)
def _prepare_returns(self): """收集历史数据并计算收益率""" prices = [] valid_length = True
for i, data in enumerate(self.assets): if len(data) < self.params.lookback + 1: valid_length = False break prices.append(data.close.get(size=self.params.lookback + 1))
if not valid_length: return None
price_df = pd.DataFrame(np.array(prices).T) returns = price_df.pct_change().dropna() return returns
def _calculate_erc_weights(self, returns_df): """调用ffn计算ERC权重""" try: if not isinstance(returns_df, pd.DataFrame): returns_df = pd.DataFrame(returns_df)
weights = ffn.core.calc_erc_weights( returns=returns_df, initial_weights=None, covar_method=self.params.covar_method, risk_parity_method='ccd', maximum_iterations=self.params.max_iter, tolerance=self.params.tol ) return weights.values*0.995 except Exception as e: print(f"计算ERC权重失败: {e}") return self.initial_weights
def _rebalance_portfolio(self, weights): """根据新权重调整仓位""" total_value = self.broker.getvalue()
to_buy = {} for i, data in enumerate(self.assets): target_value = total_value * weights[i]
current_value = self.getposition(data).size * data.close[0]
size_diff = (target_value - current_value) / data.close[0]
if size_diff > 0: to_buy[data]=size_diff
elif size_diff 0: self.sell(data=data, size=abs(size_diff))
for data,size in to_buy.items(): self.buy(data=data, size=size)
系统就是每天都会做的事情,持续去做,这里其实是建立一个复利效应的系统。你也许不知道何时能成,这里有运气的成分。但日积月累,从量变到质变。但如果要与收益产生联系,你需要建立一个“输出型”爱好。就是做生产者,阅读是消费者,你把读后感写出来,对一些人有用,这就是生产者,日积月累,你就在某一个领域有了自己的影响力。本质也是生产一个用户需要的产品,只不过,这个产品的研发过程,可能需要大量的人和资本,这时候,需要以公司化的方式去运作,甚至需要大资金的支持。现在很多人开始“觉醒”,未必需要依靠一个特定的组织去创造收益。代码和数据下载:AI量化实验室——2025量化投资的星辰大海AI量化实验室 星球,已经运行三年多,1700+会员。
aitrader代码,因子表达式引擎、遗传算法(Deap)因子挖掘引擎等,支持vnpy,qlib,backtrader和bt引擎,内置多个年化30%+的策略,每周五迭代一次,代码和数据在星球全部开源。
点击 “查看原文”,直接访问策略集合。