Overall Statistics
Total Orders
19
Average Win
0.50%
Average Loss
-0.56%
Compounding Annual Return
0.241%
Drawdown
2.600%
Expectancy
0.051
Start Equity
5000
End Equity
5011.97
Net Profit
0.239%
Sharpe Ratio
-2.07
Sortino Ratio
-1.364
Probabilistic Sharpe Ratio
13.428%
Loss Rate
44%
Win Rate
56%
Profit-Loss Ratio
0.89
Alpha
-0.053
Beta
0.022
Annual Standard Deviation
0.024
Annual Variance
0.001
Information Ratio
-1.657
Tracking Error
0.109
Treynor Ratio
-2.231
Total Fees
$18.00
Estimated Strategy Capacity
$250000.00
Lowest Capacity Asset
ZGN XUHPP6DON42T
Portfolio Turnover
0.47%
# region imports
from io import StringIO
from AlgorithmImports import *
from AlgorithmImports import Chart,ScatterMarkerSymbol,Resolution,DayOfWeek
import pickle
import datetime


# endregion

class CapitalMarketDays(QCAlgorithm):
    def Initialize(self):
        self.start_date_ = datetime.datetime(2023, 1, 1)
        self.end_date_ = datetime.datetime(2024, 1, 1)

        self.set_start_date(self.start_date_)
        self.set_end_date(self.end_date_)
        self.set_cash(5_000)
        
        # self.marketscreener_path = self.ObjectStore.get_file_path('market_screener_googlesheet')
        # self.df = pd.read_pickle(self.marketscreener_path)

        self.symbols_ = dict()

        # buying_dict_path = self.ObjectStore.get_file_path('buying_dict')
        buying_dict_path = self.ObjectStore.get_file_path('captial_market_days_buying_dict')
        # buying_dict_path = captial_market_days_buying_dict_path
        with open(buying_dict_path, 'rb') as f:
            self.buying_dict = pickle.load(f)

        for i,j in self.buying_dict.items():
            j['symbol'] = Symbol.Create(i, SecurityType.Equity,Market.USA)
         



        # self.add_universe(
        #     ScheduledUniverse(
        #         self.date_rules.every_day("SPY"), 
        #         self.TimeRules.At(8, 0), 
        #         self.select_symbols
        #     )

        #         )

        # self.schedule.on(
        #     self.date_rules.every_day(),
        #     self.time_rules.at(21,0),
        #     self.manual_buy_and_sell
        # )
        self.schedule.on(
            self.date_rules.every_day(),
            self.time_rules.at(12,0),
            self.manual_buy_and_sell
        )
        # self.schedule.on(
        #     self.date_rules.every_day(),
        #     self.time_rules.at(10,0),
        #     self.add_data_to_algo
        # )

        self.schedule.on(
            self.date_rules.every(DayOfWeek.MONDAY,DayOfWeek.THURSDAY),
            self.time_rules.at(13,0),
            self.logging
        )

        self.chart = Chart('custom_chart')
        self.add_chart(self.chart)
        self.add_series = []

        # for i in self.buying_dict.keys():
        s1 = Series('price',SeriesType.SCATTER)
        s2 = Series('buy',SeriesType.SCATTER, "$", Color.Green, ScatterMarkerSymbol.TRIANGLE)
        s3 = Series('sell',SeriesType.SCATTER, "$", Color.Red, ScatterMarkerSymbol.TRIANGLE)
        self.chart.add_series(s1)
        self.chart.add_series(s2)
        self.chart.add_series(s3)

    @staticmethod
    def parse_datetime(dt):
        return dt.strftime('%Y-%m-%d')

    # def select_symbols(self,dt):
    #     self.Log(f"The universe selection ran on {dt.strftime('%Y-%m-%d %H:%M:%S')}")
    #     dt_parsed = self.parse_datetime(dt)
    #     self.Log(f"{dt_parsed}")
    #     if dt_parsed in self.buying_dict.keys():
    #         self.Log(f"{self.buying_dict[dt_parsed]}")
        
    #         return [Symbol.Create(t, SecurityType.Equity, Market.USA) for  t in self.buying_dict[dt_parsed]]

    def manual_buy_and_sell(self):
        for i,j in self.buying_dict.items():
            symbol =j['symbol']
            symbol_str = str(symbol)

            if j['buy_on'] == self.parse_datetime(self.time):
                if symbol not in self.securities.keys():
                    self.debug(f"add_equity {str(symbol)}")
                    self.add_equity(symbol,Resolution.HOUR)
                    
            if j['sell_on'] == self.parse_datetime(self.time):
                self.log(f"Sell {i}") 
                if self.portfolio[symbol].invested:
                    self.liquidate(i)
                    self.log(f"liquidate {i}") 
                    self.remove_security(symbol)
                    self.plot("custom_chart",'sell', self.current_slice[symbol].price)
                else:
                    self.log(f"We never bought {i} in the first place")


    def add_data_to_algo(self):
        "This adds the data to our algo (add_equity) when they are in the dict in two weeks"
        return 
        dt = self.time
        dt_plus_14  = dt+timedelta(days = 14)
        dt_plus_14_parsed = self.parse_datetime(dt_plus_14)
                    

    
    def logging(self):
        pass

        # self.log(f"{self.symbols_.keys()=}")
        # self.log([str(i) for i in self.portfolio.keys()] )

    def on_data(self, data: Slice):
        if data.time.day%7==0:
            self.log(f"data.keys(): {[str(i) for i in data.keys()]}")

        for symbol in data.keys():
            symbol_str = str(symbol)
            if not self.portfolio[symbol].invested:
                self.log(f"{symbol_str} is {self.securities[symbol].is_tradable} tradable")
                if self.securities[symbol].is_tradable:
                    self.debug(f"set_holding {symbol_str} on {data.time}")
                    self.set_holdings(symbol,0.1)
                    self.plot("custom_chart",'buy', data[symbol].price)

            if data[symbol] is not None:
                # if symbol_str not in self.add_series:
                    # pass
                    # s = Series(symbol_str)
                    # self.chart.add_series(s)
                    # self.add_series.append(symbol_str)
                self.plot("custom_chart",'price', data[symbol].price)
        
        return


        for symbol in data.keys():
            if not self.portfolio[symbol].invested:
                self.set_holdings(symbol,0.1)
                self.log(f"Bought {str(symbol)} on { self.parse_datetime(data.time)}")
                self.securities[symbol].bought_on = self.parse_datetime(data.time)
                self.debug(f"{self.securities[symbol].bought_on =}")

        
            # self.portfolio[i].invested

        # if the sma is bigger, 
        # self.emit_insights(Insight(symbol, timedelta(weeks=4), InsightType.PRICE, InsightDirection.UP))

        # if not self.Portfolio.Invested:
            # pass
            # self.SetHoldings("SPY", 0.33)

    def extract_from_sheets_load_to_objectstore(self):
        """
        This is the ELT that keeps the object store up to date with google sheets
        It loads from google sheets saves to ObjectStore
        """
        googlesheets_path = "https://docs.google.com/spreadsheets/d/e/2PACX-1vRyrVQwoM9Svg8mHWb2mC2K84QBUwAonoilR2jj5fg38IuGJFRxbSAUtk6nhFAG1T0cToIxcKeWC668/pubhtml"
        content = self.Download(googlesheets_path)
        df = pd.read_html(StringIO(content))[0]
        df.to_csv(self.marketscreener_path)
        return None

    def on_end_of_algorithm(self):
        self.liquidate()