FinQuant icon indicating copy to clipboard operation
FinQuant copied to clipboard

Naive question regarding Allocation

Open gargs2241 opened this issue 3 years ago • 1 comments

Hello Frank,

Awesome job on Finquant. I was trying to use however, I myself am new to finance. I had a question. The allocation column in a portfolio. Are they number of units of stocks? or are they weighted? also. How do I input what is my average price for which i bought these stocks?

Sorry had to ask you via issues since there was not other way to contact. you.

Thanks for your help

Regards

Sriram

gargs2241 avatar Feb 15 '21 09:02 gargs2241

Hi @gargs2241,

and thanks for giving FinQuant a try.

About the column Allocation, you have several options:

Set allocation as how much money you wish to invest initially: You can initially set the allocation based on how much money you want to invest in each stock of your portfolio (the values below are just an example). Example:

d = {
    0: {"Name": "WIKI/GOOG", "Allocation": 20},
    1: {"Name": "WIKI/AMZN", "Allocation": 10},
    2: {"Name": "WIKI/MCD", "Allocation": 15},
    3: {"Name": "WIKI/DIS", "Allocation": 18},
}
pf_allocation = pd.DataFrame.from_dict(d, orient="index")
# read in data from repository (assuming you are in the folder `example` of the repository)
df_data_path = pathlib.Path.cwd() / ".." / "data" / "ex1-stockdata.csv"
df_data = pd.read_csv(df_data_path, index_col="Date", parse_dates=True)

# build portfolio
pf = build_portfolio(data=df_data, pf_allocation=pf_allocation)

# printing out properties of initial portfolio
pf.properties()

Set allocation as a weight/percentage Alternatively, you can set the allocation as weights as well (make sure that the sum of all values equals 1):

d = {
    0: {"Name": "WIKI/GOOG", "Allocation": 0.1},
    1: {"Name": "WIKI/AMZN", "Allocation": 0.1},
    2: {"Name": "WIKI/MCD", "Allocation": 0.3},
    3: {"Name": "WIKI/DIS", "Allocation": 0.5},
}
pf_allocation = pd.DataFrame.from_dict(d, orient="index")
# read in data from repository (assuming you are in the folder `example` of the repository)
df_data_path = pathlib.Path.cwd() / ".." / "data" / "ex1-stockdata.csv"
df_data = pd.read_csv(df_data_path, index_col="Date", parse_dates=True)

# build portfolio
pf = build_portfolio(data=df_data, pf_allocation=pf_allocation)

# printing out properties of initial portfolio
pf.properties()

The simple way, not providing any initial allocation By not providing an initial allocation, FinQuant set all allocations to an equal value.

# read in data from repository (assuming you are in the folder `example` of the repository)
df_data_path = pathlib.Path.cwd() / ".." / "data" / "ex1-stockdata.csv"
df_data = pd.read_csv(df_data_path, index_col="Date", parse_dates=True)

# build portfolio
pf = build_portfolio(data=df_data)

# printing out properties of initial portfolio
pf.properties()

When you compute the optimised portfolio later on, the allocation changes of course. The allocation of the optimised portfolio is presented as a weight. Example

# optimisation for maximum Sharpe ratio
pf.ef_maximum_sharpe_ratio(verbose=True)

The output could be something like this:

----------------------------------------------------------------------
Optimised portfolio for Maximum Sharpe Ratio

Time window/frequency: 252
Risk free rate: 0.005
Expected annual Return: 0.345
Annual Volatility: 0.174
Sharpe Ratio: 1.956

Optimal weights:
            WIKI/GOOG  WIKI/AMZN  WIKI/MCD      WIKI/DIS
Allocation        0.0   0.413222  0.586778  2.285851e-17
----------------------------------------------------------------------

Meaning for Maximum Sharpe Ratio, you should invest 0% in the first, 41.3% in the second, 58.7% in the third and again 0% in the fourth stock in this example.

I hope this helps to get you started. Please have a look at the examples in the folder example, those should help as well.

fmilthaler avatar Feb 21 '21 19:02 fmilthaler