pys.porfolio_optimization package
Submodules
pys.porfolio_optimization.backtester module
- class pys.porfolio_optimization.backtester.Backtester(input_file=None, portfolio_weights=None, start_date=None, end_date=None, log_level=20, bonds_data_dir=None)
Bases:
BaseLogger- calculate_bonds_returns()
Рассчитывает доходности для облигаций
- calculate_performance_metrics(returns=None, risk_free_rate=0.075)
Рассчитывает метрики эффективности стратегии
- calculate_portfolio_return(weights=None)
Рассчитывает доходность портфеля с заданными весами, включая детализированную безрисковую часть (облигации) и поддержку коротких позиций
- calculate_returns(df=None, signals_col='signal', price_col='close')
Рассчитывает доходность на основе сигналов с учетом коротких позиций
- calculate_returns_by_ticker()
Рассчитывает доходности для каждого тикера отдельно
- load_bonds_data()
Загрузка исторических данных по облигациям
- load_data(input_file=None)
Загрузка данных для бэктестирования акций
- run_pipeline(input_file=None, portfolio_weights=None, start_date=None, end_date=None, output_dir='/Users/aeshef/Desktop/FOR3.9TEST/kursach/data/portfolio/results', risk_free_rate=0.075, bonds_data_dir=None)
Запускает полный пайплайн бэктестирования
- Parameters:
input_file (str, optional) -- Путь к файлу с данными и сигналами
portfolio_weights (dict, optional) -- Словарь с весами активов в портфеле
start_date (str, optional) -- Даты начала и конца бэктеста в формате 'YYYY-MM-DD'
end_date (str, optional) -- Даты начала и конца бэктеста в формате 'YYYY-MM-DD'
output_dir (str, optional) -- Директория для сохранения результатов
risk_free_rate (float) -- Безрисковая ставка для расчета метрик
bonds_data_dir (str, optional) -- Директория с историческими данными по облигациям
- Return type:
dict с результатами бэктеста
- visualize_results(output_dir=None)
Визуализирует результаты бэктеста с поддержкой коротких позиций
pys.porfolio_optimization.executor module
- class pys.porfolio_optimization.executor.PipelineExecutor(base_path, bond_results=None, name=None, strategy_profile='moderate', min_position_weight=0.01, min_rf_allocation=0.3, max_rf_allocation=0.5, risk_free_rate=0.1, max_weight=0.15)
Bases:
BaseLoggerВыполняет и организует финальные этапы пайплайна инвестиционной стратегии.
Класс выполняет: - Генерацию сигналов - Оптимизацию портфелей разных типов (лонг, шорт, комбинированный) - Выбор лучшего портфеля на основе метрик - Создание отчета о запуске
Все результаты сохраняются в отдельной директории для каждого запуска.
- build_production_portfolio(data_file, output_dir, risk_free_rate=0.075, best_params_file=None, include_short_selling=False, verify_with_honest_backtest=True, train_period=('2024-01-01', '2024-12-31'), test_period=('2025-01-01', '2025-06-30'))
Комплексная функция построения и проверки инвестиционного портфеля
Parameters:
- data_filestr
Путь к файлу с данными
- output_dirstr
Директория для сохранения результатов
- risk_free_ratefloat
Безрисковая ставка
- best_params_filestr, optional
Путь к файлу с оптимальными параметрами (из Grid Search)
- include_short_sellingbool
Включать ли короткие позиции в портфель (по умолчанию False)
- verify_with_honest_backtestbool
Проверять ли стратегию с помощью HonestBacktester
- train_period, test_periodtuple
Периоды для проверки с помощью HonestBacktester
Returns:
dict с результатами всех этапов
- copy_bond_portfolio(bond_results=None)
Копирует результаты выбора облигаций.
- Parameters:
bond_results (dict, optional) -- Результаты выполнения run_bond_selection_with_kbd
- Returns:
Путь к скопированному портфелю облигаций
- Return type:
str
- create_combined_portfolio(tickers_list, risk_free_rate=None, min_rf_allocation=None, max_rf_allocation=None, max_weight=None, long_ratio=0.7, include_short_selling=True)
Создает комбинированный портфель с длинными и короткими позициями.
- create_short_portfolio(risk_free_rate=None, train_period=('2024-01-01', '2024-12-31'), test_period=('2025-01-01', '2025-06-30'), best_params_file=None, verify_with_honest_backtest=True)
Создает портфель с короткими позициями.
- Parameters:
risk_free_rate (float, optional) -- Безрисковая ставка
train_period (tuple) -- Периоды для обучения и тестирования
test_period (tuple) -- Периоды для обучения и тестирования
best_params_file (str, optional) -- Путь к файлу с лучшими параметрами
- Returns:
Результаты создания портфеля с короткими позициями
- Return type:
dict
- create_summary_report(include_charts=True, include_metrics=True, include_weights=True, report_format='md')
Создает итоговый отчет о запуске.
- Returns:
Путь к созданному отчету
- Return type:
str
- generate_signals(weight_tech=0.5, weight_sentiment=0.3, weight_fundamental=0.2, threshold_buy=0.5, threshold_sell=-0.5, top_pct=0.3, save_ticker_visualizations=False, tech_indicators=['RSI_14', 'MACD_diff', 'Stoch_%K', 'CCI_20', 'Williams_%R_14', 'ROC_10'], sentiment_indicators=['sentiment_compound_median', 'sentiment_direction', 'sentiment_ma_7d', 'sentiment_ratio', 'sentiment_zscore_7d'], fund_weights=None)
Запускает генерацию сигналов.
- Parameters:
weight_tech (float) -- Вес технических сигналов
weight_sentiment (float) -- Вес сентимент-сигналов
weight_fundamental (float) -- Вес фундаментальных сигналов
- Returns:
Результаты генерации сигналов
- Return type:
dict
- optimize_standard_portfolio(tickers_list, risk_free_rate=None, min_rf_allocation=None, max_rf_allocation=None, max_weight=None, include_short_selling=False)
Запускает оптимизацию стандартного портфеля (только длинные позиции).
- Parameters:
tickers_list (list) -- Список тикеров
risk_free_rate (float, optional) -- Безрисковая ставка
min_rf_allocation (float, optional) -- Минимальная и максимальная доля безрисковых активов
max_rf_allocation (float, optional) -- Минимальная и максимальная доля безрисковых активов
max_weight (float, optional) -- Максимальный вес одного актива
- Returns:
Результаты оптимизации портфеля
- Return type:
dict
- process_bond_pipeline(start_date, end_date, min_bonds=20, max_threshold=99, strategy_profile=None, kbd_yield_adjustment=-3.0, update_kbd_data=True, excluded_issuers=None, n_bonds=5, kbd_data=None, weighting_strategy=None, portfolio_stability=0.7, use_kbd_recommendations=True, override_params=None, kbd_duration_flexibility=1.5, max_adjustment_iterations=3, output_format='all')
Запускает полный цикл обработки облигаций - от парсинга до создания портфеля.
- Parameters:
start_date (str) -- Диапазон дат для анализа
end_date (str) -- Диапазон дат для анализа
min_bonds (int) -- Минимальное количество облигаций в выборке
max_threshold (int) -- Максимальный порог для фильтрации облигаций
strategy_profile (str, optional) -- Профиль стратегии ('aggressive', 'moderate', 'conservative')
kbd_yield_adjustment (float) -- Корректировка доходности КБД
update_kbd_data (bool) -- Флаг обновления данных КБД
excluded_issuers (list, optional) -- Список исключаемых эмитентов
n_bonds (int) -- Количество облигаций для включения в портфель
kbd_data (pandas.DataFrame, optional) -- Предварительно загруженные данные КБД
- Returns:
Результаты обработки облигаций
- Return type:
dict
- run_pipeline(tickers_list, bond_results=None, strategy_profile=None, signal_params=None, standard_portfolio_params=None, short_portfolio_params=None, combined_portfolio_params=None, portfolio_controls=None, backtest_params=None, select_portfolio_params=None, report_params=None, optimization_params=None, visualization_params=None)
Запускает все этапы пайплайна последовательно с полной настройкой параметров.
- Parameters:
tickers_list (list) -- Список тикеров
bond_results (dict, optional) -- Результаты выполнения run_bond_selection_with_kbd
strategy_profile (str, optional) -- Профиль стратегии ('aggressive', 'moderate', 'conservative')
этапов (# Параметры для разных)
signal_params (dict, optional) -- Параметры для генерации сигналов: - weight_tech (float): вес технических сигналов - weight_sentiment (float): вес сентимент-сигналов - weight_fundamental (float): вес фундаментальных сигналов - threshold_buy (float): порог для сигнала покупки - threshold_sell (float): порог для сигнала продажи - top_pct (float): процент лучших акций для shortlist - save_ticker_visualizations (bool): сохранять визуализации по тикерам
standard_portfolio_params (dict, optional) -- Параметры для стандартного портфеля: - risk_free_rate (float): безрисковая ставка - min_rf_allocation (float): минимальная доля безрисковых активов - max_rf_allocation (float): максимальная доля безрисковых активов - max_weight (float): максимальный вес одной позиции - include_short_selling (bool): включать ли короткие позиции
short_portfolio_params (dict, optional) -- Параметры для портфеля с короткими позициями: - risk_free_rate (float): безрисковая ставка - train_period (tuple): период обучения (начало, конец) - test_period (tuple): период тестирования (начало, конец) - best_params_file (str): путь к файлу с лучшими параметрами - verify_with_honest_backtest (bool): проверять с честным бэктестом
combined_portfolio_params (dict, optional) -- Параметры для комбинированного портфеля: - risk_free_rate (float): безрисковая ставка - min_rf_allocation (float): минимальная доля безрисковых активов - max_rf_allocation (float): максимальная доля безрисковых активов - max_weight (float): максимальный вес одной позиции - long_ratio (float): соотношение длинных/коротких позиций - include_short_selling (bool): включать ли короткие позиции
portfolio_controls (dict, optional) -- Контроль запуска различных портфелей: - run_standard_portfolio (bool): запускать стандартный портфель - run_short_portfolio (bool): запускать портфель с короткими позициями - run_combined_portfolio (bool): запускать комбинированный портфель - override_risk_profile (bool): игнорировать профиль риска
backtest_params (dict, optional) -- Параметры для бэктестирования: - train_period (tuple): период обучения (начало, конец) - test_period (tuple): период тестирования (начало, конец) - risk_free_rate (float): безрисковая ставка - use_grid_search_params (bool): использовать параметры из Grid Search
select_portfolio_params (dict, optional) -- Параметры для выбора лучшего портфеля: - metrics_priority (list): приоритет метрик ['sharpe', 'return', 'volatility'] - min_sharpe (float): минимальный допустимый коэффициент Шарпа - prefer_standard (bool): предпочитать стандартный портфель - force_portfolio_type (str): принудительно выбрать тип портфеля
report_params (dict, optional) -- Параметры для создания отчета: - include_charts (bool): включать графики в отчет - include_metrics (bool): включать метрики в отчет - include_weights (bool): включать веса в отчет - report_format (str): формат отчета ('md', 'html')
optimization_params (dict, optional) -- Параметры оптимизации портфеля: - optimization (str): модель оптимизации ('markowitz', 'black_litterman') - tau (float): параметр неуверенности для Black-Litterman - views (dict): субъективные прогнозы - view_confidences (dict): уверенность в прогнозах - market_caps (dict): рыночные капитализации
visualization_params (dict, optional) -- Параметры визуализации: - plot_style (str): стиль графиков ('seaborn', 'ggplot', etc.) - chart_size (tuple): размер графиков в дюймах - dpi (int): разрешение графиков - color_scheme (str): цветовая схема - save_formats (list): форматы сохранения графиков ['png', 'svg', 'pdf']
Returns
--------
dict -- Результаты выполнения всех этапов пайплайна
- select_best_portfolio(metrics_priority=None, min_sharpe=0, prefer_standard=False, force_portfolio_type=None)
Выбирает лучший портфель на основе метрик и стратегии риска. Копирует выбранный портфель в директорию final_portfolio.
- Parameters:
metrics_priority (list, optional) -- Приоритет метрик для выбора ['sharpe', 'return', 'volatility']
min_sharpe (float, optional) -- Минимальный допустимый коэффициент Шарпа
prefer_standard (bool, optional) -- Предпочитать ли стандартный портфель при прочих равных
force_portfolio_type (str, optional) -- Принудительно выбрать тип портфеля ('standard', 'short', 'combined')
- Returns:
Информация о выбранном лучшем портфеле
- Return type:
dict
pys.porfolio_optimization.portfolio_optimizer module
- class pys.porfolio_optimization.portfolio_optimizer.PortfolioOptimizer(input_file=None, max_weight=0.2, risk_free_rate=0.06, min_rf_allocation=0.25, max_rf_allocation=0.35, optimization='markowitz', tau=0.05, views=None, view_confidences=None, market_caps=None, log_level=20, risk_free_portfolio_file=None, include_short_selling=False)
Bases:
BaseLogger- calculate_final_portfolio(rf_allocation=None)
Рассчитывает итоговый портфель с учетом безрисковой части
- calculate_implied_returns()
Рассчитывает равновесные доходности на основе CAPM для модели Блэка-Литермана
- calculate_market_weights()
Рассчитывает рыночные веса на основе капитализации для модели Блэка-Литермана
- calculate_portfolio_performance(weights, returns=None)
Рассчитывает доходность и риск портфеля
- generate_efficient_frontier(num_portfolios=1000)
Генерирует множество случайных портфелей и находит эффективную границу
- Parameters:
num_portfolios (int) -- Количество случайных портфелей для генерации
- Returns:
Словарь с данными о случайных портфелях и эффективной границе
- Return type:
dict
- incorporate_views()
Включает субъективные прогнозы в модель Блэка-Литермана
- load_data(input_file=None, df=None)
Загрузка данных для оптимизации
- load_market_caps()
Загружает реальные данные о рыночной капитализации для тикеров из {BASE_PATH}/data/processed_data/{ticker}/market_cap/cap.csv
- load_risk_free_portfolio()
Загружает данные о портфеле облигаций для безрисковой части
- negative_sharpe_ratio(weights, returns, risk_free_rate)
Отрицательный коэффициент Шарпа (для минимизации)
- optimize_portfolio(returns=None, risk_free_rate=None, constrained=True, bounds=None)
Оптимизирует портфель, максимизируя коэффициент Шарпа
- plot_efficient_frontier(frontier_data=None, output_dir=None)
Визуализирует эффективную границу и множество портфелей
Parameters:
- frontier_datadict, optional
Данные эффективной границы (если None, будут сгенерированы)
- output_dirstr, optional
Директория для сохранения результатов
- plot_enhanced_efficient_frontier(frontier_data=None, output_dir=None)
Создает улучшенную визуализацию эффективной границы и оптимальных портфелей с выделением границы эффективных портфелей и точки касания с CML
Parameters:
- frontier_datadict, optional
Данные эффективной границы (если None, будут сгенерированы)
- output_dirstr, optional
Директория для сохранения результатов
- prepare_returns()
Выбирает метод подготовки доходностей в зависимости от флага
- prepare_returns_standard()
Подготовка доходностей для оптимизации
- prepare_returns_with_shorts()
Подготовка доходностей с учетом коротких позиций
- prepare_views_from_signals()
Подготавливает прогнозы (views) и уверенность в них на основе сигналов
- run_pipeline(input_file=None, output_dir='/Users/aeshef/Desktop/FOR3.9TEST/kursach/data', risk_free_rate=None, min_rf_allocation=None, max_rf_allocation=None, max_weight=None, views=None, view_confidences=None, optimization=None)
Запускает полный пайплайн оптимизации портфеля
- Parameters:
input_file (str, optional) -- Путь к файлу с данными
output_dir (str, optional) -- Директория для сохранения результатов
risk_free_rate (float, optional) -- Безрисковая ставка
min_rf_allocation (float, optional) -- Минимальная доля безрисковых активов
max_rf_allocation (float, optional) -- Максимальная доля безрисковых активов
max_weight (float, optional) -- Максимальный вес одной бумаги в портфеле (для диверсификации)
views (dict or list, optional) -- Субъективные прогнозы для модели Блэка-Литермана
view_confidences (dict or list, optional) -- Уверенность в прогнозах для модели Блэка-Литермана
optimization (str, optional) -- Модель оптимизации: 'markowitz' или 'black_litterman'
- Returns:
Словарь с результатами оптимизации
- Return type:
dict
- visualize_portfolio(output_dir=None)
Визуализирует итоговый портфель с помощью круговой диаграммы и эффективной границы
- pys.porfolio_optimization.portfolio_optimizer.run_all_optimization_models(base_path, tickers_list, risk_free_rate=0.1, min_rf_allocation=0.3, max_rf_allocation=0.5, max_weight=0.15, input_file=None, risk_free_portfolio_file='/Users/aeshef/Documents/GitHub/kursach/data/processed_data/BONDS/kbd/portfolios/bond_portfolio_20250426.csv', include_short_selling=False)
Запускает последовательно все модели оптимизации портфеля
- Parameters:
base_path (str) -- Базовый путь проекта
tickers_list (list) -- Список тикеров для анализа
risk_free_rate (float) -- Безрисковая ставка
min_rf_allocation (float) -- Минимальная доля безрисковых активов
max_rf_allocation (float) -- Максимальная доля безрисковых активов
max_weight (float) -- Максимальный вес одной бумаги в портфеле
input_file (str, optional) -- Путь к файлу с сигналами (если None, используется стандартный путь)
risk_free_portfolio_file (str, optional) -- Путь к файлу с оптимальным портфелем облигаций
- Returns:
Словарь с результатами оптимизации для обеих моделей
- Return type:
dict
pys.porfolio_optimization.signal_generator module
- class pys.porfolio_optimization.signal_generator.SignalGenerator(input_file=None, weight_tech=0.4, weight_sentiment=0.3, weight_fundamental=0.3, threshold_buy=0.5, threshold_sell=-0.5, log_level=20)
Bases:
BaseLogger- calculate_composite_score(tech_indicators, sentiment_indicators, fund_weights)
Рассчитывает композитный скор с учетом фундаментальных данных
- calculate_indicator_score(indicator, value, quantiles, year)
Рассчитывает скор для отдельного фундаментального показателя с учетом NO_DATA
- calculate_quantiles(fund_data)
Рассчитывает квантили для каждого показателя, учитывая только реальные данные
- calculate_ticker_fundamental_score(ticker, year, fund_data, quantiles, fund_weights)
Рассчитывает общий фундаментальный скор для тикера за определенный год
- create_shortlist(top_pct=0.3)
Создает shortlist из топовых акций по композитному скору
- generate_signals()
Генерирует торговые сигналы на основе композитного скора
- load_data(input_file=None)
Загрузка данных для анализа
- load_fundamental_data(base_path='/Users/aeshef/Desktop/FOR3.9TEST/kursach/data/processed_data')
Загружает фундаментальные данные для всех тикеров с обработкой NO_DATA
- run_pipeline(input_file=None, output_file=None, top_pct=0.3, output_dir='/Users/aeshef/Desktop/FOR3.9TEST/kursach/data/signal_visualizations', save_ticker_visualizations=False, tech_indicators=['RSI_14', 'MACD_diff', 'Stoch_%K', 'CCI_20', 'Williams_%R_14', 'ROC_10'], sentiment_indicators=['sentiment_compound_median', 'sentiment_direction', 'sentiment_ma_7d', 'sentiment_ratio', 'sentiment_zscore_7d'], fund_weights=None)
Запускает полный пайплайн генерации сигналов с сохранением результатов в структурированном виде
Parameters:
- input_filestr, optional
Путь к CSV файлу с данными
- output_filestr, optional
Путь для сохранения результатов
- top_pctfloat
Процент лучших акций для включения в shortlist
- output_dirstr
Директория для сохранения визуализаций и результатов
Returns:
DataFrame с добавленными скорами и сигналами
- save_shortlist(output_dir)
Сохраняет шортлист акций в CSV-файл
- visualize_composite_scores(output_dir=None, save_to_ticker_dirs=True)
Визуализирует графики композитных скоров для каждого тикера
Parameters:
- output_dirstr, optional
Директория для сохранения визуализаций (если None, то в директории тикеров)
- save_to_ticker_dirsbool
Сохранять ли визуализации в директории тикеров
- pys.porfolio_optimization.signal_generator.run_pipeline_signal_generator(weight_tech=0.5, weight_sentiment=0.3, weight_fundamental=0.2, output_dir='/Users/aeshef/Desktop/FOR3.9TEST/kursach/data/signal_visualizations', save_ticker_visualizations=False, tech_indicators=['RSI_14', 'MACD_diff', 'Stoch_%K', 'CCI_20', 'Williams_%R_14', 'ROC_10'], sentiment_indicators=['sentiment_compound_median', 'sentiment_direction', 'sentiment_ma_7d', 'sentiment_ratio', 'sentiment_zscore_7d'], fund_weights=None)