Skip to content

Commit 5cb2dbd

Browse files
committed
preparing next major version
1 parent af33eb6 commit 5cb2dbd

File tree

93 files changed

+658
-5417
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

93 files changed

+658
-5417
lines changed

README.md

Lines changed: 68 additions & 237 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,12 @@
77

88
![PyPI - Version](https://img.shields.io/pypi/v/deepfolio)
99
[![License](https://img.shields.io/badge/License-BSD_2--Clause-orange.svg)](https://opensource.org/licenses/BSD-2-Clause)
10-
![Python versions](https://img.shields.io/badge/python-3.12%2B-green)
10+
![Python versions](https://img.shields.io/badge/python-3.6%2B-green)
1111
![PyPI downloads](https://img.shields.io/pypi/dm/deepfolio)
1212
[![Keras](https://img.shields.io/badge/Keras-3.x-red)](https://keras.io/)
13-
1413
</div>
1514

16-
**DeepFolio** is a Python library for portfolio optimization built on top of Keras 3 and TensorFlow 2. It offers a unified interface and tools compatible with Keras to build, fine-tune, and cross-validate portfolio models.
15+
**DeepFolio** is a Python library for portfolio optimization built on top of Google's TensorFlow platform. It combines traditional optimization techniques with deep learning approaches to provide a powerful toolkit for investment professionals and researchers.
1716

1817
## Installation
1918

@@ -23,281 +22,113 @@ Install the package using pip:
2322
pip install deepfolio
2423
```
2524

26-
## Quick Start
25+
## Features
26+
27+
- Differentiable portfolio optimization
28+
- Real-time optimization
29+
- Multi-asset class support
30+
- Backtesting system
31+
- Risk management tools
32+
- Factor model integration
33+
- Automated hyperparameter tuning
34+
- Trade execution simulation
35+
- Event-driven rebalancing
36+
- Comprehensive reporting
37+
- Sentiment analysis integration
38+
- Tax-aware optimization
39+
- Interactive visualization dashboard
2740

28-
Here's a simple example to get you started with deepfolio:
41+
## Installation
42+
43+
```bash
44+
pip install deepfolio
45+
```
46+
47+
## Quick Start
2948

3049
```python
31-
import numpy as np
32-
from deepfolio.models import MeanRisk
33-
from deepfolio.estimators import EmpiricalReturnsEstimator
34-
from deepfolio.risk_measures import Variance
50+
from deepfolio import DiffOptPortfolio, CustomOptimizer, Backtester
3551

36-
# Generate sample data
37-
returns = np.random.randn(100, 10) # 100 time steps, 10 assets
52+
# Initialize the model
53+
model = DiffOptPortfolio(input_dim=50, n_assets=10, hidden_dim=64)
3854

39-
# Initialize estimators and risk measure
40-
returns_estimator = EmpiricalReturnsEstimator()
41-
risk_measure = Variance()
55+
# Create an optimizer
56+
optimizer = CustomOptimizer(model.parameters())
4257

43-
# Create and fit the model
44-
model = MeanRisk(returns_estimator=returns_estimator, risk_measure=risk_measure)
45-
model.fit(returns)
58+
# Load your data
59+
features, returns = load_your_data()
4660

47-
# Get optimal weights
48-
optimal_weights = model.predict(returns)
49-
print("Optimal portfolio weights:", optimal_weights)
50-
```
61+
# Create a backtester
62+
backtester = Backtester(model, {'features': features, 'returns': returns})
5163

64+
# Run backtesting
65+
backtester.run()
5266

53-
## Available Models and Features
67+
# Get results
68+
results = backtester.get_results()
69+
print(f"Sharpe Ratio: {results['sharpe_ratio']}")
70+
print(f"Max Drawdown: {results['max_drawdown']}")
71+
```
5472

55-
### Automated Trading
73+
## Advanced Usage
5674

57-
DeepFolio now supports automated trading through integration with the Alpaca API. This feature allows users to:
75+
### Real-time Optimization
5876

59-
Place Trades: Automatically place buy/sell orders based on portfolio optimization results.
60-
Execution Logic: Execute trades with customizable order parameters.
61-
Example usage:
6277
```python
63-
from deepfolio.models.automated_trading import AutomatedTrading
78+
from deepfolio import RealtimeOptimizer, DataSource
6479

65-
api_key = 'APCA-API-KEY-ID'
66-
secret_key = 'APCA-API-SECRET-KEY'
67-
base_url = 'https://paper-api.alpaca.markets'
68-
69-
trader = AutomatedTrading(api_key, secret_key, base_url)
70-
trader.place_trade('AAPL', 10, 'buy')
80+
data_source = DataSource(api_key="your_api_key")
81+
optimizer = RealtimeOptimizer(model, data_source)
82+
optimizer.start()
7183
```
7284

73-
### Real-Time Data Integration
74-
DeepFolio now includes real-time data integration using WebSocket. This feature enables:
75-
76-
Real-Time Market Data: Receive and process streaming market data for dynamic portfolio adjustments.
77-
Data Feeds: Integration with IEX Cloud for real-time data streaming.
78-
Example usage:
85+
### Multi-Asset Optimization
7986

8087
```python
81-
from deepfolio.data.real_time_data import RealTimeData
82-
83-
socket_url = "wss://cloud-sse.iexapis.com/stable/stocksUSNoUTP?token=YOUR_IEX_CLOUD_TOKEN"
84-
real_time_data = RealTimeData(socket_url)
85-
real_time_data.run()
88+
from deepfolio import MultiAssetDiffOptPortfolio
8689

90+
asset_classes = ['stocks', 'bonds', 'commodities']
91+
input_dims = {'stocks': 50, 'bonds': 30, 'commodities': 20}
92+
hidden_dims = {'stocks': 64, 'bonds': 32, 'commodities': 32}
93+
model = MultiAssetDiffOptPortfolio(asset_classes, input_dims, hidden_dims)
8794
```
8895

89-
### Portfolio Optimization
90-
- Naive: Equal-Weighted, Random (Dirichlet)
91-
- Convex: Mean-Risk, Distributionally Robust CVaR
92-
- Clustering: Hierarchical Risk Parity, Hierarchical Equal Risk Contribution, Nested Clusters Optimization
93-
94-
### Expected Returns Estimator
95-
- Empirical
96-
- Equilibrium
97-
- Shrinkage
98-
99-
### Distance Estimator
100-
- Pearson Distance
101-
- Kendall Distance
102-
- Variation of Information
103-
104-
### Pre-Selection Transformer
105-
- Non-Dominated Selection
106-
- Select K Extremes (Best or Worst)
107-
- Drop Highly Correlated Assets
108-
109-
### Risk Measures
110-
- Variance
111-
- Semi-Variance
112-
- Mean Absolute Deviation
113-
- Skew
114-
- Kurtosis
115-
116-
### Cross-Validation and Model Selection
117-
- Walk Forward
118-
- Combinatorial Purged Cross-Validation
119-
120-
### Optimization Features
121-
- Minimize Risk
122-
- Transaction Costs
123-
- L1 and L2 Regularization
124-
- Weight Constraints
125-
- Tracking Error Constraints
126-
- Turnover Constraints
127-
128-
### Deep Learning Models
129-
- Transformer
130-
- RNN
131-
132-
## Examples
133-
134-
### Using Hierarchical Risk Parity
96+
### Tax-Aware Optimization
13597

13698
```python
137-
from deepfolio.models import HierarchicalRiskParity
138-
from deepfolio.estimators import EmpiricalReturnsEstimator
139-
from deepfolio.distance import PearsonDistance
140-
141-
returns = np.random.randn(200, 20) # 200 time steps, 20 assets
142-
143-
model = HierarchicalRiskParity(
144-
returns_estimator=EmpiricalReturnsEstimator(),
145-
distance_estimator=PearsonDistance()
146-
)
147-
model.fit(returns)
148-
weights = model.predict(returns)
149-
print("HRP portfolio weights:", weights)
150-
```
99+
from deepfolio import TaxOptimizer
151100

152-
### Optimization with Transformer
153-
```python
154-
from deepfolio.models.transformer import Transformer
155-
import pandas as pd
156-
from sklearn.model_selection import train_test_split
157-
from sklearn.preprocessing import MinMaxScaler
158-
import yfinance as yf
159-
import tensorflow as tf
160-
import numpy as np
161-
import matplotlib.pyplot as plt
162-
163-
# Set random seeds for reproducibility
164-
tf.random.set_seed(42)
165-
np.random.seed(42)
166-
167-
# Model parameters
168-
n_feature = 5 # Number of features per asset
169-
n_assets = 10 # Number of assets
170-
n_timestep = 30 # Number of time steps
171-
n_layer = 3 # Number of Transformer layers
172-
n_head = 8 # Number of attention heads
173-
n_hidden = 64 # Number of hidden units
174-
n_dropout = 0.1 # Dropout rate
175-
batch_size = 32
176-
epochs = 50
177-
lb = 0.0 # Lower bound for asset weights
178-
ub = 1.0 # Upper bound for asset weights
179-
180-
def get_stock_data(tickers, start_date, end_date):
181-
data = yf.download(tickers, start=start_date, end=end_date)
182-
return data['Adj Close']
183-
184-
# Get the first 10 stocks of S&P 500 as an example
185-
sp500 = pd.read_html('https://en.wikipedia.org/wiki/List_of_S%26P_500_companies')[0]
186-
tickers = sp500['Symbol'].tolist()[:n_assets]
187-
188-
# Download stock data
189-
stock_data = get_stock_data(tickers, '2010-01-01', '2023-01-01')
190-
191-
# Calculate daily returns
192-
returns = stock_data.pct_change().dropna()
193-
194-
def calculate_features(returns):
195-
features = pd.DataFrame()
196-
for ticker in returns.columns:
197-
# Calculate 5-day, 10-day, and 20-day moving averages
198-
features[f'{ticker}_MA5'] = returns[ticker].rolling(window=5).mean()
199-
features[f'{ticker}_MA10'] = returns[ticker].rolling(window=10).mean()
200-
features[f'{ticker}_MA20'] = returns[ticker].rolling(window=20).mean()
201-
# Calculate 5-day, 10-day, and 20-day volatility
202-
features[f'{ticker}_VOL5'] = returns[ticker].rolling(window=5).std()
203-
features[f'{ticker}_VOL10'] = returns[ticker].rolling(window=10).std()
204-
features[f'{ticker}_VOL20'] = returns[ticker].rolling(window=20).std()
205-
return features.dropna()
206-
207-
features = calculate_features(returns)
208-
209-
# Prepare input data
210-
scaler = MinMaxScaler()
211-
scaled_features = scaler.fit_transform(features)
212-
213-
X = []
214-
y = []
215-
for i in range(len(scaled_features) - n_timestep):
216-
X.append(scaled_features[i:i+n_timestep])
217-
y.append(returns.iloc[i+n_timestep].values)
218-
219-
X = np.array(X)
220-
y = np.array(y)
221-
222-
# Split into training and test sets
223-
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
224-
225-
# Custom loss function: negative Sharpe ratio
226-
def negative_sharpe_ratio(y_true, y_pred):
227-
returns = tf.reduce_sum(y_true * y_pred, axis=1)
228-
expected_return = tf.reduce_mean(returns)
229-
stddev = tf.math.reduce_std(returns)
230-
return -expected_return / (stddev + 1e-6) # Add small value to avoid division by zero
231-
232-
# Create and compile the model
233-
model = Transformer(n_feature * n_assets, n_timestep, n_layer, n_head, n_hidden, n_dropout, n_assets, lb, ub)
234-
model.compile(optimizer='adam', loss=negative_sharpe_ratio)
235-
236-
# Train the model
237-
history = model.fit(X_train, y_train, epochs=epochs, batch_size=batch_size, validation_split=0.2)
238-
239-
# Evaluate the model
240-
test_loss = model.evaluate(X_test, y_test)
241-
print(f"Test loss: {test_loss}")
242-
243-
# Make predictions using the model
244-
predictions = model.predict(X_test)
245-
246-
# Calculate Sharpe ratio on the test set
247-
test_returns = np.sum(y_test * predictions, axis=1)
248-
sharpe_ratio = np.mean(test_returns) / np.std(test_returns)
249-
print(f"Sharpe Ratio on test set: {sharpe_ratio}")
250-
251-
# Visualize results
252-
plt.figure(figsize=(10, 5))
253-
plt.plot(history.history['loss'], label='Training Loss')
254-
plt.plot(history.history['val_loss'], label='Validation Loss')
255-
plt.title('Model Loss')
256-
plt.xlabel('Epoch')
257-
plt.ylabel('Loss')
258-
plt.legend()
259-
plt.show()
260-
261-
# Visualize asset allocation for the last time step
262-
plt.figure(figsize=(10, 5))
263-
plt.bar(tickers, predictions[-1])
264-
plt.title('Asset Allocation for Last Time Step')
265-
plt.xlabel('Assets')
266-
plt.ylabel('Weight')
267-
plt.xticks(rotation=45)
268-
plt.show()
101+
tax_optimizer = TaxOptimizer()
102+
optimal_trades = tax_optimizer.optimize(current_portfolio, target_weights, prices, cost_basis, holding_period)
269103
```
270104

271-
### Cross-Validation
105+
### Interactive Dashboard
272106

273107
```python
274-
from deepfolio.cross_validation import WalkForward
275-
from deepfolio.models import MeanRisk
276-
from deepfolio.risk_measures import SemiVariance
277-
278-
cv = WalkForward(n_splits=5, test_size=20)
279-
model = MeanRisk(risk_measure=SemiVariance())
280-
281-
for train_index, test_index in cv.split(returns):
282-
train_returns, test_returns = returns[train_index], returns[test_index]
283-
model.fit(train_returns)
284-
weights = model.predict(test_returns)
285-
# Evaluate performance...
108+
from deepfolio import PortfolioDashboard
109+
110+
dashboard = PortfolioDashboard(portfolio_data, benchmark_data)
111+
dashboard.run()
286112
```
287113

288114
## Documentation
289115

290-
For full documentation, please visit our [documentation site](https://deepfolio.readthedocs.io/).
116+
For detailed documentation, please visit our [documentation site](https://diffopt-portfolio.readthedocs.io).
291117

292118
## Contributing
293119

294120
We welcome contributions! Please see our [contributing guidelines](CONTRIBUTING.md) for more details.
295121

122+
296123
## License
297124

298125
This project is licensed under the BSD-2-Clause License- see the [LICENSE](LICENSE) file for details.
299126

300127
## Acknowledgments
301128

302-
- This package leverages the power of Keras 3 for efficient portfolio optimization.
129+
- This package leverages the power of TensorFlow for efficient portfolio optimization.
303130
- Thanks to the financial machine learning community for inspiring many of the implemented methods.
131+
132+
133+
134+

0 commit comments

Comments
 (0)