Стратегия "Купи и держи".

Инициализация алгоритмов

В самом начале вашего алгоритма мы вызываем метод Initialize() для настройки вашей стратегии. Здесь важно настроить состояние вашего алгоритма, чтобы его можно было легко перезапустить.

Инициализация денежных средств

Метод self.SetCash() устанавливает стартовый капитал для вашей стратегии. При тестировании на истории мы используем значение, которое вы установили для инициализации вашего капитала; в реальной торговле мы получаем это значение с вашего брокерского счета. По умолчанию мы используем начальный капитал в размере 100 000 долларов США при тестировании на истории и торговле на бумаге.
class BuyAndHold(QCAlgorithm):

	def Initialize(self):
		# 1. Устанавливаем первоначальную сумму наличных
		self.SetCash(100000)
		
	def OnData(self, data):
		pass

Инициализация периода анализа

Диапазон дат для вашего бэктеста определяется в вашем методе Initialize. Вы можете установить это с помощью фиксированных дат или объекта datetime. Эти методы называются self.SetStartDate() и self.SetEndDate().
class BuyAndHold(QCAlgorithm):
	def Initialize(self):
		# 1. Устанавливаем первоначальную сумму наличных
		self.SetCash(100000)
		# Устанавливаем период, посредством задания первого и последнего дня
		self.SetStartDate(2017, 1, 1)
		self.SetEndDate(2017, 10, 31)
	def OnData(self, data):
		pass

Инициализация источников данных

Есть много способов запросить данные в QuantConnect. Для начала мы продемонстрируем, как запрашивать данные вручную.

Добавление данных

Метод self.AddEquity() используется для ручного запроса активов. Он принимает строковый тикер с текущим именем актива и разрешением. Для получения дополнительной информации см. документацию.
AddEquity (и все остальные методы AddAsset) возвращают объект актива. Это дает вам ссылку на объект актива, который вы можете использовать позже.
Вы можете управлять разрешением данных с помощью перечисления Resolution. Он имеет значения Tick, Second, Minute, Hour и Daily. например Resolution.Minute. Не все данные доступны во всех разрешениях. Вы должны проверить библиотеку данных, чтобы убедиться, что ваше разрешение доступно.
Вы можете изменить кредитное плечо, запросить данные пре-маркета и отключить форвардное заполнение. Вы можете увидеть вызовы API в документации. Мы обсудим это далее.
class BuyAndHold(QCAlgorithm):
	def Initialize(self):
		# 1. Устанавливаем первоначальную сумму наличных
		self.SetCash(100000)
		# Устанавливаем период, посредством задания первого и последнего дня
		self.SetStartDate(2017, 1, 1)
		self.SetEndDate(2017, 10, 31)
		
		# Вручную запрашиваем данные
		self.spy = self.AddEquity("SPY", Resolution.Minute)
		self.iwm = self.AddEquity("IWM", Resolution.Minute)
		
	def OnData(self, data):
		pass

Нормализация данных

В QuantConnect исторические данные настраиваются по умолчанию. Это означает, что исторические значения изменены для учета дробления акций и выплаты дивидендов. Исторические цены могут выглядеть немного странно, если вы не понимаете, почему это было сделано: например. вместо 10,23 доллара цена может составлять 1,21216 доллара.
Вы можете управлять режимом нормализации данных для каждого актива отдельно. Это делается с помощью метода security.SetDataNormalizationMode(). Допустимые значения: Raw, Adjusted, SplitAdjusted и TotalReturn.
ibm = self.AddEquity("IBM", Resolution.Minute)
ibm.SetDataNormalizationMode(DataNormalizationMode.Adjusted) //По умолчанию

Доступ к ценным бумагам

Доступ к ценным бумагам в вашем алгоритме можно получить через словарь self.Securities[symbol]. Он ищет ценную бумагу по объекту символа или строке тикера. Используя этот метод доступа, вы можете найти ценную бумагу и изменить ее модели или режим нормализации данных.
self.Securities["IBM"].SetDataNormalizationMode(DataNormalizationMode.Adjusted)

Свойства глобального портфеля

Словарь алгоритма Portfolio также имеет вспомогательные свойства для быстрого поиска таких вещей, как: Invested, TotalUnrealizedProfit, TotalPortfolioValue, TotalMarginUsed. Вы можете увидеть больше свойств в документации, например:
if self.Portfolio["IBM"].Invested:
	self.Debug("Total unrealized profit: " + str(Portfolio.TotalUnrealizedProfit))

Конкретные элементы портфеля

Индивидуальные активы хранятся в собственности вашего портфеля. Доступ к этому можно получить через словарь self.Portfolio[symbol]. Записи в словаре портфеля — это объекты SecurityHolding со многими свойствами ваших активов, такими как: Invested, Quantity, AveragePrice and UnrealizedProfit например:
if self.Portfolio["IBM"].Invested:
	self.Debug("We have IBM shares!")
Еще пример:
class BuyAndHold(QCAlgorithm):
	def Initialize(self):
		self.SetStartDate(2017, 6, 1)
		self.SetEndDate(2017, 6, 2)
		#1. Update the AddEquity command to request IBM data
		self.spy = self.AddEquity("IBM", Resolution.Daily)
		
	def OnData(self, data):
		
		#2. Display the Quantity of IBM Shares You Own
		if self.Portfolio["IBM"].Invested:
			self.Debug("Number of IBM Shares: " + str(self.Portfolio["IBM"].Quantity ))

Отправка ордеров

Давайте совершим нашу первую сделку! Есть много способов отправлять приказы через LEAN, но мы собираемся начать с MarketOrder. Его можно использовать следующим образом:
self.MarketOrder("AAPL", 200)
Рыночные ордера исполняются сразу после открытия рынка. Если вы используете ежедневные данные, заказ не будет обработан до следующего утра. Дневные бары поступают в ваш алгоритм только после закрытия рынка.

Цены исполнения

Средняя цена исполнения вашего актива доступна в классе Portfolio. Вы можете получить к нему доступ следующим образом: Portfolio["IBM"].AveragePrice. При тестировании на истории это смоделированная цена. В реальной торговле это берется из вашего брокерского отчета о цене исполнения.
class BuyAndHold(QCAlgorithm):

	def Initialize(self):
		self.SetStartDate(2017, 6, 1)
		self.SetEndDate(2017, 6, 15)
		#1,2. Select IWM minute resolution data and set it to Raw normalization mode
		self.iwm = self.AddEquity('IWM', Resolution.Minute)
		self.iwm.SetDataNormalizationMode(DataNormalizationMode.Raw)

	def OnData(self, data):

		#3. Place an order for 100 shares of IWM and print the average fill price
		#4. Debug the AveragePrice of IWM
		if not self.Portfolio.Invested:
			self.MarketOrder('IWM', 1000)
			self.Debug('AveragePrice:' + str(self.Portfolio['IWM'].AveragePrice))