from flask import Flask, request, jsonify
import yfinance as yf
import pandas as pd
import numpy as np
from threading import Thread
Run to view results
def net_income(ticker):
df = ticker.income_stmt
return df.loc['Net Income'].iloc[0]
def net_incomes(ticker):
df = ticker.income_stmt
return df.loc['Net Income']
def roa(ticker):
df = ticker.balance_sheet
avg_assets = (df.loc['Total Assets'].iloc[0] + df.loc['Total Assets'].iloc[1]) / 2
return round(net_income(ticker) / avg_assets, 2) if avg_assets != 0 else 0
def ocf(ticker):
df = ticker.cash_flow
if 'Operating Cash Flow' in df.index:
return df.loc['Operating Cash Flow'].iloc[0]
else:
return df.loc['Free Cash Flow'].iloc[0] + abs(df.loc['Capital Expenditure']).iloc[0]
def ltdebt(ticker):
df = ticker.balance_sheet
return df.loc['Long Term Debt'].iloc[1] - df.loc['Long Term Debt'].iloc[0]
def current_ratio(ticker):
df = ticker.balance_sheet
current_ratio_current = df.loc['Total Assets'].iloc[0] / df.loc['Total Liabilities Net Minority Interest'].iloc[0]
current_ratio_prev = df.loc['Total Assets'].iloc[1] / df.loc['Total Liabilities Net Minority Interest'].iloc[1]
return round(current_ratio_current - current_ratio_prev, 2)
def new_shares(ticker):
df = ticker.balance_sheet
return df.loc['Common Stock'].iloc[1] - df.loc['Common Stock'].iloc[0]
def gross_margin(ticker):
df = ticker.income_stmt
gross_margin_current = df.loc['Gross Profit'].iloc[0] / df.loc['Total Revenue'].iloc[0]
gross_margin_prev = df.loc['Gross Profit'].iloc[1] / df.loc['Total Revenue'].iloc[1]
return gross_margin_current - gross_margin_prev
def asset_turnover_ratio(ticker):
df_bs = ticker.balance_sheet
y0, y1, y2 = df_bs.loc['Total Assets'].iloc[0], df_bs.loc['Total Assets'].iloc[1], df_bs.loc['Total Assets'].iloc[2]
avg_asset_y0 = (y0 + y1) / 2
avg_asset_y1 = (y1 + y2) / 2
df_is = ticker.income_stmt
tot_rvn_y0 = df_is.loc['Total Revenue'].iloc[0] / avg_asset_y0
tot_rvn_y1 = df_is.loc['Total Revenue'].iloc[1] / avg_asset_y1
return round(tot_rvn_y0 - tot_rvn_y1, 2)
criteria_dict = {
'CR1': net_income,
'CR2': roa,
'CR3': ocf,
'CR5': ltdebt,
'CR6': current_ratio,
'CR7': new_shares,
'CR8': gross_margin,
'CR9': asset_turnover_ratio
}
app = Flask(__name__)
def calculate_piotroski():
data = request.json
symbol = data.get('symbol')
if not symbol:
return jsonify({"error": "No stock symbol provided"}), 400
try:
ticker = yf.Ticker(symbol)
ps_criteria = {}
for key, value in criteria_dict.items():
try:
result = value(ticker)
ps_criteria[key] = 1 if (result > 0 or key == 'CR7' and result >= 0) else 0
except (KeyError, IndexError):
ps_criteria[key] = 0
ps_criteria['CR4'] = 1 if ps_criteria.get('CR3', 0) > ps_criteria.get('CR1', 0) else 0
score = sum(ps_criteria.values())
ps_criteria['Score'] = score
return jsonify(ps_criteria)
except Exception as e:
return jsonify({"error": str(e)}), 500
# Flask'ı arka planda başlat
def run_app():
app.run(debug=False, use_reloader=False, host='0.0.0.0', port=5000)
flask_thread = Thread(target=run_app)
flask_thread.start()
Run to view results