def test_stock_info(comp_deets): # pylint: disable=unused-argument,redefined-outer-name d = stock_info("ANZ") assert isinstance(d, dict) assert "securities" in d assert d["asx_code"] == "ANZ" assert isinstance(d["securities"], QuerySet) d2 = model_to_dict(d["securities"].first()) assert d2["asx_code"] == "ANZ" assert d2["asx_isin_code"] == "ISIN000001"
def test_stock_info(comp_deets): t = stock_info('ANZ') assert isinstance(t, tuple) assert len(t) == 2 assert len(t[0]) == 1 assert isinstance(t[0], QuerySet) s = t[0].first() assert s.asx_code == 'ANZ' assert s.asx_isin_code == 'ISIN000001' assert isinstance(t[1], CompanyDetails) assert t[1].asx_code == 'ANZ'
def show_stock_sector(request, stock): validate_stock(stock) validate_user(request.user) _, company_details = stock_info(stock, lambda msg: warning(request, msg)) sector = company_details.sector_name if company_details else None all_stocks_cip = cached_all_stocks_cip(Timeframe(past_n_days=180)) # invoke separate function to cache the calls when we can c_vs_s_plot, sector_momentum_plot, sector_companies = analyse_sector_performance( stock, sector, all_stocks_cip) point_score_plot = net_rule_contributors_plot = None if sector_companies is not None: point_score_plot, net_rule_contributors_plot = \ plot_point_scores(stock, sector_companies, all_stocks_cip, default_point_score_rules()) context = { "is_sector": True, "asx_code": stock, "sector_momentum_plot": sector_momentum_plot, "sector_momentum_title": "{} sector stocks".format(sector), "company_versus_sector_plot": c_vs_s_plot, "company_versus_sector_title": "{} vs. {} performance".format(stock, sector), "point_score_plot": point_score_plot, "point_score_plot_title": "Points score due to price movements", "net_contributors_plot": net_rule_contributors_plot, "net_contributors_plot_title": "Contributions to point score by rule", } return render(request, "stock_sector.html", context)
def show_stock(request, stock=None, n_days=2 * 365): """ Displays a view of a single stock via the stock_view.html template and associated state """ validate_stock(stock) validate_user(request.user) timeframe = Timeframe( past_n_days=n_days + 200 ) # add 200 days so MA 200 can initialise itself before the plotting starts... stock_df = rsi_data( stock, timeframe) # may raise 404 if too little data available securities, company_details = stock_info(stock, lambda msg: warning(request, msg)) momentum_plot = make_rsi_plot(stock, stock_df) # plot the price over timeframe in monthly blocks prices = stock_df[[ 'last_price' ]].transpose() # use list of columns to ensure pd.DataFrame not pd.Series #print(prices) monthly_maximum_plot = plot_trend(prices, sample_period='M') # populate template and render HTML page with context context = { "asx_code": stock, "securities": securities, "cd": company_details, "rsi_plot": momentum_plot, "is_momentum": True, "monthly_highest_price_plot_title": "Maximum price each month trend", "monthly_highest_price_plot": monthly_maximum_plot, "timeframe": f"{n_days} days", "watched": user_watchlist(request.user), } return render(request, "stock_view.html", context=context)
def show_stock(request, stock=None, n_days=2 * 365): """ Displays a view of a single stock via the template and associated state """ validate_stock(stock) validate_user(request.user) plot_timeframe = Timeframe(past_n_days=n_days) # for template def dataframe(ld: LazyDictionary) -> pd.DataFrame: momentum_timeframe = Timeframe( past_n_days=n_days + 200 ) # to warmup MA200 function df = company_prices( (stock,), momentum_timeframe, fields=all_stock_fundamental_fields, missing_cb=None, ) return df # key dynamic images and text for HTML response. We only compute the required data if image(s) not cached # print(df) ld = LazyDictionary() ld["stock_df"] = lambda ld: ld["stock_df_200"].filter( items=plot_timeframe.all_dates(), axis="rows" ) ld["cip_df"] = lambda: cached_all_stocks_cip(plot_timeframe) ld["stock_df_200"] = lambda ld: dataframe(ld) ld["sector_companies"] = lambda: companies_with_same_sector(stock) ld["company_details"] = lambda: stock_info(stock, lambda msg: warning(request, msg)) ld["sector"] = lambda ld: ld["company_details"].get("sector_name", "") # point_score_results is a tuple (point_score_df, net_points_by_rule) ld["point_score_results"] = lambda ld: make_point_score_dataframe( stock, default_point_score_rules(), ld ) ld["stock_vs_sector_df"] = lambda ld: make_stock_vs_sector_dataframe( ld["cip_df"], stock, ld["sector_companies"] ) print(ld["stock_vs_sector_df"]) momentum_plot = cache_plot( f"{plot_timeframe.description}-{stock}-rsi-plot", lambda ld: plot_momentum(stock, plot_timeframe, ld), datasets=ld, ) monthly_maximum_plot = cache_plot( f"{plot_timeframe.description}-{stock}-monthly-maximum-plot", lambda ld: plot_trend("M", ld), datasets=ld, ) monthly_returns_plot = cache_plot( f"{plot_timeframe.description}-{stock}-monthly returns", lambda ld: plot_monthly_returns(plot_timeframe, stock, ld), datasets=ld, ) company_versus_sector_plot = cache_plot( f"{stock}-{ld['sector']}-company-versus-sector", lambda ld: plot_company_versus_sector( ld["stock_vs_sector_df"], stock, ld["sector"] ), datasets=ld, ) point_score_plot = cache_plot( f"{plot_timeframe.description}-{stock}-point-score-plot", lambda ld: plot_series(ld["point_score_results"][0], x="date", y="points"), datasets=ld, ) net_rule_contributors_plot = cache_plot( f"{plot_timeframe.description}-{stock}-rules-by-points", lambda ld: plot_points_by_rule(ld["point_score_results"][1]), datasets=ld, ) # populate template and render HTML page with context context = { "asx_code": stock, "watched": user_watchlist(request.user), "timeframe": plot_timeframe, "information": ld["company_details"], "momentum": { "rsi_plot": momentum_plot, "monthly_highest_price": { "title": "Highest price each month", "plot_uri": monthly_maximum_plot, }, }, "fundamentals": { "plot_uri": cache_plot( f"{stock}-{plot_timeframe.description}-fundamentals-plot", lambda ld: plot_fundamentals( fundamentals_dataframe(plot_timeframe, stock, ld), stock, ), datasets=ld, ), "title": "Stock fundamentals: EPS, PE, DY etc.", "timeframe": plot_timeframe, }, "stock_vs_sector": { "plot_uri": company_versus_sector_plot, "title": "Company versus sector - percentage change", "timeframe": plot_timeframe, }, "point_score": { "plot_uri": point_score_plot, "title": "Points score due to price movements", }, "net_contributors": { "plot_uri": net_rule_contributors_plot, "title": "Contributions to point score by rule", }, "month_by_month_return_uri": monthly_returns_plot, } return render(request, "stock_page.html", context=context)