Организация питон – как использовать Python для алгоритмической торговли на бирже. Часть 1 / ITI Capital corporate blog / Habr

Содержание

как использовать 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]])

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

Помимо индексирования есть несколько способов узнать о данных больше. Можно, к примеру, попробовать создать семпл из 20 строк данных, а затем переформатировать их таким образом, чтобы appl стал не дневным значением и месячным. Сделать это можно с помощью функций sample() и resample():

# 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 чего начать,


Желаю вам увлекательного путешествия. Будущее в ваших руках.

Перевод: Диана Шеремьёва

Отправить ответ

avatar
  Подписаться  
Уведомление о