commit 7fea3f0e4c9865c6ab2931007d25e8959c523b6c Author: Jarno Kiesiläinen Date: Tue Sep 16 10:52:17 2025 +0300 Initial commit diff --git a/testing.ipynb b/testing.ipynb new file mode 100644 index 0000000..97a045c --- /dev/null +++ b/testing.ipynb @@ -0,0 +1,183 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "78af696f-0a94-4067-8883-12737e63d111", + "metadata": {}, + "outputs": [], + "source": [ + "import requests\n", + "import urllib.parse\n", + "from pandas import DataFrame as df\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "379014f5-f668-4991-acc8-4f46f38801ba", + "metadata": {}, + "outputs": [], + "source": [ + "base_url = \"https://www.dolthub.com/api/v1alpha1/post-no-preference/earnings/master\"\n", + "\n", + "alpha_url = \"https://www.alphavantage.co/query\"\n", + "alpha_vantage_key = \"0ASTESBIVM48QLYV\"" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "6c9a6813-8b84-4bc5-9d44-b06d5ea91485", + "metadata": {}, + "outputs": [], + "source": [ + "symbol = \"PHM\"" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "399ec136-ad3a-40b9-92d0-d020868d65f4", + "metadata": {}, + "outputs": [], + "source": [ + "def get_income_frame(symbol: str):\n", + " query = \"SELECT * FROM income_statement WHERE act_symbol = '%s' AND period = 'Year'\" % symbol\n", + " response = requests.get(\"%s?q=%s\" % (base_url, urllib.parse.quote_plus(query)))\n", + " return df.from_dict(response.json()[\"rows\"]).sort_values(\"date\", ascending=False)\n", + "\n", + "def get_quote(symbol: str):\n", + " query = \"?function=TIME_SERIES_DAILY&symbol=%s&apikey=%s\" % (symbol, alpha_vantage_key)\n", + " response = requests.get(\"%s%s\" % (alpha_url, query)).json()\n", + " aframe = df.from_dict(response['Time Series (Daily)']).T\n", + " return aframe.iloc[0,3]\n", + "\n", + "def ppere(income_frame, price):\n", + " eps = income_frame.iloc[0][\"diluted_net_eps\"]\n", + " return float(price) / float(eps)\n", + "\n", + "def mean_margin(income_frame):\n", + " return np.mean(income_frame.net_income.astype(float) / income_frame.sales.astype(float))\n", + "\n", + "def margin(income_frame):\n", + " return (income_frame.net_income.astype(float) / income_frame.sales.astype(float))[0]\n", + "\n", + "def eps3(income_frame):\n", + " return np.mean(income_frame.diluted_net_eps.astype(float)[0:3])" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "1ee4bf5c-01d8-4f9c-929c-652b1b801683", + "metadata": {}, + "outputs": [ + { + "ename": "KeyError", + "evalue": "'Time Series (Daily)'", + "output_type": "error", + "traceback": [ + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mKeyError\u001b[39m Traceback (most recent call last)", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[5]\u001b[39m\u001b[32m, line 2\u001b[39m\n\u001b[32m 1\u001b[39m income_frame = get_income_frame(symbol)\n\u001b[32m----> \u001b[39m\u001b[32m2\u001b[39m price = \u001b[43mget_quote\u001b[49m\u001b[43m(\u001b[49m\u001b[43msymbol\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[4]\u001b[39m\u001b[32m, line 9\u001b[39m, in \u001b[36mget_quote\u001b[39m\u001b[34m(symbol)\u001b[39m\n\u001b[32m 7\u001b[39m query = \u001b[33m\"\u001b[39m\u001b[33m?function=TIME_SERIES_DAILY&symbol=\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[33m&apikey=\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[33m\"\u001b[39m % (symbol, alpha_vantage_key)\n\u001b[32m 8\u001b[39m response = requests.get(\u001b[33m\"\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[33m\"\u001b[39m % (alpha_url, query)).json()\n\u001b[32m----> \u001b[39m\u001b[32m9\u001b[39m aframe = df.from_dict(\u001b[43mresponse\u001b[49m\u001b[43m[\u001b[49m\u001b[33;43m'\u001b[39;49m\u001b[33;43mTime Series (Daily)\u001b[39;49m\u001b[33;43m'\u001b[39;49m\u001b[43m]\u001b[49m).T\n\u001b[32m 10\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m aframe.iloc[\u001b[32m0\u001b[39m,\u001b[32m3\u001b[39m]\n", + "\u001b[31mKeyError\u001b[39m: 'Time Series (Daily)'" + ] + } + ], + "source": [ + "income_frame = get_income_frame(symbol)\n", + "price = get_quote(symbol)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1afdc099-986b-47a5-bf29-b2af249207e9", + "metadata": {}, + "outputs": [], + "source": [ + "pe = ppere(income_frame, price)\n", + "mm = mean_margin(income_frame)\n", + "m = margin(income_frame)\n", + "upside = ((float(eps3(income_frame) * 12) - float(price)) / float(price) * 100)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f88f49b5-7c36-4790-83b5-2fbf3d1b8363", + "metadata": {}, + "outputs": [], + "source": [ + "print(symbol)\n", + "print(\"P/E: %0.1f\" % pe)\n", + "print(\"Margin: %01.1f %%\" % ((m + mm) * 50))\n", + "print(\"Potential: %01.1f %%\" % upside)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "7c0aa850-8c29-49ed-81d7-c96341041c46", + "metadata": {}, + "outputs": [], + "source": [ + " query = \"?function=TIME_SERIES_DAILY&symbol=%s&apikey=%s\" % (symbol, alpha_vantage_key)\n", + " response = requests.get(\"%s%s\" % (alpha_url, query)).json()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "bf8b8ba0-9e97-4439-8b84-7bb7383435f5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'Information': 'We have detected your API key as 0ASTESBIVM48QLYV and our standard API rate limit is 25 requests per day. Please subscribe to any of the premium plans at https://www.alphavantage.co/premium/ to instantly remove all daily rate limits.'}" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "response" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6f633545-b5bc-444d-a2d8-60712c8a5b68", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}