MLTradingBot
MLTradingBot copied to clipboard
A couple Mods Not Exactly working that Im able to tell
I am new to this and coding. I made a couple mods to the file so I would like someone to review it and help me where it needs help please and please adapt if you think its a good idea....
your patience is appreciated
Danny
from lumibot.brokers import Alpaca from lumibot.backtesting import YahooDataBacktesting from lumibot.strategies.strategy import Strategy from lumibot.traders import Trader from datetime import datetime from alpaca_trade_api import REST from timedelta import Timedelta from finbert_utils import estimate_sentiment
import numpy as np #added to get pythons math functions
API_KEY = "YOUR API KEY" API_SECRET = "YOUR API SECRET" BASE_URL = "https://paper-api.alpaca.markets"
ALPACA_CREDS = { "API_KEY":API_KEY, "API_SECRET": API_SECRET, "PAPER": True }
class MLTrader(Strategy): def initialize(self, symbol:str="SPY", cash_at_risk:float=.5): self.symbol = symbol self.sleeptime = "24H" self.last_trade = None self.cash_at_risk = cash_at_risk self.api = REST(base_url=BASE_URL, key_id=API_KEY, secret_key=API_SECRET)
# def position_sizing(self):
# cash = self.get_cash()
# last_price = self.get_last_price(self.symbol)
# quantity = round(cash * self.cash_at_risk / last_price,0)
# return cash, last_price, quantity
def position_sizing(self):
cash = self.get_cash()
last_price = self.get_last_price(self.symbol)
atr = self.calculate_atr(self.symbol)
take_profit, stop_loss = self.set_take_profit_stop_loss(last_price, atr)
quantity = round(cash * self.cash_at_risk / last_price, 0)
return cash, last_price, quantity, take_profit, stop_loss
def calculate_atr(self, symbol, period=14):
# Fetch historical data for ATR calculation, implement accordingly
pass
def set_take_profit_stop_loss(self, last_price, atr, multiplier=2):
take_profit = last_price + atr * multiplier
stop_loss = last_price - atr * multiplier
return take_profit, stop_loss
def get_dates(self):
today = self.get_datetime()
three_days_prior = today - Timedelta(days=3)
return today.strftime('%Y-%m-%d'), three_days_prior.strftime('%Y-%m-%d')
def get_sentiment(self):
today, three_days_prior = self.get_dates()
news = self.api.get_news(symbol=self.symbol,
start=three_days_prior,
end=today)
news = [ev.__dict__["_raw"]["headline"] for ev in news]
probability, sentiment = estimate_sentiment(news)
return probability, sentiment
def on_trading_iteration(self):
cash, last_price, quantity = self.position_sizing()
probability, sentiment = self.get_sentiment()
# if cash > last_price:
# if sentiment == "positive" and probability > .999:
# if self.last_trade == "sell":
# self.sell_all()
# order = self.create_order(
# self.symbol,
# quantity,
# "buy",
# type="bracket",
# take_profit_price=last_price*1.20,
# stop_loss_price=last_price*.95
# )
# self.submit_order(order)
# self.last_trade = "buy"
# elif sentiment == "negative" and probability > .999:
# if self.last_trade == "buy":
# self.sell_all()
# order = self.create_order(
# self.symbol,
# quantity,
# "sell",
# type="bracket",
# take_profit_price=last_price*.8,
# stop_loss_price=last_price*1.05
# )
# self.submit_order(order)
# self.last_trade = "sell"
if cash > last_price:
if sentiment == "positive" and probability > .999:
if self.last_trade == "sell":
self.sell_all()
order = self.create_order(
self.symbol,
quantity,
"buy",
type="bracket",
take_profit_price=take_profit,
stop_loss_price=stop_loss
)
self.submit_order(order)
self.last_trade = "buy"
elif sentiment == "negative" and probability > .999:
if self.last_trade == "buy":
self.sell_all()
order = self.create_order(
self.symbol,
quantity,
"sell",
type="bracket",
take_profit_price=take_profit,
stop_loss_price=stop_loss
)
self.submit_order(order)
self.last_trade = "sell"
start_date = datetime(2020,1,1) end_date = datetime(2023,12,31) broker = Alpaca(ALPACA_CREDS) strategy = MLTrader(name='mlstrat', broker=broker, parameters={"symbol":"SPY", "cash_at_risk":.5}) strategy.backtest( YahooDataBacktesting, start_date, end_date, parameters={"symbol":"SPY", "cash_at_risk":.5} )