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:
2322pip 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
294120We welcome contributions! Please see our [ contributing guidelines] ( CONTRIBUTING.md ) for more details.
295121
122+
296123## License
297124
298125This 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