Продолжаем публиковать адаптацию Руководства по DataCamp по использованию Python для разработки финансовых приложений.
Первая часть В материале говорилось о структуре финансовых рынков, акциях и торговых стратегиях, данных временных рядов, а также о том, что необходимо для начала разработки.
Теперь, когда вы знаете больше о требованиях к данным, понимаете концепцию временных рядов и знакомы с пандами, пришло время углубиться в финансовый анализ, необходимый для создания торговой стратегии.
Блокнот Jupyter этого руководства можно скачать.
Здесь .
Общий финансовый анализ: расчет прибыли
В простой расчет ежедневного процентного изменения не учитывает, например, дивиденды и другие факторы — он просто отмечает процентное изменение цены купленных акций по сравнению с предыдущим торговым днем.Вычислить такие изменения легко с помощью функции pct_change(), включенной в пакет Pandas.
Доход будет рассчитываться в логарифмическом масштабе – это позволит более четко отслеживать изменения во времени.# Import `numpy` as `np` import numpy as np # Assign `Adj Close` to `daily_close` daily_close = aapl[['Adj Close']] # Daily returns daily_pct_change = daily_close.pct_change() # Replace NA values with 0 daily_pct_change.fillna(0, inplace=True) # Inspect daily returns print(daily_pct_change) # Daily log returns daily_log_returns = np.log(daily_close.pct_change()+1) # Print daily log returns print(daily_log_returns)
Знать прибыль за день — это хорошо, но что, если нам нужно посчитать эту цифру за месяц или даже квартал? В таких случаях вы можете использовать функцию resample(), которую мы рассмотрели в последней части урока: # Resample `aapl` to business months, take last observation as value
monthly = aapl.resample('BM').
apply(lambda x: x[-1]) # Calculate the monthly percentage change monthly.pct_change() # Resample `aapl` to quarters, take the mean as value per quarter quarter = aapl.resample("4M").
mean()
# Calculate the quarterly percentage change
quarter.pct_change()
Использовать pct_change() удобно, но в этом случае сложно понять, как именно рассчитывается ежедневный доход. В качестве альтернативы вы можете использовать функцию Pandas под названием «shift()».
Затем вам нужно разделить значения daily_close на daily_close.shift(1) -1. При использовании этой функции значения NA будут расположены в начале результирующего кадра данных.
Для справки, расчет ежедневного изменения цены акции производится по формуле:
,
Где p — цена, t — время (в нашем случае день), r — доход. Вы можете создать график распределения daily_pct_change: # Import matplotlib
import matplotlib.pyplot as plt
# Plot the distribution of `daily_pct_c`
daily_pct_change.hist(bins=50)
# Show the plot
plt.show()
# Pull up summary statistics
print(daily_pct_change.describe())
Результат выглядит симметричным и нормально распределенным: ежедневное изменение цены составляет около интервала 0,00. Следует понимать, что для корректной интерпретации результатов гистограммы необходимо использовать функцию описать(), примененную к daily_pct_c. В этом случае будет видно, что среднее значение также близко к интервалу 0,00, а стандартное отклонение составляет 0,02. Вам также необходимо посмотреть на процентили, чтобы понять, какая часть данных выходит за пределы -0,010672, 0,001677 и 0,014306.
Индекс общая дневная норма прибыли полезен для определения стоимости инвестиций через регулярные промежутки времени.
Вы можете рассчитать общую дневную норму прибыли, используя значения ежедневных изменений цен активов в процентах, прибавив к ним 1 и рассчитав окончательные значения: # Calculate the cumulative daily returns
cum_daily_return = (1 + daily_pct_change).
cumprod()
# Print `cum_daily_return`
print(cum_daily_return)
Здесь вы снова можете использовать Matplotlib для быстрого построения графика cum_daily_return. Вам просто нужно добавить функциюplot() и, при необходимости, определить размер графика с помощью figsize. # Import matplotlib
import matplotlib.pyplot as plt
# Plot the cumulative daily returns
cum_daily_return.plot(figsize=(12,8))
# Show the plot
plt.show()
Это довольно просто.
Теперь, если вам нужно проанализировать не дневной доход, а ежемесячный доход, вам следует вернуться к функции resample() — с ее помощью вы сможете привести cum_daily_return к месячным значениям: # Resample the cumulative daily return to cumulative monthly return
cum_monthly_return = cum_daily_return.resample("M").
mean()
# Print the `cum_monthly_return`
print(cum_monthly_return)
Умение рассчитывать доходность — полезный навык, но на практике эти цифры редко несут ценную информацию, если вы не сравните их с доходностью других акций.
Вот почему примеры часто сравнивают две или более акций друг с другом.
Чтобы сделать это, вам сначала нужно загрузить больше данных — в нашем случае с Yahoo! Финансы.
Для этого вы можете создать функцию, которая будет использовать тикер акции, а также даты начала и окончания торгового периода.
В приведенном ниже примере функция data() принимает тикер для получения данных от начальной до конечной даты и возвращает результат функции get().
Данные помечаются правильными тиккерами, в результате чего создается кадр данных, содержащий эту информацию.
Приведенный ниже код загружает данные акций Apple, Microsoft, IBM и Google в один общий фрейм данных: def get(tickers, startdate, enddate):
def data(ticker):
return (pdr.get_data_yahoo(ticker, start=startdate, end=enddate))
datas = map (data, tickers)
return(pd.concat(datas, keys=tickers, names=['Ticker', 'Date']))
tickers = ['AAPL', 'MSFT', 'IBM', 'GOOG']
all_data = get(tickers, datetime.datetime(2006, 10, 1), datetime.datetime(2012, 1, 1))
Примечание : Этот код также использовался в руководстве.
использование Pandas для финансов , позже он был изменен.
Кроме того, поскольку в настоящее время существуют проблемы с загрузкой данных с Yahoo! Финансы, для корректной работы возможно придется скачать пакет fix_yahoo_finance - инструкцию по установке можно найти Здесь или в Блокнот Jupyter для этого урока .
Вот результат запуска этого кода:
Этот большой фрейм данных можно использовать для рисования интересных графиков: # Import matplotlib
import matplotlib.pyplot as plt
# Isolate the `Adj Close` values and transform the DataFrame
daily_close_px = all_data[['Adj Close']].
reset_index().
pivot('Date', 'Ticker', 'Adj Close')
# Calculate the daily percentage change for `daily_close_px`
daily_pct_change = daily_close_px.pct_change()
# Plot the distributions
daily_pct_change.hist(bins=50, sharex=True, figsize=(12,8))
# Show the resulting plot
plt.show()
Еще одним полезным графиком для финансового анализа является матрица рассеяния.
Вы можете получить его, используя библиотеку pandas. Вам нужно будет добавить в код функцию scatter_matrix().
Daily_pct_change передается в качестве аргументов, а для диагонали устанавливается значение по вашему выбору, чтобы получить график оценки плотности ядра (KDE).
Также с помощью аргумента альфа вы можете установить прозрачность, а с помощью figsize — изменить размер графика.
# Import matplotlib
import matplotlib.pyplot as plt
# Plot a scatter matrix with the `daily_pct_change` data
pd.scatter_matrix(daily_pct_change, diagonal='kde', alpha=0.1,figsize=(12,12))
# Show the plot
plt.show()
В случае локальной работы для построения матрицы рассеяния может потребоваться модуль построения графиков (т. е.
pd.plotting.scatter_matrix()).
В следующей части руководства будет рассмотрено использование движущихся окон для финансового анализа, расчет волатильности и применение обычной регрессии наименьших квадратов.
Продолжение следует….
Другие материалы по финансам и фондовому рынку от ИТИ Капитал :
- Аналитика рынка и обзоры
- Фьючерсы, индексы и IPO: как на самом деле работают биржи и зачем они нужны
- Топ-10 книг для понимания структуры фондового рынка
- Фьючерсы, индексы и IPO: как на самом деле работают биржи и зачем они нужны
- Инфраструктура российского рынка ценных бумаг (краткая образовательная программа)
- How-to: роботы и API брокерской торговой системы
-
Webmoney Для «Интернет-Дом Билайн»
19 Oct, 24 -
Codegear Анонсирует Rad Studio 2007
19 Oct, 24