Beispiel #1
0
def update_stocks():
    import time
    from server.models import Stock
    from server.apis.yfinance import fetch_stock_history

    print("Updating stock information ...")

    start_time = time.time()
    stocks = Stock.query.all()
    tickers = [stock.ticker for stock in stocks]
    stocks_data = fetch_stock_history(tickers=tickers,
                                      period="2d",
                                      interval="1d",
                                      include_info=True)
    print("Fetched new information ...")
    for k, v in stocks_data.items():
        for stock in stocks:
            if not stock.ticker.upper() == k.upper():
                continue
            stock.company_info = slugify_keys(v["company_info"])
            stock.latest_market_data = slugify_keys(list(v.values())[0])
            db.session.commit()
            print(f"{stock.ticker} updated")

    print(
        f"Stock update finished, elapsed time: {round(time.time() - start_time, 2)} seconds"
    )
Beispiel #2
0
def fetch_latest_stock_prices(args):
    args["symbols"] = [symbol.upper() for symbol in args["symbols"]]
    stocks = Stock.query.filter(Stock.ticker.in_(args["symbols"])).all()
    if not stocks:
        return jsonify({"message": "Symbols not found in database"}), 404

    res = []
    for stock in stocks:
        quote = {}
        try:
            quote = get_quote(stock.ticker)[stock.ticker]
        except:
            pass

        if quote:
            res.append(quote)
            stock.latest_market_data = slugify_keys(quote)
            db.session.commit()
            continue

        params = {"function": "GLOBAL_QUOTE", "symbol": stock.ticker}
        global_quote = AlphaVantage.fetch_data(params)
        if global_quote.get("Global Quote", {}):
            quote = AlphaVantage.filter_global_quote(global_quote)
            res.append(quote)
            stock.latest_market_data = slugify_keys(quote)
            db.session.commit()
            continue

        quote = IEXFinance.get_stock_quote(ticker=stock.ticker)
        if not quote:
            print("IEXFinance quote fetch failed")
            continue

        if quote["changePercent"]:
            quote["changePercent"] = quote["changePercent"] * 100
        res.append(quote)
        stock.latest_market_data = slugify_keys(quote)
        db.session.commit()
    db.session.commit()

    return jsonify(res), 204
Beispiel #3
0
def get_company_info(symbol):
    symbol = symbol.upper()
    stock = Stock.query.filter_by(ticker=symbol).one_or_none()

    # for faster loading, fetch already existing info from DB TODO: see when to update DB with fresh info
    if stock:
        if not stock.company_info:
            stock.company_info = slugify_keys(
                fetch_stock_info(symbol))  # company profile
        return jsonify(stock.company_info)

    # recommendations = IEXFinance.get_recommendations(symbol)
    # company_info.update({"recommendations": recommendations})
    company_info = slugify_keys(fetch_stock_info(symbol))
    stock_db = Stock(
        ticker=symbol,
        short_name=company_info["shortname"],
        company_info=company_info,
    )
    db.session.add(stock_db)
    db.session.commit()
    return jsonify(company_info)
def add_symbol(portfolio_id, **payload):
    symbol = payload["symbol"].upper()

    current_identity = get_jwt_identity()
    portfolio = Portfolio.query.filter_by(user_id=current_identity,
                                          id=portfolio_id).first_or_404()

    stock_db = Stock.query.filter_by(ticker=symbol).first()
    stock_in_portfolio = stock_db and (stock_db in portfolio.stocks)

    if stock_in_portfolio:
        return jsonify({"message":
                        "Symbol already exists in this portfolio"}), 400

    try:
        quote = get_quote(symbol)[symbol]
    except:
        quote = {}

    if stock_db:
        if quote:
            stock_db.latest_market_data = slugify_keys(quote)
        portfolio.stocks.append(stock_db)
        db.session.commit()
        return jsonify(stock_db.json_short), 201

    stock_db = Stock(
        ticker=payload["symbol"],
        short_name=payload["short_name"],
        company_info={},
        latest_market_data=slugify_keys(quote) if quote else {},
    )
    portfolio.stocks.append(stock_db)
    db.session.add(stock_db)
    db.session.commit()
    return jsonify(stock_db.json_short), 201
Beispiel #5
0
def recommendations(symbol):
    r = get_stock_recommendations(symbol)
    r = [{
        to_local_datetime(int(k) / 1000): slugify_keys(v)
    } for k, v in r.items()]
    return jsonify(r)
Beispiel #6
0
def nasdaq_market_movers():
    movers = Nasdaq.get_market_movers()
    return jsonify(slugify_keys(movers["data"]["STOCKS"]))