Создание продвинутого инструмента для анализа портфеля и рыночной аналитики с помощью OpenBB

В этом руководстве мы подробно рассмотрим расширенные возможности OpenBB для проведения комплексного анализа портфеля и рыночной аналитики. Мы начнём с создания технологического портфеля, получения исторических рыночных данных и вычисления ключевых показателей эффективности. Затем мы рассмотрим расширенные технические индикаторы, производительность на уровне секторов, рыночные настроения и корреляционный анализ рисков.

1. Создание и анализ технологического портфеля

Мы начнём с установки и импорта OpenBB вместе с необходимыми библиотеками Python для анализа данных и визуализации. Мы настроим нашу среду для подавления предупреждений, установим параметры отображения для pandas и подготовимся к проведению расширенного финансового анализа.

“`python
import warnings
warnings.filterwarnings(‘ignore’)

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import datetime, timedelta
import openbb

from openbb import obb

pd.setoption(‘display.maxcolumns’, None)
pd.set_option(‘display.width’, 1000)

print(“Advanced OpenBB Financial Analysis Tutorial”)
print(“=” * 60)
“`

2. Анализ производительности портфеля

Мы вычислим нормализованные веса и ежедневные доходы, затем оценим производительность, годовой доход, волатильность, коэффициент Шарпа, максимальную просадку и рассмотрим статистику по акциям в режиме реального времени.

“`python
tech_stocks = [‘AAPL’, ‘GOOGL’, ‘MSFT’, ‘TSLA’, ‘NVDA’]
initial_weights = [0.25, 0.20, 0.25, 0.15, 0.15]

end_date = datetime.now().strftime(‘%Y-%m-%d’)
start_date = (datetime.now() – timedelta(days=365)).strftime(‘%Y-%m-%d’)

portfolio_data = {}
portfolio_returns = pd.DataFrame()
successful_stocks = []

print(“\n 1. BUILDING AND ANALYZING A TECH PORTFOLIO”)
print(“-” * 50)

for i, symbol in enumerate(tech_stocks):
try:
data = obb.equity.price.historical(symbol=symbol, startdate=startdate, enddate=enddate)
df = data.to_df()

if df.index.duplicated().any():
df = df[~df.index.duplicated(keep=’first’)]

portfolio_data[symbol] = df

returns = df[‘close’].pct_change().dropna()
portfolio_returns[symbol] = returns
successful_stocks.append(symbol)

print(f” {symbol}: {len(df)} days of data”)
except Exception as e:
print(f” Error fetching {symbol}: {str(e)}”)
“`

3. Продвинутый технический анализ

Мы проведём продвинутый технический анализ по NVDA, рассчитав SMA, EMA, MACD, RSI и полосы Боллинджера, чтобы оценить импульс и потенциальные сигналы на вход/выход.

“`python
symbol = ‘NVDA’
try:
pricedata = obb.equity.price.historical(symbol=symbol, startdate=startdate, enddate=end_date)
df = pricedata.todf()

df[‘SMA_20’] = df[‘close’].rolling(window=20).mean()
df[‘SMA_50’] = df[‘close’].rolling(window=50).mean()
df[‘EMA_12’] = df[‘close’].ewm(span=12).mean()
df[‘EMA_26’] = df[‘close’].ewm(span=26).mean()

df[‘MACD’] = df[‘EMA12′] – df[‘EMA26′]
df[‘MACD_signal’] = df[‘MACD’].ewm(span=9).mean()

delta = df[‘close’].diff()
gain = (delta.where(delta > 0, 0)).rolling(window=14).mean()
loss = (-delta.where(delta < 0, 0)).rolling(window=14).mean()
rs = gain / loss
df[‘RSI’] = 100 – (100 / (1 + rs))

df[‘BB_middle’] = df[‘close’].rolling(window=20).mean()
bb_std = df[‘close’].rolling(window=20).std()
df[‘BBupper’] = df[‘BBmiddle’] + (bb_std * 2)
df[‘BBlower’] = df[‘BBmiddle’] – (bb_std * 2)

current_price = df[‘close’].iloc[-1]
current_rsi = df[‘RSI’].iloc[-1]
macdsignal = “BUY” if df[‘MACD’].iloc[-1] > df[‘MACDsignal’].iloc[-1] else “SELL”
pricevssma20 = “Above” if currentprice > df[‘SMA20′].iloc[-1] else “Below”

print(f”\n{symbol} Technical Analysis:”)
print(f”Current Price: ${current_price:.2f}”)
print(f”RSI (14): {currentrsi:.2f} ({‘Overbought’ if currentrsi > 70 else ‘Oversold’ if current_rsi < 30 else 'Neutral'})")
print(f”MACD Signal: {macd_signal}”)
print(f”Price vs SMA(20): {pricevssma20}”)

except Exception as e:
print(f”Error in technical analysis: {str(e)}”)
“`

4. Секторный анализ и скрининг акций

Мы проанализируем сектора по среднегодовой доходности и выберем акции для включения в портфель.

“`python
sectors = {
‘Technology’: [‘AAPL’, ‘GOOGL’, ‘MSFT’],
‘Electric Vehicles’: [‘TSLA’, ‘RIVN’, ‘LCID’],
‘Semiconductors’: [‘NVDA’, ‘AMD’, ‘INTC’]
}

sector_performance = {}

for sector_name, stocks in sectors.items():
sector_returns = []
for stock in stocks:
try:
data = obb.equity.price.historical(symbol=stock, startdate=startdate, enddate=enddate)
df = data.to_df()

if df.index.duplicated().any():
df = df[~df.index.duplicated(keep=’first’)]

returns = df[‘close’].pct_change().dropna()
sector_returns.append(returns.mean() * 252)
except Exception as e:
print(f” Failed to fetch {stock}: {str(e)}”)
continue

if sector_returns:
avgreturn = np.mean(sectorreturns)
sectorperformance[sectorname] = avg_return
print(f”{sectorname}: {avgreturn:.2%} average annual return”)
“`

5. Анализ рыночных настроений

Мы получим свежие заголовки компаний, чтобы учесть рыночные настроения в нашей аналитике.

“`python
for symbol in successful_stocks[:2]:
try:
news = obb.news.company(symbol=symbol, limit=3)
newsdf = news.todf()
print(f”\n{symbol} Recent News Headlines:”)
for idx, row in news_df.iterrows():
print(f”• {row.get(‘title’, ‘N/A’)[:80]}…”)
break
except Exception as e:
print(f”News not available for {symbol}: {str(e)}”)
“`

6. Анализ рисков

Мы рассчитаем корреляционную матрицу портфеля и определим риск портфеля.

“`python
if not portfolioreturns.empty and len(portfolioreturns.columns) > 1:
correlationmatrix = portfolioreturns.corr()
print(“\nPortfolio Correlation Matrix:”)
print(correlation_matrix.round(3))

portfoliovar = np.dot(portfolioweights, np.dot(correlation_matrix *
(portfolio_returns.std().values.reshape(-1,1) *
portfolio_returns.std().values.reshape(1,-1)),
portfolio_weights))
portfoliorisk = np.sqrt(portfoliovar) * np.sqrt(252)
print(f”\nPortfolio Risk (Volatility): {portfolio_risk:.2%}”)
“`

7. Создание визуализаций производительности

Мы создадим визуализации производительности с помощью графиков кумулятивной доходности, скользящей волатильности, распределения доходности и корреляционной матрицы.

“`python
if not portfolio_returns.empty:
fig, axes = plt.subplots(2, 2, figsize=(15, 10))
fig.suptitle(‘Portfolio Analysis Dashboard’, fontsize=16)

cumulativereturns = (1 + portfolioreturns).cumprod()
cumulative_returns.plot(ax=axes[0,0], title=’Cumulative Returns’, alpha=0.7)
axes[0,0].legend(bboxtoanchor=(1.05, 1), loc=’upper left’)

rollingvol = portfolioreturns.rolling(window=30).std() * np.sqrt(252)
rolling_vol.plot(ax=axes[0,1], title=’30-Day Rolling Volatility’, alpha=0.7)
axes[0,1].legend(bboxtoanchor=(1.05, 1), loc=’upper left’)

weighted_returns.hist(bins=50, ax=axes[1,0], alpha=0.7)
axes[1,0].set_title(‘Portfolio Returns Distribution’)
axes[1,0].axvline(weighted_returns.mean(), color=’red’, linestyle=’–‘, label=’Mean’)
axes[1,0].legend()

if len(correlation_matrix) > 1:
sns.heatmap(correlation_matrix, annot=True, cmap=’coolwarm’, center=0, ax=axes[1,1])
axes[1,1].set_title(‘Correlation Matrix’)

plt.tight_layout()
plt.show()
“`

8. Инвестиционное резюме и рекомендации

Мы подведём итоги нашего анализа и дадим рекомендации по дальнейшим действиям.

“`python
print(“\n 8. INVESTMENT SUMMARY & RECOMMENDATIONS”)
print(“-” * 50)

print(“Portfolio Analysis Complete!”)
print(f” Analyzed {len(successful_stocks)} stocks”)
print(f” Calculated {len(sector_performance)} sector performances”)
print(f” Generated technical indicators and risk metrics”)

if not portfolioreturns.empty and len(successfulstocks) > 0:
bestperformer = portfolioreturns.mean().idxmax()
worstperformer = portfolioreturns.mean().idxmin()
print(f” Best Performer: {best_performer}”)
print(f” Worst Performer: {worst_performer}”)

print(“\n Key Insights:”)
print(“• Diversification across tech sectors reduces portfolio risk”)
print(“• Technical indicators help identify entry/exit points”)
print(“• Regular rebalancing maintains target allocations”)
print(“• Monitor correlations to avoid concentration risk”)

print(“\n Next Steps:”)
print(“• Backtest different allocation strategies”)
print(“• Add fundamental analysis metrics”)
print(“• Implement automated alerts for technical signals”)
print(“• Explore ESG and factor-based screening”)

print(“\n” + “=”*60)
print(“OpenBB Advanced Tutorial Complete! “)
print(“Visit https://openbb.co for more features and documentation”)
“`

Мы успешно использовали OpenBB для создания, анализа и визуализации диверсифицированного портфеля, извлечения секторальных инсайтов, технических сигналов и метрик риска. Мы видим, как сочетание статистики производительности с рыночными настроениями и продвинутой визуализацией позволяет нам принимать обоснованные инвестиционные решения. Этот подход позволяет нам непрерывно отслеживать и совершенствовать наши стратегии, оставаясь гибкими в меняющихся рыночных условиях и уверенными в принимаемых нами решениях, основанных на данных.

1. Какие ключевые показатели эффективности (KPI) можно вычислить при анализе портфеля с помощью OpenBB?

В статье описывается вычисление нормализованных весов, ежедневных доходов, годового дохода, волатильности, коэффициента Шарпа, максимальной просадки и других показателей.

2. Какие технические индикаторы можно рассчитать для анализа акций с помощью OpenBB?

В статье упоминаются такие технические индикаторы, как SMA (скользящее среднее), EMA (экспоненциальное скользящее среднее), MACD (скользящая средняя конвергенция/дивергенция), RSI (индекс относительной силы) и полосы Боллинджера.

3. Какие шаги необходимо предпринять для создания технологического портфеля с помощью OpenBB?

Для создания технологического портфеля необходимо выполнить следующие шаги:
* установить и импортировать OpenBB вместе с необходимыми библиотеками Python;
* настроить среду для подавления предупреждений;
* установить параметры отображения для pandas;
* подготовить данные для анализа;
* вычислить нормализованные веса и ежедневные доходы;
* оценить производительность портфеля.

4. Какие методы анализа рыночных настроений можно использовать с помощью OpenBB?

В статье описывается метод получения свежих заголовков компаний для учёта рыночных настроений в аналитике. Это позволяет учесть текущие события и тенденции, которые могут влиять на рынок.

5. Какие визуализации можно создать для анализа производительности портфеля с помощью OpenBB?

В статье упоминаются следующие визуализации:
* графики кумулятивной доходности;
* графики скользящей волатильности;
* распределение доходности;
* корреляционная матрица.

Источник