MLTradingBot icon indicating copy to clipboard operation
MLTradingBot copied to clipboard

A couple Mods Not Exactly working that Im able to tell

Open QueRicoChulo opened this issue 10 months ago • 7 comments

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} )

trader = Trader()

trader.add_strategy(strategy)

trader.run_all()

QueRicoChulo avatar Apr 27 '24 19:04 QueRicoChulo