原创内容第957篇,专注量化投资,AGI和智能体落地、个人成长与财富自由。今天我们继续来聊聊,这个年化10%是不是比较容易获得。大类资产配置里,风险平价是一个有效的组合方式。下面我们用backtrader来实现一下。import backtrader as bt
import ffn
import pandas as pd
import 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%+的策略,每周五迭代一次,代码和数据在星球全部开源。
点击 “查看原文”,直接访问策略集合。