<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Dom Vacchiano</title>
    <link>https://www.domvacchiano.com/</link>
    <description>Coding tutorials for investors, stories from building BPIQ, and notes from Chicago.</description>
    <language>en</language>
    <lastBuildDate>Mon, 13 Oct 2025 02:51:49 GMT</lastBuildDate>
    <atom:link href="https://www.domvacchiano.com/feed.xml" rel="self" type="application/rss+xml"/>
    
    <item>
      <title>How We Grew BPIQ to 27K Followers | From Crickets to Community</title>
      <link>https://www.domvacchiano.com/how-we-grew-bpiq-to-27k-followers-from-crickets-to-community/</link>
      <guid isPermaLink="true">https://www.domvacchiano.com/how-we-grew-bpiq-to-27k-followers-from-crickets-to-community/</guid>
      <pubDate>Mon, 13 Oct 2025 02:10:00 GMT</pubDate>
      <category>business</category>
      <description>&lt;p&gt;&lt;img src=&quot;https://www.domvacchiano.com/assets/images/imported/twitter-followers-over-time-8e147d48739c.webp&quot; alt=&quot;Twitter Followers Over Time&quot;&gt;&lt;/p&gt;
&lt;p&gt;This is the story of how we grew &lt;a href=&quot;https://x.com/BiopharmIQ&quot;&gt;BiopharmIQ&lt;/a&gt; from 1K to 27K followers.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;the-early-days-2021&quot;&gt;The Early Days (2021)&lt;/h2&gt;
&lt;p&gt;BiopharmIQ started as a simple idea: provide needle-moving data to biotech investors.&lt;/p&gt;
&lt;p&gt;We used X as a platform to reach potential users, but for the first year, we were posting into the void.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://x.com/BiopharmIQ&quot;&gt;BiopharmIQ&lt;/a&gt; had barely 1,000 followers, and it felt like shouting into an empty room.&lt;/p&gt;
&lt;p&gt;If you’ve ever tried to build an audience online, you know the feeling: you put in the work, you post consistently, and... nothing.&lt;/p&gt;
&lt;p&gt;Our tweets were factual, technical, and... lifeless. We were “informing,” not connecting. The follower count barely moved all year.&lt;/p&gt;
&lt;p&gt;As you can see from the below posts, blocks of information, no images, etc.
&lt;img src=&quot;https://www.domvacchiano.com/assets/images/imported/bpiq_twitter_2021-cc8b12d57b13.webp&quot; alt=&quot;bpiq_twitter_2021&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;the-expansion-2022&quot;&gt;The Expansion (2022)&lt;/h2&gt;
&lt;p&gt;In January 2022, we decided to try X ads.&lt;/p&gt;
&lt;p&gt;It worked, sort of. Our follower count exploded. We gained thousands of new followers in a few months.&lt;br&gt;
But something felt off.&lt;/p&gt;
&lt;p&gt;Engagement didn’t move. We had a big audience, but it felt like a room full of ghosts.&lt;br&gt;
No one was replying, no one was discussing, and no one seemed to care.&lt;/p&gt;
&lt;p&gt;That’s when it hit me: follower count is a &lt;strong&gt;vanity metric&lt;/strong&gt; unless it reflects real engagement.&lt;/p&gt;
&lt;p&gt;We turned off the ads later that year, grateful for the experiment but realizing we hadn’t built what we truly wanted, a &lt;em&gt;community.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;the-turning-point-2023&quot;&gt;The Turning Point (2023)&lt;/h2&gt;
&lt;p&gt;Then came the shift.&lt;/p&gt;
&lt;p&gt;In January 2023, I bought &lt;a href=&quot;https://www.dagorenouf.com/how-to-dominate-twitter/&quot;&gt;Dagobert’s &amp;quot;How to Dominate Twitter&amp;quot;&lt;/a&gt; course. It completely reframed how I thought about the platform, and honestly, about the internet in general.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Social media is just like real life:&lt;br&gt;
Give twice, ask once.&lt;br&gt;
Make real connections, not superficial ones.&lt;br&gt;
Provide value, and people will find you.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Those ideas clicked immediately.&lt;/p&gt;
&lt;p&gt;We stopped treating Twitter like a broadcast channel and started treating it like a conversation.&lt;br&gt;
Instead of chasing algorithms, we focused on &lt;em&gt;people.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Here’s what changed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We focused on providing &lt;strong&gt;high-value insights&lt;/strong&gt;, not marketing blurbs.&lt;/li&gt;
&lt;li&gt;We engaged with others who cared about the same space.&lt;/li&gt;
&lt;li&gt;We amplified other voices doing great work.&lt;/li&gt;
&lt;li&gt;We spoke like humans, not analysts.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And that’s when everything started to move again.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;the-growth-that-mattered-20232024&quot;&gt;The Growth That Mattered (2023–2024)&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.domvacchiano.com/assets/images/imported/twitter-followers-over-time-8e147d48739c.webp&quot; alt=&quot;Twitter Followers Over Time&quot;&gt;&lt;/p&gt;
&lt;p&gt;If you look back at the chart, you can see the second inflection point in early 2023, the slope climbs again, but this time it &lt;em&gt;means&lt;/em&gt; something.&lt;/p&gt;
&lt;p&gt;From 2023 to &lt;em&gt;today&lt;/em&gt;, our followers grew from 10,000 to 27,000.&lt;br&gt;
But more importantly, the &lt;em&gt;feel&lt;/em&gt; of the community changed.&lt;br&gt;
We started seeing real conversations, thoughtful replies, and collaborations that grew organically.&lt;/p&gt;
&lt;p&gt;The page felt &lt;strong&gt;alive.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;BiopharmIQ was no longer just an account, it was piece of the biotech Twitter ecosystem.&lt;br&gt;
We were learning, sharing, and growing alongside our audience.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;the-principles-that-made-it-work&quot;&gt;The Principles That Made It Work&lt;/h2&gt;
&lt;p&gt;Looking back, the growth wasn’t magic. It was mindset.&lt;/p&gt;
&lt;p&gt;Here are the four principles that changed everything:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Give more than you take.&lt;/strong&gt;&lt;br&gt;
The algorithm rewards value, because people do.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Engage &amp;gt; broadcast.&lt;/strong&gt;&lt;br&gt;
Communities are built in the replies, not the timeline.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Authenticity scales slower, but lasts longer.&lt;/strong&gt;&lt;br&gt;
People remember your tone more than your stats.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Metrics are mirrors, not meaning.&lt;/strong&gt;&lt;br&gt;
They reflect what’s working, but they aren’t the goal.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;We stopped chasing numbers and started nurturing relationships.&lt;br&gt;
That’s when everything changed.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you’re building a brand, a startup, or a personal platform online, remember this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Every follower is a person.&lt;br&gt;
And people don’t follow algorithms, they follow &lt;em&gt;value.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That’s how BiopharmIQ grew from crickets to community.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Thanks for reading! If you’re interested in hearing more about my stories building and growing BPIQ, or using AI, follow along at &lt;a href=&quot;https://twitter.com/DomVacchiano&quot;&gt;@DomVacchiano&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Build a Stock Screener with Python (Part 3): Working with CSV Files</title>
      <link>https://www.domvacchiano.com/build-a-stock-screener-with-python-export-to-csv/</link>
      <guid isPermaLink="true">https://www.domvacchiano.com/build-a-stock-screener-with-python-export-to-csv/</guid>
      <pubDate>Tue, 22 Jul 2025 04:23:00 GMT</pubDate>
      <category>coding_tutorial</category><category>stock_screener_1</category><category>tutorial</category>
      <description>&lt;p&gt;Let&apos;s get our data into CSV/Excel! &lt;a href=&quot;https://github.com/vacchiano/stock-screener-3-csv&quot;&gt;Final GitHub Repo.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Final output:&lt;/strong&gt;
&lt;img src=&quot;https://www.domvacchiano.com/assets/images/imported/screenshot-2025-07-22-083129-2c81a2f8904c.webp&quot; alt=&quot;BPIQ Stock Screener Excel Output&quot;&gt;&lt;/p&gt;
&lt;p&gt;In &lt;a href=&quot;https://www.domvacchiano.com/build-a-stock-screener-with-python-adding-catalyst-data/&quot;&gt;Part 2&lt;/a&gt;, we pulled biotech catalyst data into our stock screener using the &lt;a href=&quot;https://www.bpiq.com&quot;&gt;BPIQ API&lt;/a&gt;. Up to this point we display the stock screener in our terminal. It would be more useful if we could save the data for future reference. In this walkthrough (Part 3) that&apos;s what we&apos;ll do.&lt;/p&gt;
&lt;p&gt;We will read in data from a csv file and write/export our stock screener data to a separate CSV/Excel file..&lt;/p&gt;
&lt;p&gt;If you haven&apos;t seen &lt;a href=&quot;https://www.domvacchiano.com/build-a-stock-screener-with-python-adding-catalyst-data/&quot;&gt;Part 2&lt;/a&gt; (&lt;a href=&quot;https://www.domvacchiano.com/python-stock-screener-basic/&quot;&gt;or Part 1&lt;/a&gt;), check them out. They are quick and will get you up to speed. However, you can grab the base code &lt;a href=&quot;https://github.com/vacchiano/python-stock-screener-part-2&quot;&gt;from GitHub&lt;/a&gt; and follow along starting from this Part 3 exercise.&lt;/p&gt;
&lt;h2 id=&quot;overview-of-steps&quot;&gt;Overview of Steps:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Create a CSV file with tickers of interest.&lt;/li&gt;
&lt;li&gt;Update our main() function to ingest these tickers.&lt;/li&gt;
&lt;li&gt;Update our get_catalyst_data() function to get BPIQ Big Movers.&lt;/li&gt;
&lt;li&gt;Update our main() function to write our data to a csv file.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;creating-a-csv-file-with-tickers-of-interest&quot;&gt;Creating a csv file with tickers of interest:&lt;/h3&gt;
&lt;p&gt;In Part 1 and Part 2 we read in tickers from a .txt file, but who uses .txt files? (I&apos;ll admit I sometimes do for quick notes - tisk, tisk). You probably store your stock portfolio in csv/excel files (hopefully G-Sheets).&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;First, create a new file in your project directory &apos;tickers.csv&apos; and add in a row for each ticker and company name. Here is my example:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;ticker, company
ARCT, Arcturus Tx
IONS, Ionis Pharma
FBIO, Fortress Bio
KALA, Kala Bio
HRMY, Harmony Bio
LRMR, Larimar Tx
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;updating-our-main-function-to-ingest-these-tickers&quot;&gt;Updating our main() function to ingest these tickers.&lt;/h3&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Let&apos;s update our main() function to read the tickers in from the csv file instead of the txt file:&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;First we want to import a built in python module &apos;csv&apos; to handle interacting with our csv files, so at the top add:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import csv # &amp;lt;== NEW FROM PART 2
from datetime import date, timedelta
... # prev imports below
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Next update the main() function to open the csv, read it into a DictReader object that is iterable and stores each row in a dictionary using the column header as the key. We need to also update the calls to the other functions to pass in the ticker:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def main():
    # with open(&amp;quot;tickers.txt&amp;quot;) as f:
    #     tickers = [line.strip().upper() for line in f if line.strip()]

    # NEW ====
    with open(&amp;quot;tickers.csv&amp;quot;, &amp;quot;r&amp;quot;) as file:
        # creates an iterable object with a dictionary for each row using the headers as the key
        reader = csv.DictReader(file)
        ticker_data_list = []
        for row in reader:
            print(row)
            ticker_data_list.append(row)

    results = []
    for ticker_dict in ticker_data_list: # &amp;lt;=== UPDATE
        data = get_stock_data(ticker_dict[&amp;quot;ticker&amp;quot;]) # &amp;lt;=== UPDATE
        catalyst_data = get_catalyst_data(ticker_dict[&amp;quot;ticker&amp;quot;]) # &amp;lt;=== UPDATE
        results.append([
            data[&amp;quot;Ticker&amp;quot;],
            format_number(data[&amp;quot;Market Cap&amp;quot;]),
            format_number(data[&amp;quot;EV&amp;quot;]),
            format_number(data[&amp;quot;Cash&amp;quot;]),
            f&amp;quot;{data[&apos;EV/Cash&apos;]:.2f}&amp;quot; if data[&amp;quot;EV/Cash&amp;quot;] else &amp;quot;-&amp;quot;,
            catalyst_data # &amp;lt;== NEW FROM PART 1
        ])

    headers = [&amp;quot;Tickers&amp;quot;, &amp;quot;Market Cap&amp;quot;, &amp;quot;EV&amp;quot;, &amp;quot;Cash&amp;quot;, &amp;quot;EV/Cash&amp;quot;, &amp;quot;Num Catalysts&amp;quot;]
    print(tabulate(results, headers=headers, tablefmt=&amp;quot;pretty&amp;quot;))
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;update-our-get_catalyst_data-function-to-get-bpiq-big-movers&quot;&gt;Update our get_catalyst_data() function to get BPIQ Big Movers&lt;/h3&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Now let&apos;s update our get_catalyst_data function to filter for &lt;a href=&quot;https://app.bpiq.com/big-movers&quot;&gt;BPIQ Big Movers&lt;/a&gt; and also return more catalyst data (not just the count).&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def get_catalyst_data(ticker):
    today = date.today()
    months_to_add = 3
    future_date = today + timedelta(days=months_to_add*30)

    # call to bpiq api ==== NEW - ADDED &amp;amp;mover=true to end &amp;gt;&amp;gt;
    url = f&apos;https://api.bpiq.com/api/v1/drugs/?ticker={ticker}&amp;amp;catalyst_date_max={future_date}&amp;amp;mover=true&apos;
    headers = {
        &apos;Authorization&apos;: f&apos;Token {credentials.BPIQ_API_KEY}&apos;
    }

    response = requests.get(url, headers=headers)

    if response.status_code == 200:
        data = response.json()
        # ================ NEW ===============
        catalyst_data = []
        for result in data[&amp;quot;results&amp;quot;]:
            catalyst_data.append({
                &amp;quot;drug_name&amp;quot;: result[&amp;quot;drug_name&amp;quot;],
                &amp;quot;indication&amp;quot;: result[&amp;quot;indications_text&amp;quot;],
                &amp;quot;catalyst_event&amp;quot;: result[&amp;quot;stage_event&amp;quot;][&amp;quot;label&amp;quot;],
                &amp;quot;catalyst_date&amp;quot;: result[&amp;quot;catalyst_date_text&amp;quot;],

            })
        print(catalyst_data)
    else:
        print(f&amp;quot;Request failed with status code {response.status_code}&amp;quot;)
        return &amp;quot;-&amp;quot;
    
    return catalyst_data # &amp;lt;==== UPDATED
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We updated our BPIQ API call to filter for Big/Suspected Movers, and also return a list of dictionaries containing catalyst details like drug, indication, event details, and timing.&lt;/p&gt;
&lt;h3 id=&quot;update-our-main-function-to-write-our-data-to-a-csv-file&quot;&gt;Update our main() function to write our data to a csv file&lt;/h3&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;We need to update our main function again, this time to write our data to a csv file. We will include the fundamental stock data and the catalyst data.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def main():
    # with open(&amp;quot;tickers.txt&amp;quot;) as f:
    #     tickers = [line.strip().upper() for line in f if line.strip()]

    # NEW ====
    with open(&amp;quot;tickers.csv&amp;quot;, &amp;quot;r&amp;quot;) as file:
        # creates an iterable object with a dictionary for each row using the headers as the key
        reader = csv.DictReader(file)
        ticker_data_list = []
        for row in reader:
            ticker_data_list.append(row)

    results = []
    for ticker_dict in ticker_data_list: # &amp;lt;=== UPDATE
        data = get_stock_data(ticker_dict[&amp;quot;ticker&amp;quot;]) # &amp;lt;=== UPDATE
        catalyst_data = get_catalyst_data(ticker_dict[&amp;quot;ticker&amp;quot;]) # &amp;lt;=== UPDATE
        results.append([
            data[&amp;quot;Ticker&amp;quot;],
            format_number(data[&amp;quot;Market Cap&amp;quot;]),
            format_number(data[&amp;quot;EV&amp;quot;]),
            format_number(data[&amp;quot;Cash&amp;quot;]),
            f&amp;quot;{data[&apos;EV/Cash&apos;]:.2f}&amp;quot; if data[&amp;quot;EV/Cash&amp;quot;] else &amp;quot;-&amp;quot;,
            catalyst_data
        ])

    # ===== NEW ===
    with open(&amp;quot;catalyst_data.csv&amp;quot;, &amp;quot;w&amp;quot;, newline=&apos;&apos;) as outfile:
        csv_writer = csv.writer(outfile, quotechar=&apos;&amp;quot;&apos;, quoting=csv.QUOTE_MINIMAL)
        csv_writer.writerow([&amp;quot;Tickers&amp;quot;, &amp;quot;Market Cap&amp;quot;, &amp;quot;EV&amp;quot;, &amp;quot;Cash&amp;quot;, &amp;quot;EV/Cash&amp;quot;, &amp;quot;Drug&amp;quot;, &amp;quot;Indication&amp;quot;, &amp;quot;Event&amp;quot;, &amp;quot;Date&amp;quot;])
        for result in results:
            csv_writer.writerow([
                result[0], 
                result[1], 
                result[2], 
                result[3], 
                result[4], 
                result[5][0].get(&amp;quot;drug_name&amp;quot;, &amp;quot;&amp;quot;), 
                result[5][0].get(&amp;quot;indication&amp;quot;, &amp;quot;&amp;quot;), 
                result[5][0].get(&amp;quot;catalyst_event&amp;quot;, &amp;quot;&amp;quot;), 
                result[5][0].get(&amp;quot;catalyst_date&amp;quot;, &amp;quot;&amp;quot;)
            ])

    # ==== OLD ===
    # headers = [&amp;quot;Tickers&amp;quot;, &amp;quot;Market Cap&amp;quot;, &amp;quot;EV&amp;quot;, &amp;quot;Cash&amp;quot;, &amp;quot;EV/Cash&amp;quot;, &amp;quot;Num Catalysts&amp;quot;]
    # print(tabulate(results, headers=headers, tablefmt=&amp;quot;pretty&amp;quot;))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We use python&apos;s built-in csv module again to write our data to a csv file. We add the stock data and then the first Big Mover Catalyst event for each ticker if they have one.&lt;/p&gt;
&lt;p&gt;If you run the program you should see a new file &amp;quot;catalyst_data.csv&amp;quot;. Open it in Excel and you should see all the data! &lt;a href=&quot;https://github.com/vacchiano/stock-screener-3-csv&quot;&gt;Final GitHub Repo.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.domvacchiano.com/assets/images/imported/screenshot-2025-07-22-083129-2c81a2f8904c.webp&quot; alt=&quot;BPIQ Stock Screener Excel Output&quot;&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Build a Stock Screener with Python (Part 2): Adding Catalyst Data</title>
      <link>https://www.domvacchiano.com/build-a-stock-screener-with-python-adding-catalyst-data/</link>
      <guid isPermaLink="true">https://www.domvacchiano.com/build-a-stock-screener-with-python-adding-catalyst-data/</guid>
      <pubDate>Fri, 11 Jul 2025 23:27:00 GMT</pubDate>
      <category>coding_tutorial</category><category>stock_screener_1</category><category>tutorial</category>
      <description>&lt;p&gt;&lt;img src=&quot;https://www.domvacchiano.com/assets/images/imported/build-a-stock-screener-in-python-part-2-1-53ba3e732e2c.webp&quot; alt=&quot;Build a stock screener in python (part 2)&quot;&gt;&lt;/p&gt;
&lt;p&gt;We will walk through how to pull biotech catalyst data (using Python and &lt;a href=&quot;https://www.bpiq.com/bpiq-api&quot;&gt;BPIQ&lt;/a&gt;) into a stock screener with other fundamental data about specific tickers you are interested in.&lt;/p&gt;
&lt;p&gt;If you&apos;re interested in biotech investing and coding - let&apos;s go!&lt;/p&gt;
&lt;h3 id=&quot;here-is-the-final-screener&quot;&gt;Here is the final screener:&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;+---------+------------+---------+---------+---------+---------------+
| Tickers | Market Cap |   EV    |  Cash   | EV/Cash | Num Catalysts |
+---------+------------+---------+---------+---------+---------------+
|  PRAX   |   $1.0B    | $529.6M | $328.0M |  1.61   |       2       |
|  ATXS   |  $359.5M   | $107.8M | $295.1M |  0.37   |       2       |
|  ATAI   |  $555.8M   | $369.7M | $98.2M  |  3.76   |       3       |
|  RCUS   |  $987.9M   | -$54.1M | $997.0M |  -0.05  |       2       |
|  HRMY   |   $2.0B    |  $1.5B  | $507.0M |  2.93   |       2       |
|  VKTX   |   $3.5B    |  $2.1B  | $851.9M |  2.49   |       0       |
|  MRUS   |   $4.1B    |  $3.2B  | $458.3M |  6.96   |       0       |
|  DAWN   |  $688.2M   | $188.8M | $473.0M |  0.40   |       0       |
|  REPL   |  $845.6M   | $308.5M | $483.8M |  0.64   |       1       |
|  ASND   |   $10.6B   | $10.7B  | $517.9M |  20.76  |       3       |
|  PHVS   |   $1.4B    | $723.3M | $236.5M |  3.06   |       1       |
+---------+------------+---------+---------+---------+---------------+
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In &lt;a href=&quot;https://www.domvacchiano.com/python-stock-screener-basic/&quot;&gt;Part 1&lt;/a&gt; we walked through how to create a basic screener in python in ~10 minutes. We will use that as our starting base and build upon that. You can find the &lt;a href=&quot;https://github.com/vacchiano/python-stock-screener-basic/tree/master&quot;&gt;starting code in this GitHub repo.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In Part 2 (this one), we will pull biotech catalysts and merge them into our output table screener that we built in Part 1. In this example we will display how many catalysts each ticker has in the next 90 days.&lt;/p&gt;
&lt;p&gt;You can see the &lt;a href=&quot;https://github.com/vacchiano/python-stock-screener-part-2&quot;&gt;final code for this Part 2 on GitHub here.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Before we begin remember to create/activate your virtual environment and install any packages from Part 1. If you are pulling the code for Part 1 from GitHub, you can install the python packages from Part 1 by running:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; pip install -r requirements.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;we-are-going-to-make-2-upgrades&quot;&gt;We are going to make 2 upgrades:&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Add a new function get_catalyst_data that will accept a ticker and call the &lt;a href=&quot;https://www.bpiq.com&quot;&gt;BPIQ&lt;/a&gt; API to fetch the catalysts.&lt;/li&gt;
&lt;li&gt;Update our main function to call the new get_catalyst_data function and handle adding that to our table output.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;add-new-function-get_catalyst_data&quot;&gt;Add New Function get_catalyst_data&lt;/h3&gt;
&lt;p&gt;Before we create the new function we need to install a few additional packages and update our imports at the top of our script.&lt;/p&gt;
&lt;p&gt;Start by installing requests, which we will use to call the &lt;a href=&quot;https://www.bpiq.com&quot;&gt;BPIQ API&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; pip install requests
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now let&apos;s update the imports at the top of our script to include requests. We will also import a standard (built-in) python library called datetime.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from datetime import date, timedelta # NEW
import requests # NEW
import yfinance as yf
from tabulate import tabulate
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We have the previous imports of yfinance and tabulate, but added datetime and requests.&lt;/p&gt;
&lt;p&gt;Next create the function get_catalyst_data that:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Accepts a parameter ticker.&lt;/li&gt;
&lt;li&gt;Sets how far ahead we want to limit catalyst dates.&lt;/li&gt;
&lt;li&gt;Calls the &lt;a href=&quot;https://www.bpiq.com&quot;&gt;BPIQ API&lt;/a&gt; and handles the API response.&lt;/li&gt;
&lt;li&gt;Returns either a dash string or the number of catalysts in that date range.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def get_catalyst_data(ticker):
    today = date.today()
    months_to_add = 3
    future_date = today + timedelta(days=months_to_add*30)

    # call to bpiq api
    url = f&apos;https://api.bpiq.com/api/v1/drugs/?ticker={ticker}&amp;amp;catalyst_date_max={future_date}&apos;
    headers = {
        &apos;Authorization&apos;: f&apos;Token {credentials.BPIQ_API_KEY}&apos;
    }

    response = requests.get(url, headers=headers)

    if response.status_code == 200:
        data = response.json()
    else:
        print(f&amp;quot;Request failed with status code {response.status_code}&amp;quot;)
        return &amp;quot;-&amp;quot;
    
    return data.get(&amp;quot;count&amp;quot;, &amp;quot;-&amp;quot;)

        # return the drug/catalyst data
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You might have noticed we have &amp;quot;{credentials.BPIQ_API_KEY}&amp;quot;. To make the call to the BPIQ API we need an API Key. You can get a free trial &lt;a href=&quot;https://www.bpiq.com/bpiq-api&quot;&gt;API Key from BPIQ&lt;/a&gt;. Once you get your key you can replace the code &amp;quot;{credentials.BPIQ_API_KEY}&amp;quot; with your API key &amp;quot;YOUR-API-KEY&amp;quot;.&lt;/p&gt;
&lt;p&gt;If you want to follow using the &amp;quot;{credentials.BPIQ_API_KEY}&amp;quot; method then:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create a new file &amp;quot;credentials.py&amp;quot; and put your API Key in it like so:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;BPIQ_API_KEY = &amp;quot;YOUR-API-KEY&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Import credentials at the top of your main python script.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from datetime import date, timedelta 
import credentials # &amp;lt;== NEW

import requests 
import yfinance as yf
from tabulate import tabulate
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And with that we are finished with our function to get catalysts!&lt;/p&gt;
&lt;h3 id=&quot;now-lets-update-our-main-function-to-call-our-new-function-and-handle-the-output&quot;&gt;Now let&apos;s update our main function to call our new function and handle the output&lt;/h3&gt;
&lt;p&gt;You can see below we add 2 new lines of code and update 2 previous lines of code.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def main():
    with open(&amp;quot;tickers.txt&amp;quot;) as f:
        tickers = [line.strip().upper() for line in f if line.strip()]

    results = []
    for ticker in tickers:
        data = get_stock_data(ticker)
        catalyst_data = get_catalyst_data(ticker) # &amp;lt;== NEW
        results.append([
            data[&amp;quot;Ticker&amp;quot;],
            format_number(data[&amp;quot;Market Cap&amp;quot;]),
            format_number(data[&amp;quot;EV&amp;quot;]),
            format_number(data[&amp;quot;Cash&amp;quot;]),
            f&amp;quot;{data[&apos;EV/Cash&apos;]:.2f}&amp;quot; if data[&amp;quot;EV/Cash&amp;quot;] else &amp;quot;-&amp;quot;, # &amp;lt;== UPDATED
            catalyst_data # &amp;lt;== NEW
        ])

    headers = [&amp;quot;Tickers&amp;quot;, &amp;quot;Market Cap&amp;quot;, &amp;quot;EV&amp;quot;, &amp;quot;Cash&amp;quot;, &amp;quot;EV/Cash&amp;quot;, &amp;quot;Num Catalysts&amp;quot;] # &amp;lt;== UPDATED
    print(tabulate(results, headers=headers, tablefmt=&amp;quot;pretty&amp;quot;))
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;now-lets-run-our-script-and-see-our-updated-screener&quot;&gt;Now let&apos;s run our script and see our Updated Screener:&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; python script.py
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;... It may run for a few seconds but be patient... 🎉&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.domvacchiano.com/assets/images/imported/screenshot-2025-07-12-150311-436af4e91002.webp&quot; alt=&quot;BPIQ Screener Output&quot;&gt;&lt;/p&gt;
&lt;p&gt;You can use this to check EV/Cash against how many near-term catalysts companies have, or modify the data to find different opportunities!&lt;/p&gt;
&lt;p&gt;Want to pull this data into Excel? &lt;a href=&quot;https://www.domvacchiano.com/build-a-stock-screener-with-python-export-to-csv/&quot;&gt;Check out Part 3 and do just that!&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Build a Stock Screener with Python (Part 1): Initial Stock Screener</title>
      <link>https://www.domvacchiano.com/python-stock-screener-basic/</link>
      <guid isPermaLink="true">https://www.domvacchiano.com/python-stock-screener-basic/</guid>
      <pubDate>Tue, 08 Jul 2025 11:58:00 GMT</pubDate>
      <category>coding_tutorial</category><category>stock_screener_1</category><category>tutorial</category>
      <description>&lt;p&gt;&lt;img src=&quot;https://www.domvacchiano.com/assets/images/imported/build-a-stock-screener-in-python-in-10-minutes-a61af18e4d68.webp&quot; alt=&quot;Build a stock screener in python in 10 minutes&quot;&gt;
If you are interested in investing and/or coding, this post will teach you how to create a basic stock screener in under 10 minutes using python.&lt;/p&gt;
&lt;p&gt;The python script will pull tickers we put into a .txt file and fetch the market cap, EV, and cash. We will display this in a table format so we can quickly screen the metrics.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/vacchiano/python-stock-screener-basic&quot;&gt;&lt;em&gt;You can find the full code in the repo&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;
&lt;strong&gt;The final output will look like this:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;+---------+------------+----------+---------+---------+
| Tickers | Market Cap |    EV    |  Cash   | EV/Cash |
+---------+------------+----------+---------+---------+
|  PRAX   |  $950.8M   | $529.6M  | $328.0M |  1.61   |
|  ATXS   |  $349.9M   | $107.8M  | $295.1M |  0.37   |
|  ATAI   |  $583.4M   | $369.7M  | $98.2M  |  3.76   |
|  RCUS   |  $870.4M   | -$54.1M  | $997.0M |  -0.05  |
|  HRMY   |   $1.9B    |  $1.5B   | $507.0M |  2.93   |
|  AAPL   |  $3135.8B  | $3114.1B | $48.5B  |  64.21  |
|  TLSA   |  $178.8M   | $172.5M  |  $3.7M  |  46.32  |
|  NFLX   |  $548.8B   | $579.1B  |  $8.4B  |  69.18  |
|  GOOG   |  $2149.5B  | $2085.8B | $95.3B  |  21.88  |
+---------+------------+----------+---------+---------+
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;\&lt;/p&gt;
&lt;h4 id=&quot;lets-get-started&quot;&gt;Let&apos;s get started!&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;The first thing you want to do is confirm you have python installed on your machine or &lt;a href=&quot;https://www.python.org/downloads/&quot;&gt;download and install it.&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Once downloaded, via your folder system or terminal, navigate to the location you want to build this project and create a new file: &amp;quot;script.py&amp;quot;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;br&gt;
&lt;em&gt;Before we start coding we need to create a virtual environment and install a few python packages. Virtual environments allow us to install python packages in a standalone &apos;environment&apos; so we can use them for specific projects.&lt;/em&gt;&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;In your terminal &lt;a href=&quot;https://docs.python.org/3/library/venv.html&quot;&gt;create and activate&lt;/a&gt; a virtual environment named &apos;env&apos;:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; python -m venv env
&amp;gt;&amp;gt;&amp;gt; .\env\Scripts\activate
&amp;gt;&amp;gt;&amp;gt; (env)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;you should see (env) appear in your terminal after it&apos;s activated.&lt;/em&gt;&lt;/p&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;In your terminal with the active environment, let&apos;s install two packages we need for this project, yfinance &amp;amp; tabulate:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; pip install yfinance tabulate
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br&gt;
&lt;em&gt;Now let&apos;s code&lt;/em&gt; 💻🖥️&lt;/p&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;
&lt;p&gt;Our python script will consist of 3 functions:&lt;/p&gt;
&lt;p&gt;a. get_stock_data() - will accept a ticker and get the data from Yahoo Finance.&lt;/p&gt;
&lt;p&gt;b. format_number() - will handle formatting the number values to look better (e.g., $1M, $1B).&lt;/p&gt;
&lt;p&gt;c. main() - will read in the tickers we put into a .txt file and orchestrate the output.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;At the top of the script file, let&apos;s import the modules we installed.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;import yfinance as yf
from tabulate import tabulate
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;7&quot;&gt;
&lt;li&gt;Now let&apos;s create the get_stock_data function that will fetch the stock data for a ticker we pass in from yahoo finance.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;def get_stock_data(ticker):
    stock = yf.Ticker(ticker)
    
    try:
        info = stock.get_info()
        market_cap = info.get(&amp;quot;marketCap&amp;quot;, None)
        enterprise_value = info.get(&amp;quot;enterpriseValue&amp;quot;, None)
        total_cash = info.get(&amp;quot;totalCash&amp;quot;, None)


        ev_cash_ratio = (enterprise_value / total_cash) if enterprise_value and total_cash else None

    except Exception as e:
        print(f&amp;quot;Error fetching data for {ticker}: {e}&amp;quot;)
        return None


    return {
        &amp;quot;Ticker&amp;quot;: ticker,
        &amp;quot;Market Cap&amp;quot;: market_cap,
        &amp;quot;EV&amp;quot;: enterprise_value,
        &amp;quot;Cash&amp;quot;: total_cash,
        &amp;quot;EV/Cash&amp;quot;: ev_cash_ratio,
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;This function accepts a ticker, and uses the yfinance package to fetch the data about that ticker from yahoo finance. We return a dictionary with the fetched data.&lt;/em&gt;&lt;/p&gt;
&lt;ol start=&quot;8&quot;&gt;
&lt;li&gt;Next let&apos;s build our format_num function that will format the data values we fetched above to look &apos;prettier&apos;.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;def format_number(num):
    if num is None:
        return &amp;quot;-&amp;quot;
    
    is_neg = num &amp;lt; 0
    num = abs(num)

    if num &amp;gt; 1e9:
        formatted = f&amp;quot;${num/1e9:.1f}B&amp;quot;
    elif num &amp;gt; 1e6:
        formatted = f&amp;quot;${num/1e6:.1f}M&amp;quot;
    else:
        formatted = f&amp;quot;${num:,.0f}&amp;quot;

    return f&amp;quot;-{formatted}&amp;quot; if is_neg else formatted
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;We accept a number to be passed in, check if it&apos;s a positive or neg number, and then format for million/billions and decimals. We return the formatted number checking if it&apos;s a positive/negative number.&lt;/em&gt;&lt;/p&gt;
&lt;ol start=&quot;9&quot;&gt;
&lt;li&gt;Let&apos;s create our main function that will call our helper functions above and display the final table.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;def main():
    with open(&amp;quot;tickers.txt&amp;quot;) as f:
        tickers = [line.strip().upper() for line in f if line.strip()]

    results = []
    for ticker in tickers:
        data = get_stock_data(ticker)
        results.append([
            data[&amp;quot;Ticker&amp;quot;],
            format_number(data[&amp;quot;Market Cap&amp;quot;]),
            format_number(data[&amp;quot;EV&amp;quot;]),
            format_number(data[&amp;quot;Cash&amp;quot;]),
            f&amp;quot;{data[&apos;EV/Cash&apos;]:.2f}&amp;quot; if data[&amp;quot;EV/Cash&amp;quot;] else &amp;quot;-&amp;quot;,
        ])

    headers = [&amp;quot;Tickers&amp;quot;, &amp;quot;Market Cap&amp;quot;, &amp;quot;EV&amp;quot;, &amp;quot;Cash&amp;quot;, &amp;quot;EV/Cash&amp;quot;]
    print(tabulate(results, headers=headers, tablefmt=&amp;quot;pretty&amp;quot;))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;We start by reading in tickers from a file &apos;tickers.txt&apos;, calling our get_stock_data function for each ticker, and then displaying our results using the tabulate package.&lt;/em&gt;&lt;/p&gt;
&lt;ol start=&quot;10&quot;&gt;
&lt;li&gt;
&lt;p&gt;Before we run our script we need to create a &apos;tickers.txt&apos; file and add 2 final lines of code to our &apos;script.py&apos; file.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In the same directory/folder as your &apos;scripts.py&apos; file create another file &apos;tickers.txt&apos; and add a ticker you want to screen to each line (and save the file).&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;PRAX
ATXS
ATAI
RCUS
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;12&quot;&gt;
&lt;li&gt;The last 2 lines of code our script needs is to call our main() function when we run our script. We can do that by checking if the name of the module is main() (which happens when we run our script directly).&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;if __name__ == &amp;quot;__main__&amp;quot;:
    main()
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;13&quot;&gt;
&lt;li&gt;Now run the script!&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; python script.py
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br&gt;
&lt;em&gt;You should see the table output with the information for the tickers you put in your .txt file&lt;/em&gt; 🎉 &lt;a href=&quot;https://www.domvacchiano.com/build-a-stock-screener-with-python-adding-catalyst-data/&quot;&gt;Next up is Part 2 where we pull in catalyst data...&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;+---------+------------+----------+---------+---------+
| Tickers | Market Cap |    EV    |  Cash   | EV/Cash |
+---------+------------+----------+---------+---------+
|  PRAX   |  $950.8M   | $529.6M  | $328.0M |  1.61   |
|  ATXS   |  $349.9M   | $107.8M  | $295.1M |  0.37   |
|  ATAI   |  $583.4M   | $369.7M  | $98.2M  |  3.76   |
|  RCUS   |  $870.4M   | -$54.1M  | $997.0M |  -0.05  |
|  HRMY   |   $1.9B    |  $1.5B   | $507.0M |  2.93   |
|  AAPL   |  $3135.8B  | $3114.1B | $48.5B  |  64.21  |
|  TLSA   |  $178.8M   | $172.5M  |  $3.7M  |  46.32  |
|  NFLX   |  $548.8B   | $579.1B  |  $8.4B  |  69.18  |
|  GOOG   |  $2149.5B  | $2085.8B | $95.3B  |  21.88  |
+---------+------------+----------+---------+---------+
&lt;/code&gt;&lt;/pre&gt;
</description>
    </item>
    
    <item>
      <title>I Joined Coding Dojo: Mid Point Review</title>
      <link>https://www.domvacchiano.com/coding-dojo-mid-point/</link>
      <guid isPermaLink="true">https://www.domvacchiano.com/coding-dojo-mid-point/</guid>
      <pubDate>Mon, 06 Jul 2020 19:22:00 GMT</pubDate>
      <category>personal</category>
      <description>&lt;hr&gt;
&lt;p&gt;At this point I’ve spent over 120 hours within the code bootcamp. I’m at week 8 of 15.&lt;/p&gt;
&lt;p&gt;If you haven’t already read my initial thoughts as to why I chose Coding Dojo over other bootcamps, you can &lt;a href=&quot;https://www.domvacchiano.com/coding-dojo-initial-thoughts/&quot;&gt;check that out here&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I’ve a couple people reach out to me via my &lt;strong&gt;&lt;a href=&quot;https://twitter.com/DomVacchiano&quot;&gt;twitter&lt;/a&gt;&lt;/strong&gt; DM’s to ask about the bootcamp after reading my initial post, so I will include answers to their questions. I’m sure you may have similar questions if you are thinking about a bootcamp.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The first questions were regarding the content&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Since it’s an online course, everything is handled via the Coding Dojo learning portal:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.domvacchiano.com/assets/images/imported/0-umqEC5HY8koGiyRe-0deab2b063e3.webp&quot; alt=&quot;dashboard image&quot;&gt;&lt;/p&gt;
&lt;p&gt;The portal is where all the learning is done:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The learning modules which are video/text combos&lt;/li&gt;
&lt;li&gt;The assignments which build off the learning modules&lt;/li&gt;
&lt;li&gt;The live lecture recordings&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The live lectures happen twice weekly and are held via zoom for 1 hour each. In them the instructor goes over the current topic usually by completing one of the assignments. They are useful because the instructor explains things and you can ask questions.&lt;/p&gt;
&lt;p&gt;There is also a live chat similar to slack or discord. Within there you can interact with fellow students and instructors. You can also schedule 1-on-1 meetings with instructors to go over any problems.&lt;/p&gt;
&lt;p&gt;Many people (possibly even you) may be looking at a bootcamp as a way to make a career change. I took this bootcamp after going down a CS college degree, but working in a different industry after graduating. So all the concepts are not brand new, I’m using it as more a spring board.&lt;/p&gt;
&lt;p&gt;However if you are looking at bootcamps as a career change Coding Dojo does have a career services rep that helps you along the way. I haven’t personally used them so I can’t speak from experience.&lt;/p&gt;
&lt;p&gt;The career rep contacted us early on regarding setting up our LinkedIn profiles, pushing code to GitHub, and starting to prepare a resume. They stressed that the biggest thing companies are looking for is a portfolio of projects.&lt;/p&gt;
&lt;p&gt;The last 4 weeks of the course are dedicated to solo and group projects.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;My personal thoughts so far&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;After 8 weeks of spending 20–25 hours coding specifically related to Coding Dojo material (and probably more on self-learning as well) I can say that this is A LOT of material.&lt;/p&gt;
&lt;p&gt;Each week or two we cruise through a new major topic or tech. HTML, CSS, JS, Python, Django. Thankfully I was familiar with most of them (barre Django). You could easily spend 4x the amount of time on each concept and still have room to learn more.&lt;/p&gt;
&lt;p&gt;However, the chronological order paired with the instructors teaching style helps the concepts make sense. They understand what you know/don’t know since they taught you. So they don’t assume you understand certain tech. And most of the content is pre-recorded so it’s consistent.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Just like most things, repetitions are a huge factor in committing to memory.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;And so it comes down to putting your fingers on the keyboard, and coding. The nice thing is they give you the opportunity to code a bunch.&lt;/p&gt;
&lt;p&gt;Each topic sort of goes like this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Learn something [topic A]&lt;/li&gt;
&lt;li&gt;Practice [topic A]&lt;/li&gt;
&lt;li&gt;Learn something [topic B]&lt;/li&gt;
&lt;li&gt;Practice [topic A and topic B]&lt;/li&gt;
&lt;li&gt;So on..&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You can see from above you get a lot of practice with the various topics. I really like this approach to teaching.&lt;/p&gt;
&lt;p&gt;So far I am happy with the Coding Dojo experience and recommend it. I will be back in 4 weeks after completing the final projects, with my final thoughts.&lt;/p&gt;
&lt;p&gt;Until then you can follow along on my day-to-day coding and what’s it’s like inside via my Twitter: &lt;a href=&quot;https://twitter.com/DomVacchiano&quot;&gt;&lt;strong&gt;https://twitter.com/DomVacchiano&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
</description>
    </item>
    
    <item>
      <title>I Developed a Product at 18: Post-Mortem Review</title>
      <link>https://www.domvacchiano.com/i-developed-a-prod-at-18-review/</link>
      <guid isPermaLink="true">https://www.domvacchiano.com/i-developed-a-prod-at-18-review/</guid>
      <pubDate>Sat, 25 Apr 2020 17:06:00 GMT</pubDate>
      <category>business</category><category>personal</category>
      <description>&lt;hr&gt;
&lt;p&gt;It’s late May 2014, the school semester was just about to end and I had summer break on my mind. Was I going to get a job somewhere and earn some extra cash? Was there going to be a lot of parties?! (jk 😉 I wasn’t 21 yet).&lt;/p&gt;
&lt;p&gt;Actually, I was only 18 years old and was about to head home for the summer after finishing my freshman year at the University of Iowa. My parents lived outside Chicago so it was about a 3 hour drive back, nothing crazy.&lt;/p&gt;
&lt;p&gt;Remember how I was thinking about getting a job [parties]? Well during previous summer breaks I helped my dad with one of his side-project companies, usually entering data into a database. But this summer all my friends were either trying to get an internship or more commonly a job at a local store.&lt;/p&gt;
&lt;p&gt;I thought that might be a good idea, I could make some money and get some experience on my resume. But my dad had a better idea (parents usually have better ideas).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;His idea was to launch a product filling a need he had, keeping all those darn squirrels off his bird feeders.&lt;/strong&gt;
&lt;img src=&quot;https://www.domvacchiano.com/assets/images/imported/0-g9JRWnkg5u20Qk0r-d23ddfeb85f8.webp&quot; alt=&quot;squirrel on feeder&quot;&gt;&lt;/p&gt;
&lt;p&gt;My summer job basically was that I worked for him, doing all the work myself under his guidance. It was almost like I was VC backed… 😂&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;That summer I learned more than I have in my entire life.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ok maybe that’s a bit of a marketing exaggeration but I did learn a great deal about marketing, product development, packaging and logistics, web development, finances, selling on Amazon, the list is almost endless.&lt;/p&gt;
&lt;p&gt;We laid out the schedule for the summer and each week I gave a presentation with the prior weeks accomplishments and deliverables. The general outline went something like this:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.domvacchiano.com/assets/images/imported/0-z8hUZ1aKkOlOarfh-1053b839936a.webp&quot; alt=&quot;plan of action&quot;&gt;&lt;/p&gt;
&lt;p&gt;I only had about 3 months to do all this so I got started ASAP and had to work quickly. The good news was that I was a eager and excited. This was the best summer job ever. The bad news was I had no experience doing any of this..&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Biz Plan &amp;amp; Competitive Analysis:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The very first thing I did was look at what competitive products were out there. If something already fit the need very well the whole entire thing could be a bust. After Googling a bit and looking on various marketplaces I didn’t find too much. Now that either meant that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nobody thought of this idea and it’s an untapped market (not likely)&lt;/li&gt;
&lt;li&gt;The market is too small and people don’t think there’s enough money to be made (more likely)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At the time I didn’t know any better, I thought everybody was an idiot and our product would have barely any competition. I also put together a business plan which contained some financial and market research to try and gauge how big the market was.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;One thing I did find was that the bird feeder industry is quite large and bird feeders are very common. I also looked at the prevalence of squirrels and those flying rats are everywhere.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;After this, the project was green lighted to continue onto the next phase (Stage-Gate model anyone?). At this point Squirrel Grease was born!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.domvacchiano.com/assets/images/imported/0-EqY9AjmABXZ1n4dz-a7bfd46f8307.webp&quot; alt=&quot;squirrel grease logo&quot;&gt;
&lt;sub&gt;rough logo, I know&lt;/sub&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Next Onto Research &amp;amp; Development&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;My dad comes from a science/PhD background and R&amp;amp;D is very large in that field. He wanted this product developed in a very scientific way. So what did I do?&lt;/p&gt;
&lt;p&gt;I ran a science experiment. R&amp;amp;D was broken down into 2 phases basically:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Research possible product candidates/formulations&lt;/li&gt;
&lt;li&gt;Test them against each other as well as a control&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I researched all sorts of stuff about squirrels and other mammals and what may deter them and what are the most slippery substances. I landed on a few different ideas that I wanted to test: (had a lot more that I tried)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Petroleum Jelly + Hot Sauce&lt;/li&gt;
&lt;li&gt;Petroleum Jelly + Cinnamon&lt;/li&gt;
&lt;li&gt;Oil + Hot Sauce&lt;/li&gt;
&lt;li&gt;Oil + Cinnamon&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I know I know, very complicated ingredients, cut me some slack though this was all new to me. I did spend a lot of time trying all sorts of hot sauces, oils, cinnamon, and preparing them in various ways like with heat.&lt;/p&gt;
&lt;p&gt;Next I set out to create the science experiments and see which formula worked best. I went to my local hardware/outdoor store, bought 4 bird feeder poles and spread them out across the backyard. I kept the far left one as control (no formulation) and applied a different product candidate to the others, then sat by the window…&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.domvacchiano.com/assets/images/imported/0-ku7SwWkL-wn-Z2fR-975a00c1bcab.webp&quot; alt=&quot;bird feeders experiment&quot;&gt;&lt;/p&gt;
&lt;p&gt;I sat there with my laptop and took notes of what I observed. After a couple days or weeks (I wish I had that laptop still to find this data) I decided that the product candidate to move forward with was… *drum roll please* &lt;strong&gt;Petroleum Jelly + Cinnamon.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I manufactured it in the kitchen by heating up petroleum jelly on the stove, adding in cinnamon, letting it cook, and then straining out the cinnamon.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.instagram.com/squirrel_grease/reel/rkh7IoRYXM/?hl=en&quot;&gt;Here is a short clip I found from Instagram of me making it back in the day.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;After successfully finding something that worked better than control, based on my expert scientific knowledge (lol) we had yet again passed another checkpoint (Stage-Gate model). It was time to move onto packaging and labeling.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bottling this thing up&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I had no idea where to begin at this phase. After a lot of Googling, I found out these various containers have specific names, I didn’t know what size to go with, what type of seal I needed, or even what type of lid. What I ended up doing was finding a company who made all sorts of containers and got a whole heap of samples to try out.&lt;/p&gt;
&lt;p&gt;From there I went with what I thought made sense based on one thing — what size I was getting the petroleum jelly. I was buying the petroleum jelly in bulk and wanted to be able to fill all the containers without wasting any. I think I settled on 8 oz. or 12 oz. containers.&lt;/p&gt;
&lt;p&gt;The labeling was another painful point for me. I wasn’t very aesthetically gifted when it came to design and I also had never printed labels before. I went to my local home office store (or probably Amazon) and bought a pack of printable Avery labels. I set out to design the label and after a lot of wasted paper (sorry trees) I landed on this beauty of a design:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.domvacchiano.com/assets/images/imported/0-oo64a_EMvBJLzKSt-4c8a3202bc46.webp&quot; alt=&quot;squirrel grease can&quot;&gt;&lt;/p&gt;
&lt;p&gt;The packaging and labeling portion bleeds into the marketing efforts so I also did things like look at competitors reviews to see what their customers were saying. One common theme was that the products washed away with rain, so I saw from our ‘test’ results that Squirrel Grease worked even after rainy days. I wanted to leverage this by including ‘Weather Resistant!” on the label.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Was I the marketing genius of my time? A whopping no, but at least I tried!&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Marketing &amp;amp; Digital Presence&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So far we had:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;laid out a business plan&lt;/li&gt;
&lt;li&gt;Developed the product&lt;/li&gt;
&lt;li&gt;Packaged and labeled her up&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now it was time to create the digital sales and marketing channels. Throughout high school I was interested a bit in coding and played around with html/css but nothing very serious. I knew one of the channels I wanted online was a website. I had no idea about payment processing but thought Amazon was a large marketplace and could help handle processing, inventory, invoices, etc. I also thought pursuing some social media marketing would be useful, probably because it’s what I was using personally. I didn’t know about paid ads but that would have been a good route to pursue.&lt;/p&gt;
&lt;p&gt;Out of interest I set out to build a website for Squirrel Grease, looking back I should have used an easier solution that could have handled the features I needed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Static info pages about the product&lt;/li&gt;
&lt;li&gt;Contact/Email form&lt;/li&gt;
&lt;li&gt;Ordering and payment processing&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It’s a pretty simple website and if I did it today I would go with Shopify. However being young and dumb (recurring theme? 😂) I built this website below. It’s taken down now but &lt;a href=&quot;https://web.archive.org/web/20160430070702/http://squirrelgrease.com/index.html&quot;&gt;here it was in all it’s glory&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.domvacchiano.com/assets/images/imported/0-QntaMH4a8uCxjm0K-c61b5c854cff.webp&quot; alt=&quot;Squirrel grease old website&quot;&gt;&lt;/p&gt;
&lt;p&gt;I set up Facebook, Instagram, YouTube, and Twitter accounts. I also listed the product on Amazon. I remember running into some trouble with Amazon, I needed the UPC number (Universal Product Code), the barcode and related EAN number in order to list and sell on Amazon. I can’t remember exactly but I had to go back and register this and add it to the label. After all that I listed it up on Amazon:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.domvacchiano.com/assets/images/imported/0-ZwO3Sd38nusUVyYW-17b7f88fb313.webp&quot; alt=&quot;Amazon listing for squirrel grease&quot;&gt;&lt;/p&gt;
&lt;p&gt;I didn’t set up a payment portal via the website because I didn’t know how so I just linked to the Amazon page. I think I sold about 10–15 of these over the course of a year or so. And you can see the whopping 3.5 star review. Still not sure if the 5 stars were just family members but I’ll take it.&lt;/p&gt;
&lt;p&gt;I also put together this illustrative promo video:&lt;/p&gt;
&lt;iframe width=&quot;680&quot; height=&quot;382&quot; src=&quot;https://www.youtube.com/embed/EVKK41F1N4E&quot; title=&quot;Squirrel Grease&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;strong&gt;Post-Mortem Review&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Sadly after returning to college I had to lay Squirrel Grease to rest. I kept making it for a little while mostly for my dad, and a few relatives who still use it to this day. Some day I may revive Squirrel Grease and give it a much needed face lift.&lt;/p&gt;
&lt;p&gt;Some of the biggest takeaways:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Developing a product is &lt;em&gt;wayyy&lt;/em&gt; more than just the product itself, you need to have some flavor for marketing, finances, business, design, etc.&lt;/li&gt;
&lt;li&gt;Easier is better — don’t do something just to do it. Make a list of what you need and pick the choice that accomplishes that with the lowest amount of friction.&lt;/li&gt;
&lt;li&gt;Stage-gating is a powerful tool. Check yourself and your idea/product/business to ensure the path still makes sense. Time is a valuable resource and this helps to conserve that.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Thanks for reading, if you enjoyed this&lt;/em&gt;&lt;/strong&gt; &lt;a href=&quot;https://twitter.com/DomVacchiano&quot;&gt;&lt;strong&gt;&lt;em&gt;check me out on Twitter @domvacchiano&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&lt;em&gt;. I Tweet about business, investing, and coding. If you have any questions feel free to shoot me a tweet or message.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Since launching Squirrel Grease I have done a lot things, from working at an eCommerce company customizing Shopify stores, to investing in biotech companies with a fund. Who knows what the future has in store..&lt;/p&gt;
&lt;p&gt;—&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This was an old post I published on Medium in 2020 - ported over to this blog in 2025&lt;/em&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>I Joined Coding Dojo: Decision Process and Pre-Camp Thoughts</title>
      <link>https://www.domvacchiano.com/coding-dojo-initial-thoughts/</link>
      <guid isPermaLink="true">https://www.domvacchiano.com/coding-dojo-initial-thoughts/</guid>
      <pubDate>Sun, 12 Apr 2020 19:22:00 GMT</pubDate>
      <category>personal</category>
      <description>&lt;hr&gt;
&lt;p&gt;I recently registered for a Python full stack web dev bootcamp through &lt;a href=&quot;https://www.codingdojo.com/&quot;&gt;Coding Dojo&lt;/a&gt; that runs 4 months (16 weeks) and is estimated to require 20 hours per week. The cohort starts May 4th 2020. I am going to be documenting my journey throughout the bootcamp to give insight into my experience. I know before I enrolled I was skeptical about whether it was worth the price. I created a table with various online bootcamps and some basic info you can check out below:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;a href=&quot;https://www.domvacchiano.com/coding-dojo-mid-point/&quot;&gt;update: I posted a mid-point review after 120+ hours&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;FT = ‘full time’, PT = ‘part time’, FS = ‘full stack’&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.domvacchiano.com/assets/images/imported/1-fb0AfjE2GK8GswicoaDLew-3754de4e3fe0.webp&quot; alt=&quot;boot camp comparison&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I ended up choosing Coding Dojo for a couple reasons:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I did my undergrad (like 4 years ago) in informatics and we used Python — so wanted to stick with that language&lt;/li&gt;
&lt;li&gt;I am taking the summer semester off from my grad program — so wanted something that fit that timeline&lt;/li&gt;
&lt;li&gt;Wanted a decent deal ($$), feel like a lot of these bootcamps are pricey and was skeptical of the actual value (&lt;em&gt;hint hint: GA)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So I signed up and filled out the initial questionnaire asking things like my experience and how many hours per week I planned to dedicate to the program. After I submitted that info I was sent an email with instructions on how to reserve my seat — which essentially means pay up, they give you $250 off if you do this within 5 days (nice marketing technique here)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.domvacchiano.com/assets/images/imported/0-o55jbNV1_0SVoHTS-b0d58a8347d2.webp&quot; alt=&quot;pricing deal from coding dojo&quot;&gt;&lt;/p&gt;
&lt;p&gt;I went ahead and signed up for the May 4th cohort, which fit nicely with my graduate program whose semester ends around the end of April. This gives me some time to run through the pre-bootcamp stuff which actually is a decent amount of reading/assignments. I’m glad Coding Dojo does this instead of just throwing us in the first week, this is a nice way to re-touch up on the basics and get acquainted with the Coding Dojo ‘Student Portal’, or whatever you wanna call it.&lt;/p&gt;
&lt;p&gt;The Student Portal is where you access all the course content, it’s a personalized profile which also houses ‘Belts’ you earn. I’ll explain this Belt system in more detail later on.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.domvacchiano.com/assets/images/imported/0-FksVjui59az21RX--df10160064e4.webp&quot; alt=&quot;my student portal img&quot;&gt;&lt;/p&gt;
&lt;p&gt;I just signed up last week so I had a couple days to learn the system a bit and overall I like it. They lay everything out chronologically and estimate how long things are going to take so you can plan better. So far there was reading and an assignment which went over programming basics with JavaScript as the language. They said that the pre-bootcamp work takes about 30 hours so i’m trying to spread it out across the next 3 weeks before my cohort officially starts.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;a href=&quot;https://www.domvacchiano.com/coding-dojo-mid-point/&quot;&gt;update: I posted a mid-point review after 120+ hours&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;if you have any specific questions about the bootcamp or have some insight to share&lt;/strong&gt; &lt;a href=&quot;https://twitter.com/DomVacchiano&quot;&gt;&lt;strong&gt;shoot me a tweet @DomVacchiano&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;I initially posted this on April 12, 2020 on Medium and my previous blog.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
</description>
    </item>
    
  </channel>
</rss>
