Избранные комментарии трейдера Кактус
Перстами легкими как сон
Моих стопов коснулся он.
И стали рушиться стопы
Под улюлюканье толпы.
Моих лосей коснулся он,
И я услышал шум и стон:
И внял я — рисков содроганье,
И лонгов яростный полет,
И куклов страшных хитрый ход,
И депозита прозябанье.
И он к мозгам моим приник,
и вырвал — лудоманский бзик,
тот, что сливать меня заставил.
И хитрость мудрыя змеи,
В мозги затекшие мои,
Недрогнувшей рукой добавил.
И депозит рассек мечом,
Процентов 90 вынул,
И напугав небытием,
Дрожащего меня покинул.
Как труп в пустыне я лежал,
И кукла глас ко мне воззвал:
«Восстань, пророк, и виждь, и внемли,
Исполнись волею моей,
И, обходя моря и земли,
Инфоцыганством богатей»
broker25, приветствую. Делистингованные компании тоже есть(свойство delisting) Вот ссылка на доку по ресерчу. www.quantconnect.com/docs/research/fundamental-data
Качать данные… наверно можно исхитрится, чтобы отправлять себе почту. Но по сути это ненужно.
Вот пример кода по отбору и сделкам на основе балансовой стоимости. Пример на питоне. На С# переключать не стал, так как сейчас идет бектест, чтобы ничего не сломалось. Но старожилы квантконекта рекомендуют использовать С#, так как бектесты работают в десятки раз быстрее. К сожалению отступы не копируются на смарт лабе. Но зная вас, думаю общее впечатление себе вы сможете составить.
_________________________________
from datetime import timedelta
from QuantConnect.Data.UniverseSelection import *
from Selection.FundamentalUniverseSelectionModel import FundamentalUniverseSelectionModel
class LiquidValueStocks(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2017, 5, 15)
self.SetEndDate(2017, 7, 15)
self.SetCash(100000)
self.UniverseSettings.Resolution = Resolution.Hour
self.AddUniverseSelection(LiquidValueUniverseSelectionModel())
#1. Create and instance of the LongShortEYAlphaModel
self.AddAlpha(LongShortEYAlphaModel())
self.SetPortfolioConstruction(EqualWeightingPortfolioConstructionModel())
self.SetExecution(ImmediateExecutionModel())
class LiquidValueUniverseSelectionModel(FundamentalUniverseSelectionModel):
def __init__(self):
super().__init__(True, None, None)
self.lastMonth = -1
def SelectCoarse(self, algorithm, coarse):
if self.lastMonth == algorithm.Time.month:
return Universe.Unchanged
self.lastMonth = algorithm.Time.month
sortedByDollarVolume = sorted([x for x in coarse if x.HasFundamentalData],
key=lambda x: x.DollarVolume, reverse=True)
return [x.Symbol for x in sortedByDollarVolume[:100]]
def SelectFine(self, algorithm, fine):
sortedByYields = sorted(fine, key=lambda f: f.ValuationRatios.EarningYield, reverse=True)
universe = sortedByYields[:10] + sortedByYields[-10:]
return [f.Symbol for f in universe]
# Define the LongShortAlphaModel class
class LongShortEYAlphaModel(AlphaModel):
def __init__(self):
self.lastMonth = -1
def Update(self, algorithm, data):
insights = []
#2. If else statement to emit signals once a month
if self.lastMonth == algorithm.Time.month:
return insights
self.lastMonth = algorithm.Time.month
#3. For loop to emit insights with insight directions
# based on whether earnings yield is greater or less than zero once a month
for security in algorithm.ActiveSecurities.Values:
direction = 1 if security.Fundamentals.ValuationRatios.EarningYield > 0 else -1
insights.append(Insight.Price(security.Symbol, timedelta(28), direction))
return insights