как использовать Python для алгоритмической торговли на бирже. Часть 1 / ITI Capital corporate blog / Habr
Технологии стали активом — финансовые организации теперь не только занимаются своим основным бизнесом, но уделяют много внимания новым разработкам. Мы уже рассказывали о том, что в мире высокочастотной торговли лучших результатов добиваются обладатели не только самого эффективного, но и быстрого софта и железа.
Среди наиболее популярных в сфере финансов языков программирования можно отметить R и Python, также часто используются C++, C# и Java. В опубликованном на сайте DataCamp руководстве речь идет о том, как начать использовать Python для создания финансовых приложений — мы представляем вам серию статей-адаптаций глав этого материала.
Структура руководства:
- Первая часть предназначена для новичков на рынке, в ней речь пойдет об устройстве финансовых рынков, акциях и торговых стратегиях, данных временных рядов, а также о том, что понадобится для начала разработки.
- Во второй части будет представлено введение в работу с данными временных рядов и инструментами финансового анализа, вроде подсчета волатильности и скользящих средних, с помощью Python-библиотеки Pandas.
- Затем мы перейдем к непосредственной разработке простой импульсной торговой стратегии.
- В четвертой части речь пойдет о том, как проводить бэктест стратегии на исторических данных.
- В завершение, будут затронуты вопросы оптимизации стратегии для повышения ее производительности, а также оценки ее работы и надежности.
Введение: простым языком об устройстве сферы финансов
Прежде чем окунуться в мир торговых стратегий, имеет смысл коснуться базовых понятий. Однако это не означает, что то, о чем пойдет речь ниже, рассчитано совсем на новичков. Будет здорово, если вы предварительно ознакомитесь с курсом по использованию Python для работы с данными, а также представляете себе, как работать со списками и пакетами Python, а также хотя бы на базовом уровне знакомы с NumPy и Pandas.
Акции и торговля на бирже
Когда компания хочет продолжить развитие бизнеса, запускать новые проекты или расширяться, то в качестве инструмента финансирования может использовать акции. Акция представляет долю во владении компании, акции обменивают на деньги. Акции можно покупать и продавать: участники таких сделок проводят операции с уже существующими, ранее выпущенными акциями. Цена, по которой конкретная акция будет продана или куплена, может постоянно меняться, вне зависимости от бизнес-показателей выпустившей акции компании: все определяется спросом и предложением. Важно понимать различие между акциями и, например, облигациями (бондами), которые используются для привлечения именно заемных средств.
Когда речь идет о трейдинге, то рассматриваться может не только продажа и покупка акций — сделка может быть заключена по разным активам, в числе которых могут быть как финансовые инструменты, так и, например, драгоценные металлы или ресурсы вроде нефти.
При покупке акций инвестор получает определенную долю в компании, из чего может в будущем извлечь финансовую выгоду, продав эту долю. Стратегии могут различаться: существуют длинные сделки (long), заключаемые в надежде на дальнейший рост акций, и короткие, когда инвестор предполагает, что акции будут дешеветь, поэтому продает акции в надежде в будущем «откупить» их обратно по более низкой цене.
Разработка торговой стратегии включает в себя несколько стадий, что похоже, например, на построение моделей машинного обучения: сначала нужно сформулировть стратегию и описать ее в формате, позволяющем запустить ее на компьютере, затем нужно протестировать работоспособность получившейся программы, оптимизировать ее, а затем оценить результативность и надежность работы.
Торговые стратегии обычно проверяют с помощью бэктестинга: это подход, при которым стратегия «прогоняется» на исторических данных о торгах — на их основе программа генерирует сделки. Это позволяет понять, принесла бы такая стратегия доход при том развитии рыночной ситуации, что наблюдалось в прошлом. Таким образом, можно предварительно оценить перспективность стратегии в торгах в режиме реального времени. При этом, нет гарантий того, что хорошие показатели на исторических данных повторятся при работе на реальном рынке.
Данные временных рядов
Временной ряд — это последовательность цифровых данных, полученных на последовательных равных промежутках времени. В сфере финансов такие ряды используются для отслеживания движений цен за определенный период времени, записанных в равные интервалы. Вот, как это выглядит:
По оcи X расположены даты, а цена — на оси Y. «Последовательные равные промежутки времени» в данном случае означает, что по временной оси даты расположены с двухнедельным интервалом: можно сравнить 3/7/2005 и 3/31/2005, а также 4/5/2005 и 4/19/2005 (здесь даты записаны в принятом в США формате, когда сначала идет месяц, а затем день).
Однако финансовые данные обычно включают не два параметра (цена и дата), а пять — помимо величины торгового периода, это цена открытия торгового периода, наивысшая и низшая цена в его рамках, а также цена в момент закрытия периода. Это значит, что если мы рассматривает дневной период, то анализ данных даст нам информацию о том, на каком уровне находилась цена в момент старта и завершения торгов в выбранный день, а также какой была максимальная и минимальная цена в ходе торгов.
Выше были описаны базовые понятия, которые необходимо знать, чтобы продолжить изучение данного руководства.
Основы Python для сферы финансов: Pandas
Одним из самых востребованных инструментов при использовании Python для разработки финансовых приложений является пакет Pandas. Он нужен уже в самом начале, но по мере углубления в процесс разработки понадобятся и такие пакеты как NumPy, SciPy, Matplotlib.
Для начала сфокусируемся на Pandas и применении этого инструмента к анализу временных рядов. Ниже речь пойдет о том, как с помощью данного пакета импортировать данные, анализировать и манипулировать ими.
Импорт финансовых данных
Пакет pandas-datareader позволяет получать данные из таких источников, как Google, Yahoo! Finance или Всемирный банк — подробнее о доступных источниках данных написано в документации. В этом руководстве будет рассматриваться получение данных с сервиса Yahoo! Finance. Для начала работы необходимо установить последнюю версию пакета с помощью pip:
pip install pandas-datareader
Инструкции по установке версии в разработке представлены здесь.
import pandas_datareader as pdr
import datetime
aapl = pdr.get_data_yahoo('AAPL',
start=datetime.datetime(2006, 10, 1),
end=datetime.datetime(2012, 1, 1))
Не так давно в Yahoo API произошли изменения, так что для начала самостоятельной работы с библиотекой нужно установить исправления, который позволит дождаться официального патча. Подробнее проблема описана здесь. Однако для этого руководства данные были скачаны заранее, так что проблем с его изучением не возникнет.
Важно также понимать, что несмотря на то, что pandas-datareader — это удобный инструмент для загрузки данных, он далеко не единственный для Python. Также можно использовать библиотеки вроде Quandl, которая позволяет получать данные с сервиса Google Finance:
import quandl
aapl = quandl.get("WIKI/AAPL", start_date="2006-10-01", end_date="2012-01-01")
Также многим известно, что в сфере финансов для анализа данных очень популярен Excel. Для удобства будущей работы можно интегрировать этот инструмент с Python (подробнее по ссылке).
Работа с данными временных рядов
Для импортирования данных мы использовали pandas_datareader. В результате возник объект aapl — это DataFrame, то есть двумерная именованная структура данных со столбцами потенциально разных типов. Первое, что следует сделать при работе с таким фреймом — запустить функции head() и tail() для того, чтобы взглянуть на первый и последний столбцы датафрейма. Для получения полезной статистической сводки по скачанным данным можно воспользоваться функцией describe(). Пример этого кода можно найти на странице исходного материала.
Данные содержат четыре столбца с ценой открытия и закрытия торгового периода, а также максимальной и минимальной ценой — мы рассматриваем дневные интервалы и акции Apple. Также мы получаем два дополнительных столбца: Volume и Adj Close. Первый из них используется для того, чтобы зафиксировать количество акций, с которыми совершались сделки в торговый день. Второй столбец — это «отрегулированная» цена закрытия (adjusted closing price), это значит, что в цену закрытия периода были добавлены все действия с акциями, которые могли быть совершены до момента открытия следующего торгового дня.
Если нужно сохранить данные в CSV-файл, это можно сделать с помощью функции to_csv(), а прочитать файл можно с помощью read_csv() — это полезно для ситуаций, когда источник данных меняется и доступ к ним временно теряется.
import pandas as pd aapl.to_csv('data/aapl_ohlc.csv') df = pd.read_csv('data/aapl_ohlc.csv', header=0, index_col='Date', parse_dates=True)
После базового анализа скачанных данных, пора двигаться дальше. Для этого можно, к примеру, изучить индексы и столбцы, выбрав, например, десять последних строк конкретного столбца. Это называется разбиением (subsetting), поскольку берется лишь небольшой набор имеющихся данных. Получившееся подмножество — это ряд, то есть одноразмерный именованный массив.
Для того, чтобы посмотреть на индекс и столбцы данных следует использовать атрибуты index и columns. Затем можно выделить подмножество из десяти последних наблюдений в столбце column. Для изолирования этих значений следует использовать квадратные скобки. Последнее значение помещается в переменную ts, а проверка ее типа осуществляется с помощью функции type().
# Inspect the index
aapl.index
# Inspect the columns
aapl.columns
# Select only the last 10 observations of `Close`
ts = aapl['Close'][-10:]
# Check the type of `ts`
type(ts)
Использование квадратных скобок удобно, но это не самый характерный способ при работе с Pandas. Поэтому также стоит рассмотреть функции loc() и iloc(): первая из них используется для label-based индексирования, а последняя для позиционального индексирования.
На практике, это значит, что можно передать ярлык ряда вроде 2007 или 2006-11-01 в функцию loc(), а целые числа вроде 22 или 43 передаются функции iloc().
# Inspect the first rows of November-December 2006
print(aapl.loc[pd.Timestamp('2006-11-01'):pd.Timestamp('2006-12-31')].head())
# Inspect the first rows of 2007
print(aapl.loc['2007'].head())
# Inspect November 2006
print(aapl.iloc[22:43])
# Inspect the 'Open' and 'Close' values at 2006-11-01 and 2006-12-01
print(aapl.iloc[[22,43], [0, 3]])
Если внимательно взглянуть на результаты процедуры разбиения, то станет видно, что в данных пропущены определенные дни. Дальнейший анализ паттерна покажет, что обычно не хватает двух или трех дней. Это выходные дни и государственные праздники, во время которых нет биржевых торгов.
# Sample 20 rows
sample = aapl.sample(20)
# Print `sample`
print(sample)
# Resample to monthly level
monthly_aapl = aapl.resample('M').mean()
# Print `monthly_aapl`
print(monthly_aapl)
Прежде чем перейти к визуализации данных и проведению финансового анализа, можно начать вычислять разницу между ценами открытия и закрытия торгового периода. Эту арифметическую операцию можно с помощью Pandas — нужно вычесть значения столбца Open данных appl из столбца Close. Или, другими словами, вычесть aapl.Close из aapl.Open. Получившийся результат будет храниться в новом столбце датафрейма aapl под названием diff, который можно удалить с помощью функции del:
# Add a column `diff` to `aapl`
aapl['diff'] = aapl.Open - aapl.Close
# Delete the new `diff` column
del aapl['diff']
Получившиеся абсолютные значения уже могут быть полезны при разработке финансовой стратегии, однако обычно требуется и более глубокий анализ, например, процентных величин роста или падения цены определенной акции.
Визуализация данных временных рядов
Помимо анализа данных с помощью функций head(), tail() и индексирования, также возможна их визуализация. Благодаря интеграции Pandas с инструментом для создания графиков Matplotlib это можно сделать довольно легко. Нужно лишь использовать функцию plot() и передать ей релевантные параметры. Кроме того, если добавить параметр grid, то получившийся график будет наложен на сетку.
# Import Matplotlib's `pyplot` module as `plt`
import matplotlib.pyplot as plt
# Plot the closing prices for `aapl`
aapl['Close'].plot(grid=True)
# Show the plot
plt.show()
Этот код дает вот такой график:
В следующей части руководства речь пойдет о финансовом анализе данных временных рядов с помощью Python.
Продолжение следует…..
Другие материалы по теме финансов и фондового рынка от ITI Capital:
Использование Python для формирования отчетов в отдельно взятой компании / Habr
Эта история случилась в реальной компании, несмотря на то, что некоторые имена и события вымышлены.Слава был рядовым разработчиком в небольшой фирме в городе N. Фирма занималась предоставлением услуг образовательным организациям. В наличии было несколько приложений, которые необходимо поддерживать, дорабатывая помаленьку, понемногу. Вот только начальство Славы не верило в его усилия и то, что он ест свой хлеб не просто так. Кроме того, начальство в информационных технологиях не так чтобы очень, но хотело понимать, что делают сотрудники и какая продуктивность у отдела продаж (который надо сказать состоял из одного с половиной человека).
Хитрым глазом смотрело начальство на менеджера по продажам и вопрошало: а что ты сделал сегодня для Родины. Продавец отвечал: провел столько то встреч, предлагал услуги стольким то людям. Руководство пришло к Славе и говорит: скажи, правду ли говорят сотрудники или так, отсебятину несут. Нужна статистика.
Состоялся диалог:
— Пользователи оплачивают услугу через сторонний сервис для приема онлайн платежей? Так?
— Так.
— Доступ к данному сервису у руководства компании есть?
— Есть.
— Так, наверное, там и выгрузка по платежам есть.
— Есть.
— Но нужно, чтобы был еще дополнительный отчет?
— Нужен.
— Почему?
— Потому что так удобнее, потому что ты должен, потому что “так и так”.
Справедливости ради надо сказать, что нужны были дополнительные данные.
Не долго думая Слава исполнил простенький запрос с последующим выбором в Excel.
Отчет представлял из себя набор данных в один столбец на одной странице. По началу к Славе подходили в хаотичном порядке, посередине дня и спрашивали. А вот дай ка ты отчет по этой организации, а вот теперь по этой. Не долго думая Слава решил, что хватит это терпеть и нужно делать что-то прекрасное и унифицированное, которое удовлетворяло потребности запрашивающих.
Возник небольшой скрипт, который позволял делать рассылку заинтересованным персоналиям:
import openpyxl, pymysql, os
from smtplib import SMTP_SSL
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
import datetime
# Excel Settings
today = datetime.date.today().strftime('%d.%m.%Y')
excel_file = 'Oplata_polzovateley_' + today + '.xlsx'
# SQL settings
host = ''
user = ''
passwd = ''
db = ''
port=0000
headers = ['id', 'email', 'Контрагент', 'Тариф', 'дата оплаты', 'дата окончания', 'Группа', 'Кол-во входов', 'тип оплаты']
# SMTP Mail settings
smtp_server = 'smtp.gmail.com'
mail_login = ''
mail_passwd = ''
receiver = ['']
cc = ['']
def main():
# Fetch Data from SQL server
conn = pymysql.connect(host=host, user=user, passwd=passwd, db=db, port=port)
cursor = conn.cursor()
cursor.execute('''select * from table''')
data = cursor.fetchall()
conn.close()
# Write Data to Excel file
wb = openpyxl.Workbook()
contractors = {}
for item in data:
diff = item[6] - item[5]
item = list(item)
# print(item)
if diff.days > 10:
item.append('полный')
else:
item.append('триальный')
item = tuple(item)
if item[0][:30] in contractors:
contractors[item[0][:30]] += 1
else:
wb.create_sheet(item[0][:30])
contractors[item[0][:30]] = 2
for i in range(1, len(headers) + 1):
letter = openpyxl.utils.get_column_letter(i)
wb[item[0][:30]][letter + '1'] = headers[i - 1]
wb[item[0][:30]]['A' + str(contractors[item[0][:30]])] = contractors[item[0][:30]] - 1
for i in range(2, len(headers) + 1):
letter = openpyxl.utils.get_column_letter(i)
wb[item[0][:30]][letter + str(contractors[item[0][:30]])] = item[i]
wb.save(excel_file)
wb.remove(wb['Sheet'])
wb.save(excel_file)
# Compose attachment
part = MIMEBase('application', "octet-stream")
part.set_payload(open(excel_file, "rb").read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(excel_file))
# Compose message
msg = MIMEMultipart()
msg['From'] = mail_login
msg['To'] = ', '.join(receiver)
msg['Cc'] = ', '.join(cc)
msg['Subject'] = excel_file
msg.attach(part)
# Send mail
tosend = receiver + cc
smtp = SMTP_SSL('smtp.gmail.com')
smtp.connect(smtp_server)
smtp.login(mail_login, mail_passwd)
smtp.sendmail(mail_login, tosend, msg.as_string())
smtp.quit()
# Wipe file
os.remove(excel_file)
if __name__ == '__main__':
main()
Сделано, конечно, не очень подумал Слава. Но как говорится: “А, и так сойдет”.
Каждое утро Слава приходил на работу, запускал скрипт и отправлял письмо на почту заинтересованным лицам.
Следующим этапом стала настройка автоматической отправки. Работало это примерно так:
docker build —tag=reports.
docker run -it —rm reports
И прописью в кроне:
0 8 * * * docker run —rm foo
Каждый день в 8 утра письмо уходило. Руководство было довольно и даже начало думать, что Слава каждый день, ровно в 8 утра приходил на работу, составлял отчет в Excel, а затем руками отправлял на почту. Причем делал это и в субботу, и в воскресенье, и в снег, и в дождь, и в полярную ночь.
GitHub
До поры, до времени всё было нормально и руководство терпело, но недолго. Однажды состоялась встреча, на которой объявили новый приказ. Слушайте, слушайте и не говорите, что не слышали. Сим объявляю, что каждый сотрудник, каждый день должен отчитываться вышестоящему по званию, а то еще вышестоящему. Ну в общем вы поняли.
— Каждый день?, — спросил Слава.
— Каждый день. — ответил начальник технического отдела.
— А может быть не надо?
— Надо Слава, надо.
У Славы возникло несколько вопросов по данной ситуации. Непосредственной обязанностью была доработка программного обеспечения и его отчеты должны состоять из чего-то вроде этого:
feat(Module) Fixed a bug in NoteLineCount… not seriously…
upd(Module2) Pay no attention to the man behind the curtain
fixed(Module3) I was told to leave it alone, but I have this thing called OCD, you see
* Примечание: название сообщений к коммитам взяты отсюда
Слава решил, что будет составлять отчет на их основе. Прошла неделя. Состоялся новый разговор примерно такого содержания:
— Вот вы присылаете отчеты каждый день, но прогресса не видно. Что к примеру такое: “добавлена маска при вводе номера телефона на фронт-энде”.
— Ну, вот смотрите. Раньше приходилось вводить свой номер телефона и сверять количество циферок и было неудобно. А вот так — удобно.
— Хм. Хорошо. Понятно. А как вы объясните вот это: “Рефакторинг кода для модуля Контрагенты. Функция для валидации вынесена в отдельный метод”.
— Ну, понимаете. Есть такая штука — система контроля версий, в которой указывается кто, когда и что делал. Вот смотрите. Здесь коммиты, а здесь код, который был изменен. Вот код добавлен, вот код удален.
— Хорошо. Давайте тогда так. Делайте отчет на основании этих ваших коммитов, а мы потом будем собираться и сверять как да что вы там написали.
В итоге — получилось вот что:
GitHub
Скрипт брал изменения в репозитории и отправлял письмецо о том, что было сделано, а что нет.
Ранее Слава постеснялся сообщить о том, что те кто будут проверять ничегошеньки не понимают в написании кода. Может быть, руководство смыслит в продажах, покупках и прочей всякой всячине и платит деньги, но видеть будет определенные строчки кода на не очень знакомом языке, наблюдать как мерцают зеленые и красные строчки при переходе с коммита на коммит.
Да, Слава человек ответственный и работу работал, но бывали эти дни, когда код дорабатывался с трудом или было лень. Да и вообще, в целом система работала без сбоев и добавлять еще 15 слоев абстракции не хотелось, но отчеты требовалось отправлять каждый день.
Ничего не оставалось делать как стать новым Маяковским и писать отсебятину лесенкой. Но каждый день придумывать новое не слишком то хотелось. В итоге Вячеслав начал разрабатывать первое решение, которое пришло в голову и получился нехитрый код, где при отсутствии каких бы то ни было выполненных работ и запушенных изменений, составлялся отчет. Выглядело это примерно вот так:
GitHub
Оставалось сделать так, чтобы формировался фейковый код с последующими коммитами. Нужно ли это делать? Время покажет.
P.S.: На этом история Славы не закончилась. Было еще несколько событий, которые повлияли на его судьбу, но это совсем другая история. Интересно почитать в комментариях схожие истории из жизни и решения, которые создавались на их основе. Вполне возможно, что проект в последующем будет дорабатываться на основе данных комментариев.
Python на Хабре / Habr
Некоторое время назад, в силу определенных причин, мне пришла в голову мысль о том, чтобы начать изучать какой-нибудь новый язык программирования. В качестве альтернатив для этого начинания я определил два языка: Java и Python. После продолжительного метания между ними и сопутствующих нытья и долбежки головой о стену (у меня с новыми языками всегда так — сомнения, раздумья, проблема выбора и т.д.), я все-таки остановился на Python. Окей, выбор сделан. Что дальше? А дальше я стал искать материал для изучения…Взялся я за это довольно основательно. Ограничиваться документацией и выпущенными печатными изданиями, на мой взгляд, — не кофильфо. Всегда интересно «потрогать руками». Стоит сказать, что для меня, например, большая проблема придумать для себя задачу, причем ту, которую интересно выполнить. Но опять же, перерывать весь Интернет в поиске чего-то, что поможет «загореться» — излишняя трата времени. Поэтому я нашел компромиссное решение — я перерыл Хабр, точнее его хаб «Python».
Перечень найденного материала ниже. Там не всё — что-то мне было неинтересно, в каких-то статьях я не нашел полезной информации, но большинство статей сгруппированы по категориям, под спойлерами. Категории довольно условные, прошу за это не пинать. Надеюсь, что еще кому-нибудь, помимо меня, этот пост будет полезен. И если вы думаете, стоит ли начать изучение Python или нет — считайте это знаком, что стоит 🙂
Продвинутый уровеньРазмышления о PythonВсё о декораторахТестирование и отладкаПараллельный Python и многопоточныйФункциональный PythonМетапрограммированиеPython и редакторыРазличный практикумAPI:В основном API различных социальных сетей и сервисов.
Пишем себе немного OpenID-авторизации
Экспорт друзей VK в Google Contacts
Скачивание музыки из VK: 1 | 2
Twitter + VK: 1 | 2
Клиент для SOAP API Почты России
Jabber-to-Evernote Gateway изнутри
Скрипт проверки наличия свободных дат в посольстве
Flightstats API: Пишем свое табло прилетов с Боингами и Аэробусами
Получение любимых аудиозаписей с pandora.com
Bing + Python, поиск изображений
Чат:
Программа-мечта начинающего питоновода
WebSocket-чат на Tornado для вашего Django-проекта
Yet another python Chat client
Боты:
ICQ бот
Простой Twitter-бот
Не совсем обычный XMPP-бот: туннелирование
Пишем бота для игры «Найди отличие»
Skype-бот для голосовых конференций
Пишем бота для Twitter на основе GitHub API
Сокеты, серверы:
Сокеты в Python для начинающих
Асинхронный удар
Асинхронный http-клиент, или почему многопоточность — лишнее
Как применять Linux epoll в Python
Сервер на python для websockets
Inbox.py: самый простой SMTP-сервер
Реализация небольшого асинхронного сервера
FTP сервер с авторизацией через базу данных
Система:
Мониторинг за изменениями файловой системы
Python на примере демона уведомления о новых коммитах Git
Git. Автоматическая проверка сообщения коммита на стороне сервера с помощью Python
Скрипт для рекурсивного сравнения директорий
Python для системных администраторов
Gnome Applets. Введение
Пишем апплет для GNOME
Пишем апплет-переводчик для Gnome
Totem Gnome Applet
Переименование процессов в Python
Как написать дополнение для GIMP на языке Python
KDE4 + Python. Плазма-змей
KDE4 Plasma Desktop. Создание плазмоида
Whois: практическое руководство пользователя
Симуляция нажатий Home, End, PgUp, PgDown
Демон для удаленного управления компьютером через e-mail
Работа с консолью:
Простой консольный прогрессбар на питоне
Пишем консольный переводчик для *nix на Python
Парсинг, обработка текста:
Первые шаги в программировании на Python
Пишем свой шаблонизатор на Python
Как я учился работать с XML
Кузявые ли бутявки, т.е. пишем морфологический анализатор
Обработка Excel файлов с использованием Python
Социальный граф хабрасообщества
Regexp и Python: извлечение токенов из текста
Автоматизируем проверку трекинга почты России
Доставка свежей прессы с помощью Python прямо в почтовый ящик
Разбор кода и построение синтаксических деревьев с PLY. Основы
Частотный анализатор английских слов
Grab — python библиотека для парсинга сайтов
Документация по Grab — библиотеке для парсинга сайтов
Парсинг на Pуthon. Как собрать архив Голубятен
Генерим PDF бочками
Работа с изображениями:
Играемся с изображениями в Python
Получаем тип и размеры изображения без скачивания его целиком
Решение проблемы оперативного ресайза изображений
Геймдев:
Пишем платформер на Python, используя pygame: 1 | 2.1 | 2.2
Игра Жизнь на Python
Blender 2.49b + Python 2.6 – используем клавиатуру в своей игре
Blender 2.6 + Python 3.2 – задействуем устройства ввода в собственной игре
Python + Django:
Заметки для построения эффективных Django-ORM запросов в нагруженных проектах
Django ORM, gevent и грабли в зелени
Хостинг картинок за полчаса
Фотогалерея на Django с использованием Google Picasa в качестве хостинга
Сумбурные заметки про python и django
Пишем backend для мобильного приложения за несколько минут
Капча с помощью PIL или практический велосипед
Flask:
Мега-Учебник Flask: 1 | 2 | 3 | 4
Создание RESTful API в Google App Engine на основе Flask
Алгоритмы и структуры данных, ИИ, анализ данных:
Декодирование капчи на Python
Распознавание некоторых современных CAPTCHA
Задачка о восьми ферзях
Реализация графов и деревьев на Python
Поиск в строке. Реализация в CPython
Анализ рынка ноутбуков с помощью Python
Введение в анализ текстовой информации с помощью Python и методов машинного обучения
Введение в анализ данных с помощью Pandas
Шифр Виженера. Разбор алгоритма на Python
Латентно-семантический анализ и поиск на python
Необыкновенный способ генерации лабиринтов
PyBrain работаем с нейронными сетями на Python
Простой классификатор на PyBrain и PyQt4
Обучаем компьютер чувствам (sentiment analysis по-русски)
Определение части речи слов в русском тексте (POS-tagging)
Частотный анализатор английских слов
Вне категории:
Реализация кеша с ограничением по числу элементов на Python — решения: простое и посложнее
Случайные числа из звуковой карты
Пишем модуль расширения для Питона на C
Создаем симулятор солнечной системы
Взламываем шифры с Python
История одной оптимизации
Кодим безумный пассивный сниффер в виде модуля для Python
Рисуем волну .wav-файла
Tilt-Shift фотографии своими руками
Программный захват с вебкамеры
Распознаём изображение с токена при помощи камеры
Простой интерпретатор с нуля на Python
Руководство: пишем интерпретатор с JIT на PyPy
Играемся с гироскопом ноутбука thinkpad в linux
P.S. Если есть какие-то предложения о добавлении сюда ссылки на материал — прошу в личку. По поводу опечаток и чего-нибудь этакое — туда же.
более чем 30-кратное ускорение Python-кода / RUVDS.com corporate blog / Habr
Python — это язык, который любят многие программисты. Этим языком невероятно легко пользоваться. Всё дело в том, что код, написанный на Python, отличается интуитивной понятностью и хорошей читабельностью. Однако в разговорах о Python часто можно слышать одну и ту же жалобу на этот язык. Особенно тогда, когда о Python говорят знатоки языка C. Вот как она звучит: «Python — это медленно». И те, кто так говорят, не грешат против истины.В сравнении со многими другими языками программирования Python — это, и правда, медленно. Вот результаты испытаний, в ходе которых сопоставляется производительность разных языков программирования при решении различных задач.
Есть несколько способов ускорения Python-программ. Например, можно применять библиотеки, рассчитанные на использование нескольких ядер процессора. Тем, кто работает с Numpy, Pandas или Scikit-Learn, можно посоветовать взглянуть на программный комплекс Rapids, позволяющий задействовать GPU при проведении научных расчётов.
Все эти методики ускорения работы хороши в тех случаях, когда решаемые с помощью Python задачи могут быть распараллелены. Например — это задачи по предварительной обработке данных или операции с матрицами.
Но как быть в том случае, если ваш код — это чистый Python? Что если у вас есть большой цикл for
, который вам совершенно необходимо использовать, и выполнение которого просто нельзя распараллелить из-за того, что обрабатываемые в нём данные должны обрабатываться последовательно? Можно ли как-то ускорить сам Python?
Ответ на этот вопрос даёт Cython — проект, используя который можно значительно ускорить код, написанный на Python.
Что такое Cython?
Cython, по своей сути, это промежуточный слой между Python и C/C++. Cython позволяет писать обычный Python-код с некоторыми незначительными модификациями, который затем напрямую транслируется в C-код.
Единственное изменение Python-кода при этом заключается в добавлении к каждой переменной информации об её типе. При написании обычного кода на Python переменную можно объявить так:
x = 0.5
При использовании Cython при объявлении переменной нужно указать её тип:
cdef float x = 0.5
Эта конструкция сообщает Cython о том, что переменная представляет собой число с плавающей точкой. По такому же принципу объявляют переменные и в C. При использовании обычного Python типы переменных определяются динамически. Явное объявление типов, применяемое в Cython — это то, что делает возможным преобразование Python-кода в C-код. Дело в том, что в C необходимо явное объявление типов переменных.
Установка Cython предельно проста:
pip install cython
Типы в Cython
При использовании Cython можно выделить два набора типов. Один — для переменных, второй — для функций.
Если речь идёт о переменных, то тут нам доступны следующие типы:
cdef int a, b, c
cdef char *s
cdef float x = 0.5
(число одинарной точности)cdef double x = 63.4
(число двойной точности)cdef list names
cdef dict goals_for_each_play
cdef object card_deck
Обратите внимание на то, что тут, фактически, показаны типы C/C++!
При работе с функциями нам доступны следующие типы:
def
— обычная Python-функция, вызывается только из Python.cdef
— Cython-функция, которую нельзя вызвать из обычного Python-кода. Такие функции можно вызывать только в пределах Cython-кода.cpdef
— Функция, доступ к которой можно получить и из C, и из Python.
Теперь, когда мы разобрались с типами Python, можно заняться ускорением Python-кода.
Ускорение кода с использованием Cython
Начнём с создания Python-бенчмарка. Это будет цикл
for
, в котором выполняется вычисление факториала числа. Соответствующий код на чистом Python будет выглядеть так:def test(x):
y = 1
for i in range(1, x+1):
y *= i
return y
Cython-эквивалент этой функции очень похож на её исходный вариант. Соответствующий код нужно поместить в файл с расширением
.pyx
. Единственное изменение, которое нужно внести в код, заключается в добавлении в него сведений о типах переменных и функции:cpdef int test(int x):
cdef int y = 1
cdef int i
for i in range(1, x+1):
y *= i
return y
Обратите внимание на то, что перед функцией стоит ключевое слово
cpdef
. Это позволяет вызывать данную функцию из Python. Кроме того, тип назначен и переменной i
, играющей роль счётчика цикла. Не будем забывать о том, что типизировать нужно все переменные, объявленные в функции. Это позволит компилятору C узнать о том, какие именно типы ему использовать.Теперь создадим файл setup.py
, который поможет нам преобразовать Cython-код в C-код:
from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules = cythonize('run_cython.pyx'))
Выполним компиляцию:
python setup.py build_ext --inplace
Теперь С-код готов к использованию.
Если взглянуть в папку, в которой находится Cython-код, там можно будет найти все файлы, необходимые для запуска C-кода, включая файл run_cython.c
. Если вам интересно — откройте этот файл и посмотрите на то, какой С-код сгенерировал Cython.
Теперь всё готово к тестированию нашего сверхбыстрого C-кода. Ниже приведён код, используемый для тестирования и сравнения двух вариантов программы.
import run_python
import run_cython
import time
number = 10
start = time.time()
run_python.test(number)
end = time.time()
py_time = end - start
print("Python time = {}".format(py_time))
start = time.time()
run_cython.test(number)
end = time.time()
cy_time = end - start
print("Cython time = {}".format(cy_time))
print("Speedup = {}".format(py_time / cy_time))
Код этот устроен очень просто. Мы импортируем необходимые файлы — так же, как импортируются обычные Python-файлы, после чего вызываем соответствующие функции, делая это так же, как если бы мы всё время работали бы с обычными Python-функциями.
Взгляните на следующую таблицу. Можно заметить, что Cython-версия программы оказывается быстрей её Python-версии во всех случаях. Чем масштабнее задача — тем больше и ускорение, которое даёт использование Cython.
Итоги
Использование Cython позволяет значительно ускорить практически любой код, написанный на Python, не прилагая к этому особенных усилий. Чем больше в программе циклов и чем больше данных она обрабатывает — тем лучших результатов можно ждать от применения Cython.
Уважаемые читатели! Используете ли вы Cython в своих проектах?
Python за месяц / Edison corporate blog / Habr
Руководство для абсолютных(Прим. пер.: это советы от автора-индуса, но вроде дельные. Дополняйте в комментах.)
Месяц — это много времени. Если тратить на обучение по 6-7 часов каждый день, то можно сделать дофига.
Цель на месяц:
- Ознакомиться с основными понятиями (переменная, условие, список, цикл, функция)
- Освоить на практике более 30 проблем программирования
- Собрать два проекта, чтобы применить на практике новые знания
- Ознакомиться хотя бы с двумя фреймворками
- Начать работу с IDE (средой разработки), Github, хостингом, сервисами и т. д.
Так вы станете младшим разработчиком (джуном) Python.
Теперь план по неделям.
Статья переведена при поддержке компании EDISON Software, которая дает дельные советы юниорам, а также проектирует программное обеспечение и пишет ТЗ на русском и английском.
Первая неделя: познакомьтесь с Python
Разберитесь как все устроено в Python. Проверьте как можно больше вещей.
- День 1: 4 основных концепта (4 часа): ввод, вывод, переменная, условия
- День 2: 4 основных концепта (5 часов): список, цикл for, цикл while, функция, импорт модулей
- День 3: Простые проблемы программирования (5 часов): поменять местами две переменные, перевести градусы Цельсия в градусы по Фаренгейту, посчитать сумму всех разрядов в числе, проверить число на простоту, сгенерировать случайное число, удалить дубликат из списка
- День 4: Проблемы программирования средней сложности (6 часов): перевернуть строку (проверить на палиндром), посчитать наибольший общий делитель, объединить два отсортированных массива, написать игру на угадывание чисел, посчитать возраст и т.д.
- День 5: Структуры данных (6 часов): стек, очередь, словарь, кортежи, связный список
- День 6: ООП — Объектно-ориентированное программирование (6 часов): объект, класс, метод и конструктор, ООП наследование
- День 7: Алгоритм (6 часов): поиск (линейный и бинарный), сортировка (методом пузырька, выбором), рекурсивная функция (факториал, ряд Фибоначчи), временная сложность алгоритмов (линейных, квадратичных, константных)
Не устанавливайте Python:
Я понимаю, звучит противоречиво. Но поверьте мне. Я знаю кучу людей, у которых отпало всякое желание изучать что-либо после того как они не смогли установить среду разработки или ПО. Я советую сразу залезть в андроид приложение вроде Programming Hero или на сайт Repl и начать исследовать язык. Не ставьте себе задачу первым делом установить Python, если вы не особо подкованы технически.
Вторая неделя: начните разработку программного обеспечения (соберите проект)
Получите опыт разработки ПО. Попробуйте использовать все, что вы выучили, чтобы создать настоящий проект.
- День 1: Ознакомьтесь со средой разработки (5 часов): Среда разработки это интерактивная среда, где вы будете писать код для самых больших проектов. Вы должны хорошо знать хотя бы одну среду разработки. Я рекомендую начать с VS code install Python extension или Jupyter notebook
- День 2: Github (6 часов): Изучите Github, создайте репозиторий. Попробуйте закоммитить, запушить код, вычислить разницу между двумя любыми Git деревьями. Также разберитесь с ветвлением, слиянием и пул реквестами.
- День 3: Первый проект: Простой Калькулятор (4 часа): Ознакомьтесь с Tkinter. Создайте простой калькулятор.
- День 4, 5, 6: Личный проект (5 часов каждый день): Выберите один из проектов и начните над ним работу. Если у вас нет идей для проекта, посмотрите этот список: несколько хороших проектов на Python
- День 7: Хостинг (5 часов): Разберитесь с сервером и хостингом, чтобы хостить свой проект. Настройте Heroku и задеплойте сборку вашего приложения.
Почему проект:
Просто слепо следуя шагам в уроке или видео вы не разовьете умение думать. Вы должны применить свои знания в проекте. Как только вы потратите все силы на поиск ответа, вы его запомните.
Третья неделя: освойтесь как программист
Ваша цель на 3 неделе получить общее представление о процессе разработки ПО. Вам не нужно будет оттачивать ваши навыки. Но вы должны знать некоторые основы, так как они повлияют на вашу повседневную работу.
- День 1: Основы баз данных (6 часов): Базовый SQL-запрос (Create Table, Select, Where, Update), Функция SQL (Avg, Max, Count), реляционная база данных (Нормализация), Внутреннее соединение, Внешнее соединение и т. д.
- День 2: Используйте базы данных в Python (5 часов): Используйте фреймворк базы данных (SQLite или Pandas), подсоединитесь к базе данных, создайте и добавьте данные в несколько таблиц, считайте данные из таблиц
- День 3: API (5 часов): Научитесь вызывать API, подучите JSON, микросервисы, REST API
- День 4: Numpy (4 часа): Ознакомьтесь с Numpy и попрактикуйтесь в его использовании на первых 30 упражнениях
- День 5, 6: Портфолио сайта (5 часов каждый день): Выучите Django, создайте портфолио сайта на Django, также взгляните на фреймворк Flask
- День 7: Юнит-тесты, логи, отладка (4 часа): Разберитесь с юнит-тестами (PyTest), научитесь работать с логами и проверять их и используйте брейкпоинты
Реальный масштаб времени (Секрет):
Если вы болеете этой темой и посвящаете ей всего себя, то сможете сделать все за месяц.
- Учите Python постоянно. Начинайте в 8 утра и занимайтесь этим до 5 вечера. Сделайте перерыв на обед и перекусы (в общей сложности час)
- В 8 утра составьте список вещей, которые вы будете изучать сегодня. После уделите час времени, чтобы вспомнить и опробовать на практике все, что выучили вчера.
- C 9 утра до 12 часов дня учите и практикуйтесь поменьше. После обеда наберите обороты. Если вы застряли на какой-то проблеме, поищите ее решение в сети.
- Каждый день тратьте по 4-5 часов на обучение и 2-3 часа на практику. (максимум можете устроить себе один выходной в неделю)
- Ваши друзья решат, что вы сумасшедший. Не разочаровывайте их — соответствуйте образу.
Если вы работаете полный рабочий день или учитесь в универе, то вам потребуется больше времени. Будучи студентом мне потребовалось 8 месяцев, чтобы сделать все указанное в списке. Сейчас я работаю старшим разработчиком (сеньором). Моей жене, которая работает в центральном банке США, потребовалось полгода, чтобы закончить все задачи из списка. Неважно сколько времени потребуется. Закончите список.
Четвертая неделя: серьезно отнеситесь к тому, чтобы получить работу (стажера)
Ваша цель четвертой недели всерьез задуматься об устройстве на работу. Даже если вы не хотите получать работу прямо сейчас, вы многому научитесь в процессе собеседований.
- День 1: Резюме (5 часов): Создайте одностраничное резюме. В верхней части резюме разместите краткие сведения о своих навыках. Обязательно добавьте список своих проектов с ссылками на Github.
- День 2: Портфолио сайта (6 часов): Напишите несколько блогов. Добавьте их в предыдущее портфолио сайта, которое вы сделали.
- День 3: Профиль LinkedIn (4 часа): Создайте профиль в LinkedIn. Перенесите в LinkedIn все, что есть у вас в резюме.
- День 4: Подготовка к собеседованию (7 часов): Загуглите самые часто задаваемые вопросы на собеседованиях. Попрактикуйтесь в решении 10 проблем программирования, о которых спрашивают на собеседованиях. Делайте это на бумаге. Вопросы с собеседований можно найти на сайтах вроде Glassdoor, Careercup
- День 5: Нетворкинг (~ часов): Выберитесь из чулана. Начните ходить на митапы, ярмарки вакансий. Познакомьтесь с рекрутерами и другими разработчиками.
- День 6: Просто откликнитесь на вакансии (~ часов): Загуглите “работа Python”, посмотрите какие вакансии есть на LinkedIn и местных сайтах с предложениями работы. Выберите 3 вакансии, на которые вы откликнитесь. Настройте свое резюме под каждую из них. Найдите 2-3 вещи в списках требований, которые вы не знаете. Потратьте следующие 3-4 дня на то, чтобы в них разобраться.
- День 7: Учитесь за счет отказов (~ часов): Каждый раз, когда вы получаете отказ, определите для себя 2 вещи, которые вы должны знать, чтобы получить работу. Затем потратьте 4-5 дней на то, чтобы отточить свое мастерство в этих вопросах. Таким образом, после каждого отказа вы будете становиться лучше как разработчик.
Готовность к работе:
Правда в том, что вы никогда не будете готовы к работе на 100%. Все что вам нужно это очень хорошо выучить 1-2 вещи. И ознакомиться с другими вопросами, чтобы преодолеть барьер собеседований. Как только вы получите работу, вы многому научитесь на ней.
Наслаждайтесь процессом:
Обучение это процесс. На вашем пути обязательно будут трудности. Чем их больше — тем вы лучше как разработчик.
Если вы сможете закончить список за 28 дней, вы большой молодец. Но даже если вы выполните 60-70% списка, вы разовьете необходимые качества и навыки. Они помогут вам стать программистом.
Где учиться:
Если вы все еще не знаете c чего начать,
Желаю вам увлекательного путешествия. Будущее в ваших руках.
Перевод: Диана Шеремьёва