import vectorbt as vbt
fast_ma = range(10, 50, 5)
slow_ma = range(20, 100, 10)
results = vbt.MA.run_combs(
price_data,
windows=[fast_ma, slow_ma],
param_product=True
)
import vectorbt as vbt
btc_price = vbt.YFData.download('BTC-USD').get('Close')
fast_ma = vbt.MA.run(btc_price, 20)
slow_ma = vbt.MA.run(btc_price, 50)
entries = fast_ma.ma_crossed_above(slow_ma)
exits = fast_ma.ma_crossed_below(slow_ma)
portfolio = vbt.Portfolio.from_signals(
btc_price, entries, exits, freq='1D', fees=0.001
)
print(portfolio.total_profit())
portfolio.trades().plot().show()
import numpy as np
import pandas as pd
import vectorbt as vbt
from datetime import datetime
symbols = ['600519.SS', '000001.SZ', '601318.SS', '600036.SS', '000858.SZ']
end_date = datetime(2025, 12, 31)
price_data = vbt.YFData.download(
symbols, start='2015-01-01', end=end_date
).get('Close')
def calculate_factors(close):
momentum = close.pct_change(252)
pe_ratio = pd.DataFrame(
np.random.uniform(5, 30, size=close.shape),
index=close.index, columns=close.columns
)
value = 1 / pe_ratio
size = np.log(close * np.random.uniform(1e8, 1e10, size=close.shape))
return momentum, value, size
momentum, value, size = calculate_factors(price_data)
def normalize_factor(factor):
return factor.vbt.zscore()
momentum_norm = normalize_factor(momentum)
value_norm = normalize_factor(value)
size_norm = normalize_factor(size)
composite_factor = (momentum_norm + value_norm + size_norm) / 3
def select_top_stocks(factor, n=10):
rebalance_dates = factor.index[factor.index.to_series().diff().dt.days > 1]
positions = pd.DataFrame(0, index=factor.index, columns=factor.columns)
for date in rebalance_dates:
top_stocks = factor.loc[date].nlargest(n).index
positions.loc[date:, top_stocks] = 1
return positions
positions = select_top_stocks(composite_factor, n=10)
portfolio = vbt.Portfolio.from_orders(
close=price_data,
size=positions,
size_type='targetpercent',
init_cash=1e6,
freq='D',
fees=0.001,
slippage=0.002
)
print(portfolio.stats())
fig = portfolio.plot(subplots=['orders', 'trade_pnl', 'cum_returns'])
fig.show()
factor_ic = vbt.returns.accessors.ReturnsAccessor(price_data).factor_ic(
composite_factor.shift(1), forward_returns=True
)
print(f"平均信息系数 (IC): {factor_ic.mean()}")