Пишем простую торговую стратегию на Python

avatar
Ujwal Kumar
8 августа 2021 в 18:58
273
1
-1

Заранее приносим извинения за длинное сообщение (пожалуйста, сообщите, если эти длинные сообщения плохо оформлены). :(

Попытка закодировать простую торговую стратегию, чтобы узнать, как рассчитать ожидаемую доходность и финансовые методы торговли.

Я загрузил здесь данные S&P 500 из Yahoo Finance, используя yfinance. Затем я загрузил данные и хотел, чтобы пользователь мог указать, как далеко назад идут данные.

Здесь уже начинается моя проблема. Мой фрейм данных загружается таким образом, что список «close_price» имеет даты в качестве столбца индекса (это также можно увидеть на прикрепленном изображении). Это не самая большая проблема, поскольку я могу назвать все даты и цены закрытия для выбранных мною акций.

Отсюда я пытаюсь рассчитать ожидаемую доходность на основе двух стратегий:

  1. Купить $x на первом свидании. После этого покупайте $x каждый месяц. Рассчитайте стоимость портфеля (или доход от каждой инвестиции/общий доход) на указанную дату.
  2. Купить $x на первом свидании. Купите $x снова, если цена упадет на 10%. Продайте 0,5 * $ x, если цена вырастет на 10%. Купить $x, если прошло 30 дней и не было сделано ни одного ордера на покупку/продажу.

Изображение моей таблицы данных

import pandas as pd
import matplotlib.pyplot as plt
import yfinance as yf
from pandas_datareader import data as web

# Load stock data
stock_ticker = '^GSPC'
df = yf.download(stock_ticker)

# Allows user to input number of days to trackback prior to today (excluding weekends) for analysis
timescale = int(input("Enter No. of days prior to today (excluding weekends):")) 

# List arrays for close price and dates
close_price = df["Adj Close"][-timescale:]
dates = df.index.tolist()[-timescale:]

# Returns
daily_returns = close_price.pct_change(fill_method='pad')
monthly_returns = close_price.resample('M').ffill().pct_change(fill_method='pad')

Что я пробовал:

-- Написание цикла for, вычисляющего умножение моего месячного дохода на акции (значения месячного дохода порядка 0,01 и цены акций порядка 4000 долларов) на мои инвестиции в месяц. Таким образом, инвестиции в размере 1000 долларов США, доходность через месяц составляет 0,04, поэтому доходность равна 40, стоимость портфеля = 1040 долларов США

-- Напишите цикл while, который имеет значение True, пока цены акций от начального значения превышают 0,90% от него. Если это не так: вложите в акции 1000 долларов. Если акции вырастут на 10% (или если цена последнего ордера на покупку/продажу <1,1x), тогда продайте 50%.

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

Спасибо!

Источник
Adam Smooch
8 августа 2021 в 19:13
0

Попробуйте разбить свою проблему на более управляемые части, например: 1. отследить, какие активы/количество удерживаются, 2. какова стоимость текущих активов и 3. should security X be a buy/sell today. Как только вы сможете точно покупать/продавать [вручную] и рассчитывать стоимость портфеля с течением времени, переходите к пункту 3.

Ответы (1)

avatar
Faiz
19 августа 2021 в 00:19
0

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

Однако, если вы хотите создать свой собственный код с нуля, я предлагаю разбить его на несколько более мелких шагов.

Во-первых, часть кода, которая находит торговые сигналы на покупку/продажу на основе ранее указанных вами критериев.

Затем другая часть кода, которая принимает торговые сигналы и находит сделки с датами входа/выхода.

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