How Many Shares to Buy to Achieve a Target Average Price?

  • Context: MHB 
  • Thread starter Thread starter Grimmet
  • Start date Start date
Click For Summary
SUMMARY

The discussion focuses on calculating the number of shares to buy in order to achieve a target average price using a Python script. The user owns 250,000 shares at $0.005 and wants to buy additional shares at $0.03 to reach an average price of $0.02. The brute force method initially used yielded a result of 375,000 shares, which was confirmed through a weighted average formula. The final formula derived for calculating the required shares is: Shares = (ownedShares * targetPrice - ownedShares * boughtPrice) / (buyPrice - targetPrice).

PREREQUISITES
  • Understanding of Python programming
  • Knowledge of weighted averages in finance
  • Familiarity with basic stock trading concepts
  • Ability to manipulate mathematical equations
NEXT STEPS
  • Learn about Python's NumPy library for efficient numerical calculations
  • Research financial modeling techniques for stock price averaging
  • Explore advanced Python functions for optimizing loops and calculations
  • Study the implications of share dilution on average price calculations
USEFUL FOR

Investors, financial analysts, and Python developers interested in stock trading strategies and average price calculations.

Grimmet
Messages
2
Reaction score
0
Writing a small python script...
If one owns 250000 shares at 0.005
and buys shares at 0.03.
How many shares would one buy for the average price to equal 0.02.

My attempt so far as used brute force looping to get close to a figure.
For example, the script gives the answer 375000 shares.
... I'm sure there's a more elegant way.

exitPrg = "y"

def LowBracket(buyP, targetP, currentA, ownedS, lim):
nX = 0
while nX <= limit:
nm = round(((nX * buyP)+currentA)/(nX+ownedS),5)
if nm == targetPrice:
break
nX += 1
return nX

def HighBracket(buyP, targetP, currentA, ownedS, lim):
nY = lim
while nY > 0:
nn = round(((nY * buyP)+currentA)/(nY+ownedS),5)
if nn == targetP:
break
nY -= 1
return nY

while ( exitPrg == "y" or exitPrg == "Y"):
ownedShares = input("\nShares owned: ")
boughtPrice = input("Price bought: ")
buyPrice = input("New price: ")
targetPrice = input("Target price: ")
limit = input("Share limit: ")

ownedShares = int(ownedShares)
boughtPrice = float(boughtPrice)
buyPrice = float(buyPrice)
targetPrice = float(targetPrice)
limit = int(limit)

currentAmount = ownedShares * boughtPrice

numberA = LowBracket(buyPrice, targetPrice, currentAmount, ownedShares, limit)

numberB = HighBracket(buyPrice, targetPrice, currentAmount, ownedShares, limit)

print("\nNumber of shares: %i\n" % ((numberB+numberA)/2))

exitPrg = input("Continue? (y/n) ")

Thanks.
 
Physics news on Phys.org
You could use what's called a weighted average to determine the answer:

$$\frac{250000\cdot0.005+X\cdot0.03}{250000+X}=0.02$$

Simplify:

$$\frac{1250+0.03X}{250000+X}=0.02$$

Multiply through by $250000+X$:

$$1250+0.03X=5000+0.02X$$

Rearrange:

$$0.01X=3750$$

Multiply through by 100:

$$X=375000$$
 
Therefore:
Shares = ownedShares*targetPrice - ownedShares*boughtPrice / buyPrice - targetPrice

Thanks for the help.

Grimmet
 
Last edited: