昨天我們介紹了多資產的配置投資,但是面上有這麼多標的我該投資那一些呢 ? 今天,我們將學習因子投資的概念,並探索如何使用不同的因子來進行投資策略的構建與優化。因子投資是一種基於特定因素(因子)的系統化投資方法,能夠有效地幫助投資者在複雜的市場環境中找到超額收益的來源。今日 Colab
因子投資是一種基於資產的特定特徵或驅動因素(因子)來構建投資組合的方法。這些因子通常代表資產的某些特徵,如估值、成長、質量、動量、規模等,這些特徵會對資產的未來表現產生影響。
(P/E)
、市淨率(P/B)
等。低估值資產通常被認為具有較高的投資潛力。我們將以一個簡單的多因子投資策略為例,使用估值因子與動量因子來構建投資組合。
我們將使用 yfinance
獲取股票的歷史數據,並計算兩個因子(估值和動量)來構建投資組合。
import yfinance as yf
import pandas as pd
# 下載多個股票的歷史數據
symbols = ['AAPL', 'MSFT', 'GOOGL', 'AMZN', 'Meta']
data = yf.download(symbols, start='2019-01-01', end='2021-01-01')['Adj Close']
# 計算估值因子(以P/E Ratio為例,這裡我們用股價近似代替)
valuation_factor = data.tail(1).T # 最新一天的價格,作為估值的代表
# 計算動量因子(過去6個月的回報率)
momentum_factor = data.pct_change(periods=126).tail(1).T # 126天約為6個月
將不同因子進行標準化,然後對股票進行打分,並選擇打分最高的資產進行投資。
# 因子標準化
# 計算估值因子(以P/E Ratio為例,這裡我們用股價近似代替)
valuation_factor = data.tail(1).T # 最新一天的價格,作為估值的代表
# 計算動量因子(過去6個月的回報率)
momentum_factor = data.pct_change(periods=126).tail(1).T # 126天約為6個月
# 因子標準化
valuation_factor = (valuation_factor - valuation_factor.mean()) / valuation_factor.std()
momentum_factor = (momentum_factor - momentum_factor.mean()) / momentum_factor.std()
# 綜合因子得分(權重可自行調整,這裡我們取相等權重)
factor_scores = 0.5 * valuation_factor + 0.5 * momentum_factor
# 將 DataFrame 轉換為 Series,並以 index(股票符號)作為索引
factor_scores = factor_scores.squeeze() # 將單列 DataFrame 轉換為 Series
# 根據綜合得分進行排序
factor_scores = factor_scores.sort_values(ascending=False)
我們選擇因子得分最高的2只股票構建投資組合。
# 選擇得分最高的2只股票
top_stocks = factor_scores.index[:2]
print("選擇的投資組合:", top_stocks)
我們將使用 Backtrader
進行簡單的回測,以測試因子投資組合的表現。
import backtrader as bt
class FactorInvestmentStrategy(bt.Strategy):
def __init__(self):
self.size = 0 # 用於保存持倉量
self.top_stocks = top_stocks # 使用之前選定的投資組合
def next(self):
if not self.position:
cash = self.broker.getcash()
per_stock_cash = cash / len(self.top_stocks)
for data in self.datas:
if data._name in self.top_stocks:
size = int(per_stock_cash / data.close[0])
self.buy(data=data, size=size)
cerebro = bt.Cerebro()
# 添加策略
cerebro.addstrategy(FactorInvestmentStrategy)
# 添加選定股票的數據
for symbol in top_stocks:
data_feed = bt.feeds.PandasData(dataname=yf.download(symbol, start="2019-01-01", end="2021-01-01"))
cerebro.adddata(data_feed, name=symbol)
# 設定初始資金
cerebro.broker.setcash(100000.0)
# 添加分析工具
cerebro.addanalyzer(btanalyzers.SharpeRatio, _name="sharpe", timeframe=bt.TimeFrame.Days, annualize=True)
cerebro.addanalyzer(btanalyzers.DrawDown, _name="drawdown")
cerebro.addanalyzer(btanalyzers.Returns, _name="returns")
# 執行回測
result = cerebro.run()
strategy = result[0]
# 提取分析結果
sharpe_ratio = strategy.analyzers.sharpe.get_analysis().get('sharperatio', None)
max_drawdown = strategy.analyzers.drawdown.get_analysis().get('max', {}).get('drawdown', None)
total_return = strategy.analyzers.returns.get_analysis().get('rnorm100', None)
# 打印分析結果
print(f"夏普比率: {sharpe_ratio:.2f}" if sharpe_ratio is not None else "夏普比率: 無法計算")
print(f"最大回撤: {max_drawdown:.2f}%")
print(f"總收益: {total_return:.2f}%")
# 執行回測
cerebro.run()
#cerebro.plot(iplot=False)
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['figure.figsize'] = [15, 12]
plt.rcParams.update({'font.size': 12})
img = cerebro.plot(iplot = False)
img[0][0].savefig('backtrader_factor.png')
可以得到以下夏普等值:
以及圖表:
因子投資是一種非常強大的投資策略,能夠幫助投資者系統化地構建投資組合,並有效地實現風險調整後的收益。
今日作業:
Backtrader
回測你的多因子策略,並比較不同因子組合的表現。透過這些練習,你將能夠更好地掌握因子投資的方法,並學會如何將這些概念應用到真實的投資中。