The difficult part of Fundamental Analysis is that we need access to the Data or Reported Information. If you're not very diversified and follow a small number of Companies, it is not too difficult to keep track. In contrast, anyone following or purchasing numerous shares of numerous companies will find it very difficult to keep track of Earnings Dates.
I realize it is often a bad decision to trade based on older data, when new data is available. To offer some background on the Catalyst for this post, I developed a Program, named Moneta, to aid my decision making and I do not want suggestions being made for companies on the Days they are reporting. I can see the Market Actions, Read the Reports, and gather Data to input into the Program. I decided to automate the process.
What are Earnings Dates and Why be Attenuative?
Earnings dates are the dates when public companies announce their financial results, which can affect their stock prices and your profits. Logging earnings dates can help you plan your trading strategy, avoid surprises, and stay informed of the market trends. In this post, I will share with you some tips and tools that I have used and may help you find and log the earnings dates for your needs.
One of the easiest ways to find and log the earnings dates is to use an online earnings calendar. An online earnings calendar is a web-based tool that lists the upcoming earnings announcements of public companies, along with other information such as the expected and reported earnings per share, the surprise percentage, and the conference call time. There are many online earnings calendars available on the internet, such as Yahoo Finance, Nasdaq, Market Chameleon, Markets Insider, and Seeking Alpha. You can use these tools to search for the earnings dates of the companies you are interested in, filter by market cap, sector, industry, or date range, and sort by alphabetical order, EPS estimate, or surprise percentage.
When I started Trading, I used Yahoo Finance and I found it quite useful
Company Earnings Calendar - Yahoo Finance
Another way to find and log the earnings dates is to use a stock screener. A stock screener is a web-based tool that allows you to filter and scan stocks based on various criteria, such as price, volume, market cap, sector, industry, dividend yield, growth rate, valuation ratios, and more. One of the criteria that some stock screeners offer is the earnings date. For example, you can use Finviz, Zacks, or TradingView to screen for stocks that have their earnings date within a certain time frame, such as this week, this month, or next month. You can also combine this criterion with other criteria to narrow down your search results.
Until, "very," recently, I used the Stock Screener on eTrade. It was part of my daily routine to review which companies were reporting before the Market opened.
This week I decided to include Earnings Dates in my Moneta Program. It was quite a simple addition. I created a Spreadsheet on Google Sheets called Earnings Dates. Then I made a form that combined the above mentioned, "Stock Screener," and my new Sheet. Yeah, it was some 80's style Data Entry... before we the Scrape concept was perfected. That will be the next step but for now, I am manually entering the Symbol and the Date into a form that adds an entry to form.
In addition, I will be logging what was reported and how the Market reacted to their Report. The sheet has five columns. A is automatically populated and contains the time and date of the entry. B is the Symbol, C is the earnings Date, D is the realized earnings surprise or miss, E is the Markets reaction.
Each new entry is logged on the last row of the Spreadsheet. Immediately realizing that I need to quickly sort and filter the entries, I added 178 rows above the first entry. Then I added a code in row 2 column B (Column A is hidden).
=SORT(FILTER(UNIQUE($B$179:E,1),IF(Moneta!$V$2="Pause",$C$179:C>DATE(YEAR(TODAY()),MONTH(TODAY()),DAY(TODAY()-2)),$C$179:C>DATE(YEAR(TODAY()),MONTH(TODAY()),DAY(TODAY()-1)))),2,TRUE,1,TRUE)
Let me dissect that simple snipped of code but first understand my goal here. I want to avoid automated Suggestions from my Program, "Moneta," of companies on the Day they are reporting. Keep in mind, I am a Fundamental Investor. One of the most prominent things I like to see is Net Income growing faster than Debt. Similar to Return on Invested Capital, but much simpler in my world. If I see a shift in that trend, before Moneta has the Data, I will manually downgrade the Score Moneta gives to a company. Moneta is always running. Moneta don't need to eat, Moneta don't sleep, and Moneta won't stop gathering Data of Companies on my Watchlist. I borrowed that from the Terminator!
I utilize a couple different Strategies. One I favor and do use often is a Swing Trading Strategy, which I see as one of three methods of gains (Dividends, Beta movement (Buy and Hold/Accumulate shares of great companies), and exploiting the ebb and flow of the Market). My swing Trading Strategy is simple. I seek 1% gains on my trades, only purchasing companies that seem fundamentally sound. I use several Intrinsic measuring sticks too, ensuring some level of value is met (Price to Earnings, Assets to Market Capitalization, Debt to Income, etc...). There are a lot of different business models and one measuring stick doesn't fit every company.
I might buy or sell on Reports, but I will make that decision without the algorithm of Moneta making suggestions. Each day I want Companies reporting sorted.
SORT function will put the result of the Filter in order by the date, Column 2.
SORT( OTHER FUNCTIONS (), 2,TRUE,1,TRUE) Date Column, Ascending Order, Symbol Column, Ascending Order.
FILTER function, inside the Sort function, fetches Columns B to E of the Spreadsheet where the Date (Column C) is greater than today.
FILTER(UNIQUE($B$179:E,1),IF(Moneta!$V$2="Pause",$C$179:C>DATE(YEAR(TODAY()),MONTH(TODAY()),DAY(TODAY()-2)),$C$179:C>DATE(YEAR(TODAY()),MONTH(TODAY()),DAY(TODAY()-1))))
Unique function, inside the Filter and Sort functions, ensures that duplicate entries are presented, using the Symbol.
UNIQUE($B$179:E,1)
There is an IF function specifying one of two different Dates to Filter. When I awake in the morning, I need it to filter two days ago. Then I can log the data of companies that Reported after the Close and what the Market Reaction is (Pre-Market the Next Day) or was (Post Market the day before) in Columns D and E. Moneta V2 simply has either Pause or Run results. Pause is when the Market is Closed and Run an hour before and when the Market is open.
IF(Moneta!$V$2="Pause",$C$179:C>DATE(YEAR(TODAY()),MONTH(TODAY()),DAY(TODAY()-2)),$C$179:C>DATE(YEAR(TODAY()),MONTH(TODAY()),DAY(TODAY()-1)
Lastly, I added a Column F to the Spreadsheet. That final Column is for Linking between the Row containing the Filtered Results and the actual Entry on the Spreadsheet.
In the filtered Rows (2 to 178) F has this code:
=IF(ISTEXT(INDIRECT("B"&ROW())),HYPERLINK(" url to the Spreadsheet.COM/edit/&range=B" &MATCH(INDIRECT("B"&ROW()),$B$179:$B)+178,"Link to "&B2),)
The opening IF statement keeps the sheet clean. We test if there is Text in Column B of the Row. This code is contained in all 177 Rows of the Spreadsheet, Column F2:F178.
IF( ISTEXT( INDIRECT( "B" &ROW() ) ), What we want to do if there is text , what we want to do otherwise )
Hyperlink gives us a quick click that gets us to the Row entry on the Spreadsheet.
HYPERLINK(" url to the Spreadsheet.COM/edit/&range=B" &MATCH( INDIRECT("B" & ROW() ) , $B$179:$B ) +178 , "The Text we want to be a clickable LInk )
I used the MATCH function to FETCH the Row of the Spreadsheet to link. The alternative, VLOOKUP() function would give us the first result encountered. In contrast, Match will fetch the highest Row in the range. A problem arises as the form evolves. For example, Intel Reports every three months. So we would have an Entry for 10/xx/2023. Later there would be an entry for 01/xx/2024 (Further down the Spreadsheet). VLOOKUP would always fetch the result on 10/xx/2023. MATCH will fetch to last entry.
&MATCH( INDIRECT("B" & ROW() )
The Ampersand attaches the result of the MATCH function to the previous string. In this case, the URL. This will result a link pointing to Column B of the Row of Interest.
Column F will always update the Link depending on the Result fetched for the Day/Time.
Lastly, on Column F of the Entries Portion of the Spreadsheet:
=IF( ISTEXT( INDIRECT("B" &ROW() ) ) , HYPERLINK("https://docs.google.com/ Your Spreadsheet Link...&range=B" &ROW( VLOOKUP( $B179, $B$2 : $C$178 , 2 ,FALSE)) , "Clickable Text " & B179 ) , )
That snippet was copied from row 179 of my Spreadsheet. I expect it would be self-explanatory at this point. The difference in this link from the previous is the VLOOKUP function was used. The search range should only have one filtered result from the Entries portion.
I hope you found this post helpful and informative. If you did, please like and share it with your fellow investors. And don't forget to follow me for more tips and tools on how to make smart investment decisions. Until next time,
#HappyInvesting #EarningsDates #StockPortfolio #InvestmentTips #StockMarket #EarningsCalendar #StockScreener #StockApp #StockSoftware