Квантопический живой алгоритм - как? - PullRequest
0 голосов
/ 05 мая 2020

Большой вопрос:

Как я могу реализовать свои квантопические алгоритмы со всеми стратегиями, которые я установил с комбинацией альфа?

Я не нашел ответа.

Я нашел Alpaca, которая работает с zipeline, но я не могу использовать Morningstar или Q1500US с альпакой, или я не нашел способ сделать это.

Я взял много пора настроить этого бота, найти хороший фактор для низкого альфа и хорошей отдачи, я действительно разочарован и не очень хочу go возвращаться с нуля и создавать другого бота.

Пожалуйста, помогите найдите решение, и если вообще невозможно использовать этого бота, скажите мне, какую библиотеку в качестве полной квантопии я могу использовать для создания другого бота в том же стиле.

Спасибо всем, мой бот торчит там !!

Вот мой бот:

import quantopian.algorithm as algo
from quantopian.pipeline import Pipeline
from quantopian.pipeline.data.builtin import USEquityPricing
from quantopian.pipeline.filters import QTradableStocksUS
from quantopian.pipeline.filters.morningstar import Q1500US
from quantopian.pipeline.data.sentdex import sentiment
from quantopian.pipeline.data.morningstar import operation_ratios


def initialize(context):
    """
    Called once at the start of the algorithm.
    """
    # Rebalance every day, 1 hour after market open.
    algo.schedule_function(
        rebalance,
        algo.date_rules.every_day(),
        algo.time_rules.market_open(hours=1),
    )

    # Record tracking variables at the end of each day.
    algo.schedule_function(
        record_vars,
        algo.date_rules.every_day(),
        algo.time_rules.market_close(),
    )

    # Create our dynamic stock selector.
    algo.attach_pipeline(make_pipeline(), 'pipeline')

    #set_commission(commission.PerTrade(cost=0.001))


def make_pipeline():
    # Yes : operation_ratios.revenue_growth.latest
    # Yes : operation_ratios.operation_margin.latest
    # Yes : sentiment

    testing_factor1=operation_ratios.operation_margin.latest
    testing_factor2=operation_ratios.revenue_growth.latest
    testing_factor3=sentiment.sentiment_signal.latest

    universe =(Q1500US() & 
              testing_factor1.notnull() &
              testing_factor2.notnull() &
              testing_factor3.notnull())

    testing_factor1=testing_factor1.rank(mask=universe, method='average')
    testing_factor2=testing_factor2.rank(mask=universe, method='average')
    testing_factor3=testing_factor3.rank(mask=universe, method='average')

    testing_factor= testing_factor1 + testing_factor2 + testing_factor3

    testing_quantiles = testing_factor.quantiles(2)

    pipe = Pipeline(columns={'testing_factor':testing_factor,'shorts':testing_quantiles.eq(0),'longs':testing_quantiles.eq(1)},screen=universe)
    return pipe    

def before_trading_start(context, data):
    """
    Called every day before market open.
    """
    context.output = algo.pipeline_output('pipeline')

    # These are the securities that we are interested in trading each day.
    context.security_list = context.output.index


def rebalance(context, data):

    long_secs=context.output[context.output['longs']].index
    long_weight=0.5/len(long_secs)

    short_secs=context.output[context.output['shorts']].index
    short_weight=-0.5/len(short_secs)

    for security in long_secs:
        if data.can_trade(security):
                          order_target_percent(security, long_weight)
    for security in short_secs:
        if data.can_trade(security):
                          order_target_percent(security, short_weight)

    for security in context.portfolio.positions:
        if data.can_trade(security) and security not in long_secs and security not in short_secs:
            order_target_percent(security, 0)

def record_vars(context, data):
    long_count=0

    short_count=0

    for position in context.portfolio.positions.values():
        if position.amount>0:
            long_count+=1
        elif position.amount<0:
            short_count+=1
    record(num_longs=long_count, num_shorts=short_count, leverage=context.account.leverage)

1 Ответ

0 голосов
/ 11 июня 2020

Чтобы торговать квантопической стратегией за пределами квантопической, вам нужны две вещи: бэктестер и данные.

Zipline - это библиотека для тестирования на исторических данных с открытым исходным кодом, которая поддерживает Quantopian backtester. Самая большая проблема в том, что он не поддерживает торговлю в реальном времени. Было предпринято несколько попыток адаптировать его для реальной торговли, но они никогда не набирали обороты и, похоже, провалились.

Второе, что вам нужно, это получить данные от где-нибудь и напишите собственный код, чтобы загрузить его в Zipline. Quantopian / Zipline требует, чтобы данные за 1 минуту хранились в столбчатом формате хранения, называемом bcolz. Если вы используете фундаментальные данные в Pipeline, загрузка этих данных - это отдельный шаг, требующий написания специального кода.

Суть в том, что адаптация Zipline для реальной торговли - нетривиальная задача.

Если вы предпочитаете готовый к использованию вариант, QuantRocket поддерживает бэктестинг и реальную торговлю по стратегиям Zipline и предоставляет встроенные данные по акциям США за 1 минуту. Фундаментальные данные доступны для использования в Pipeline. Q1500US определен c для Quantopian и не является частью библиотеки с открытым исходным кодом, но вы можете приблизить его, отфильтровав объем в долларах или рыночную капитализацию.

Отказ от ответственности: я связан с QuantRocket.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...