Years ago I was introduced to portfolio rebalancing by a friend that I used to work with. In short, portfolio rebalancing allows you to sell off some stock in funds that have increased in value, and then buy more shares in funds that have decreased in value. This allows you to sell high, buy low. The company that currently manages my business retirement plan does not have an option for this, but I am allowed to transfer funds between different investments without fees.
Below is an example of two concepts that I use in my PowerShell classes. One is how to gather information from the internet and the other is how to use the XML variable type in PowerShell. You will have to create a CSV file that contains three pieces of information. FUND, QUNATITY, ALLOCATION. The Fund will be the ticker symbol for a stock or mutual fund. The quantity will be how much of that fund you own. The allocation is a percentage of how much of your portfolio you want that investment to consume. Make sure the allocation column totals 100%.
Below is an example of two concepts that I use in my PowerShell classes. One is how to gather information from the internet and the other is how to use the XML variable type in PowerShell. You will have to create a CSV file that contains three pieces of information. FUND, QUNATITY, ALLOCATION. The Fund will be the ticker symbol for a stock or mutual fund. The quantity will be how much of that fund you own. The allocation is a percentage of how much of your portfolio you want that investment to consume. Make sure the allocation column totals 100%.
Function Rebalance-Portfolio
{
Param (
[Parameter(Position=0, Mandatory=$TRUE,
ValueFromPipeline=$TRUE)]
[STRING]$Portfolio
)
#-- Support Functions
---------------------------------------------------------
function Get-StockInfo
{
[cmdletbinding()]
param
($Sym)
$Data
= @()
$Data
+= "Symbol,Name,Ask,Low,High,Low52,High52,Volume,DayChange,ChangePercent"
$URL
= "http://finance.yahoo.com/d/quotes.csv?s=$Sym&f=snl1ghjkvw4P2"
$Data
+= Invoke-RestMethod -Uri
$URL
$Data
+= "`n"
$Data
= $Data | ConvertFrom-csv
Write-Output
$Data
}
# END: function Get-StockInfo
#-- End Support Functions
-----------------------------------------------------
# Import the
portfolio file.
Try
{
$Funds
= Import-csv -Path
$Portfolio
}
Catch
{
Write-Host
"Data file not found." `
-ForegroundColor
Red `
-BackgroundColor
DarkRed
BREAK
}
# Object to
hold stock information
$StockInfo
= @()
# Total value
of the portfolio
[Single]$TotalValue = 0
# Populate an
object for each fund.
ForEach
($Fund in
$Funds)
{
$Symbol
= $Fund.Fund
#$Info
= Get-FundQuote -TICKER $Symbol
$Info
= Get-StockInfo -Sym
$Symbol
$Obj
= New-Object -TypeName
PSObject
$Obj
| Add-Member -MemberType
NoteProperty `
-Name
"Fund" `
-Value
$Info.Symbol
$Obj
| Add-Member -MemberType
NoteProperty `
-Name
"Quantity" `
-Value
$Fund.Quantity
$Obj
| Add-Member -MemberType
NoteProperty `
-Name
"PreviousClose" `
-Value
$Info.Ask
$Obj
| Add-Member -MemberType
NoteProperty `
-Name
"CurrentValue" `
-Value
([Single]$Fund.Quantity
* [Single]$Info.Ask)
$Obj
| Add-Member -MemberType
NoteProperty `
-Name
"Allocation" `
-Value
$Fund.Allocation
$Obj
| Add-Member -MemberType
NoteProperty `
-Name
"AllocationGoal" `
-Value
0
$Obj
| Add-Member -MemberType
NoteProperty `
-Name
"ChangeAmount" `
-Value
0
$Obj
| Add-Member -MemberType
NoteProperty `
-Name
"ChangeShares" `
-Value
0
$Obj
| Add-Member -MemberType
NoteProperty `
-Name
"NewShareBalance" `
-Value
0
$TotalValue
+= ([Single]$Fund.Quantity
*[Single]$Info.Ask)
$StockInfo
+= $Obj
}
# Figure out
allocations.
ForEach
($Stock in
$StockInfo)
{
$Stock.AllocationGoal
= "{0:N2}" -f ($TotalValue*([Single]$Stock.Allocation*.01))
$Stock.CurrentValue
= "{0:N2}" -f $Stock.CurrentValue
$Stock.ChangeAmount
= $Stock.AllocationGoal
- $Stock.CurrentValue
$Stock.ChangeShares
= "{0:N3}" -f ($Stock.ChangeAmount/$Stock.PreviousClose)
$Stock.NewShareBalance
= "{0:N3}" -f ([SINGLE]$Stock.Quantity
+ [SINGLE]$Stock.ChangeShares)
}
$StockInfo
| FT -AutoSize
<#
.SYNOPSIS
Determines fund rebalancing amounts.
.DESCRIPTION
Returns the mutual fund reallocation amounts provided through
a CSV file. This
allows the user to properly rebalance an investment
portfolio. The CVS
file format is:
Fund, Quantity, Allocation
FUND: The ticker symbol of the mutual fund.
QUANTITY: The current quantity of the fund held.
ALLOCATION: The percentage that this fund should be of the
total portfolio
if the portfolio was balances.
Once executed, the ChangeAmount property well tell the user
how many dollars
of a fund should be purchased (Positive amount) or sold
(Negative amount) in
offer to balance the portfolio.
Fund: One of your mutual funds.
Quantity: The amount of shares that you own.
PreviousClose: The last price of these shares.
CurrentValue: How much of the fund you own in dollars.
Allocation: A percentage of how much of your portfolio should
be invested in
this fund.
ChangeAmount: The number of dollars you need to buy or sell to
bring this
fund into
balance.
ChangedShares: The number of shares you would have to buy or
sell to bring
this fund
into balance.
NewShareBalance: The number of shares you need in each fund to
bring them
into
balance.
.PARAMETER Portfolio
The fill path of the CSV file containing the users portfolio
data. Referred
to the help file description for the proper format.
.EXAMPLE
Rebalance-Portfolio -Portfolio "C:\Users\Jason\Documents\PowerShell\Code\Portfolio2.csv"
Fund Quantity
PreviousClose CurrentValue Allocation AllocationGoal ChangeAmount ChangeShares
NewShareBalance
---- --------
------------- ------------ ---------- -------------- ------------ ------------
---------------
USAUX 290.769
33.51 9,511.05 25
8,757.31 -754
-22.501 268.268
USCGX 383.996 7.03 2,638.05 5
1,751.46 -887
-126.174 257.822
USEMX 353.756
17.98 6,236.72 15
5,254.39 -983
-54.672 299.084
USGRX 294.151
16.57 4,759.36 15
5,254.39 495 29.873 324.024
USAAX 374.512
17.30 6,321.76 20
7,005.85 684
39.538 414.050
USISX 408.992
13.91 5,562.29 20
7,005.85 1444
103.810 512.802
The ChangeAmount column tells you the dollar amount of shares
that need to be
bought or sold for each fund in order to bring your portfolio
into
balance.
#>
}
Comments