Beispiel #1
0
    def from_archive(cls, symbol, *args, **kwargs):
        """ Returns an object that is capable of calculating various metrics of the stock,
            with data loaded from archive.

            symbol: e.g. "C6L.SI"
            Any extra arguments will be passed on to the constructor.
        """
        kwargs.update({
            "historical": load_fundamental_data("price", symbol),
            "balance_sheet": load_fundamental_data("balance_sheet", symbol),
            "income_statement": load_fundamental_data("income_statement", symbol),
            "cash_flow": load_fundamental_data("cash_flow", symbol),
        })

        return cls(*args, **kwargs)
Beispiel #2
0
    def test_load_fundamental_data_select_columns(self):
        mock_get_numerical_column_names = MagicMock(return_value=("Open", "High", "Low", "Close", "Volume", "Adj Close"))
        mock_get_fundamentals = MagicMock(return_value=[
            (datetime(2012, 12, 20), 6860, 100.4),
            (datetime(2012, 12, 21), 7850, 99.9),
            (datetime(2012, 12, 22), 3870, 32.6),
        ])

        with patch("fa.analysis.io.get_numerical_column_names", mock_get_numerical_column_names), \
             patch("fa.analysis.io.get_fundamentals", mock_get_fundamentals):
            df = io.load_fundamental_data("price", "C6L.SI", ["Volume", "Adj Close"])

        expected = pd.DataFrame(
            [[6860, 100.4],
             [7850, 99.9],
             [3870, 32.6]],
            index=pd.to_datetime(["2012-12-20", "2012-12-21", "2012-12-22"]),
            columns=["Volume", "Adj Close"]
        )
        expected.index.name = "Date"
        self.assertFrameEqual(df, expected)
    total_gain = capital_gain + total_dividend_payout
    total_return = total_gain / total_amount_invested
    print("total return = {0:.0f}% after {1:.1f} years.".format(total_return * 100, cash_flow_period + 1))

    dividend_payout_proportion = total_dividend_payout / total_gain
    print("dividend payout comprises {0:.0f}%".format(dividend_payout_proportion * 100))

    all_return = ((units_bought * sell_price + dividend_payout) / amount_invested - 1).replace(np.inf, np.nan)
    annual_return = all_return / hold_period_years
    print("average annual return = {0:.1f}%".format(annual_return.mean() * 100))

if __name__ == "__main__":
    symbol = "^STI"

    historical_data = load_fundamental_data("price", symbol)
    price = historical_data["Close"]

    return_in_1yr = calc_future_return(price, 365)
    valuation = return_in_1yr.map(get_valuation)
    valuation.index.name = "Date"
    valuation.name = "Valuation"

    # main working dataset for the study
    dataset = pd.concat([price, valuation], axis=1).dropna()

    # with open("output.csv", 'w') as f:
    #     dataset.to_csv(f)

    # one year after the last investment
    sell_date = price.index[-1]