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

Сохранять ли визуализации в директории тикеров

visualize_signals(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)

Module contents