Thanks Vasily for the tips. I've wrote a simple script that meet my requirements for now (I don't have many holdings). I've run this manually now by changing the ticker and output file values - given I only have 5 holdings. This works for me.
Will also check out these other commands and packages. Thanks! import subprocess import re from datetime import datetime, timedelta def fetch_and_process_price(ticker: str, date: str) -> str: # Run the bash command result = subprocess.run(['bean-price', '-e', f'--date={date}', ticker], capture_output=True, text=True) # Check if the command was successful if result.returncode == 0: # Process the output output = result.stdout # Use regex to remove ".AX" from any text before it output = re.sub(r'(\w+)\.AX', r'\1', output) # Remove multiple spaces before the dollar value output = ' '.join(output.split()) return f"{output}" else: print(f"Error: {result.stderr}") return "" def append_to_file(content: str, filename: str): with open(filename, 'a') as file: file.write(content + '\n') # Generate dates for every Wednesday for the last 3 years def generate_wednesdays(): end_date = datetime.now() start_date = end_date - timedelta(weeks=3*52) current_date = start_date wednesdays = [] while current_date <= end_date: if current_date.weekday() == 2: # Wednesday wednesdays.append(current_date.strftime('%Y-%m-%d')) current_date += timedelta(days=1) return wednesdays # Example usage dates = generate_wednesdays() ticker = 'AUD:yahoo/ETH-AUD' for date in dates: price_entry = fetch_and_process_price(ticker, date) if price_entry: append_to_file(price_entry, 'ETH-AUD.bean') On Monday, December 30, 2024 at 12:10:17 AM UTC+8 Vasily wrote: > Hi Errol, > > To expand a bit on Patrick's reply. > Indeed, beanprice won't save values to file automatically but you don't > have to necessarily write a script (well, it's actually still a shell > scripting but a bit simpler). You can append result to an existing > beancount file included in your ledger as in: > > bean-price -i -c commodities.bean >> prices.bean > > Note the -i and -c parameters that make sure values are fetched a little > more "deterministically" (check out bean-price --help to see what they > actually mean). > Instead of using include prices.bean in the main ledger you can include > files using a wildcard, like include "prices/*.bean" and then store prices > in the separate files like: > > bean-price -i -c commodities.bean >> "prices/price-$(date > +'%Y-%m-%d').bean" > > You can store them splitted by date as in this example but you can also > come up with the way to split by instrument/stock if necessary (well, here > I'd also probably opt for using Python instead of bash). > > I've automated this process a bit in Lazy Beancount: > https://lazy-beancount.xyz/docs/stage1_totals/currencies/#conversion-rates, > maybe it'd work for you off the shelf as well. It's nothing too fancy, > however, just literally doing what's described here with a UI on top. > > Also I've recently stumbled across > https://gitlab.com/chrisberkhout/pricehist and looks like it can solve a > couple more problems with price fetching (e.g. fetching prices for time > intervals) but I haven't tested it yet personally. > > Best regards, > Vasily > > суббота, 28 декабря 2024 г. в 15:40:15 UTC+1, Errol Lee: > >> Thanks for the input. I was hoping to use one of the functions that came >> with beanprice. These steps in the documentation is what I was trying to >> replicate. Seems like you've written your own script. >> >> Now that I can use bean-price to fetch the individual stocks, I'll >> probably try to do the same.. >> >> [image: 6b9455ae26c087990c894b6b32b93a96c2d8723bb1b2c0e7307be3c7c83484bd >> copy.jpg] >> On Friday, December 27, 2024 at 7:19:53 PM UTC+8 Patrick Ruckstuhl wrote: >> >>> Hi Errol, >>> >>> >>> if I remember correctly it depends not on the commodities but if you >>> have actually any balances using the instruments. >>> >>> For updating a file, this is what I use. I have a prices folder with a >>> file per instrument. >>> >>> >>> #!/usr/bin/env python3 >>> >>> from beanprice import price >>> from beancount import loader >>> from beancount.parser import printer >>> >>> entries, errors, options = loader.load_file('main.beancount') >>> >>> priceJobs = price.get_price_jobs_at_date(entries, inactive=True) >>> prices = [] >>> for job in priceJobs: >>> try: >>> prices.append(price.fetch_price(job)) >>> except Exception as e: >>> print("failed to fetch, ", job, e) >>> >>> prices, ignoredEntries = price.filter_redundant_prices(prices, entries) >>> for newPrice in prices: >>> with open('prices/' + newPrice.currency.lower() + '.beancount', 'a') >>> as priceFile: >>> priceFile.write(printer.format_entry(newPrice)) >>> >>> >>> Regards, >>> >>> Patrick >>> >>> >>> On 27.12.2024 07:28, Errol Lee wrote: >>> >>> Hi Patrick, >>> >>> >>> Thank you for your guidance! I thought I did, but I must've done >>> something wrong earlier. I've reinstalled and can now successfully retrieve >>> prices using Yahoo. >>> >>> >>> For example: >>> >>> >>> ❯ bean-price -e 'AUD:yahoo/VDHG.AX' >>> >>> 2024-12-27 price VDHG.AX 69.53 AUD >>> >>> >>> I’ve defined my commodities in a commodities.bean file. For instance, >>> VDHG is defined as follows: >>> >>> >>> 2000-01-01 commodity VDHG >>> >>> name: "Vanguard Diversified High Growth ETF" >>> >>> asset-class: "Equity" >>> >>> symbol: "VDHG" >>> >>> price: "AUD:yahoo/VDHG.AX" >>> >>> >>> However, when I run the following command, it seems to execute >>> successfully, but I don’t see the prices updated in any of my files: >>> >>> >>> ❯ bean-price commodities.bean >>> >>> >>> Ideally, I’d like the latest prices to be saved automatically in a >>> prices.bean file. Is there something I’m missing in my setup or an >>> additional step I need to take to ensure the prices are recorded in the >>> desired file? >>> >>> >>> Thanks again for your help! >>> >>> >>> Best regards, >>> >>> Errol >>> >>> On Tuesday, December 24, 2024 at 3:46:05 PM UTC+8 Patrick Ruckstuhl >>> wrote: >>> >>>> Hi Errol, >>>> >>>> Did you install beanprice separately? >>>> >>>> https://github.com/beancount/beanprice >>>> >>>> I'm using alphavantage on a daily basis. >>>> >>>> You will need to set an environment variable ALPHAVANTAGE_API_KEY with >>>> a free api key from them and use it like >>>> >>>> USD:alphavantage/price:AAPL:USD >>>> >>>> Regards, >>>> Patrick >>>> >>>> >>>> On December 24, 2024 2:48:02 AM GMT+01:00, Errol Lee < >>>> errol...@gmail.com> wrote: >>>> >>>>> Hi everyone, >>>>> >>>>> >>>>> I’m new to Beancount (and honestly, I’m amazed by the amount of >>>>> functionality it offers—wish I had discovered it sooner!). I’m trying to >>>>> set up bean-price to fetch stock prices, but I’ve run into some >>>>> issues, particularly with Yahoo and Alphavantage as sources. >>>>> >>>>> >>>>> Here’s what I’ve tried so far: >>>>> >>>>> 1. *Yahoo*: >>>>> >>>>> It seems like Yahoo has blocked API access for fetching stock prices. >>>>> When I try fetching prices for AAPL, I get the following error: >>>>> >>>>> >>>>> ❯ bean-price -e 'USD:yahoo/AAPL' >>>>> >>>>> ERROR : Error fetching AAPL: Status 401: {'code': 'Unauthorized', >>>>> 'description': 'User is unable to access this feature - >>>>> https://bit.ly/yahoo-finance-api-feedback'} >>>>> >>>>> ERROR : Could not fetch for job: DatedPrice(base='AAPL', quote='USD', >>>>> date=None, sources=[PriceSource(module=<module >>>>> 'beancount.prices.sources.yahoo' from >>>>> '/opt/homebrew/lib/python3.11/site-packages/beancount/prices/sources/yahoo.py'>, >>>>> >>>>> symbol='AAPL', invert=False)]) >>>>> >>>>> >>>>> >>>>> 2. *Alphavantage*: >>>>> >>>>> Despite being listed as a source in the GitHub documentation, I can’t >>>>> seem to get it working. Here’s the error I encounter: >>>>> >>>>> >>>>> ❯ bean-price -e 'USD:alphavantage/AAPL' >>>>> >>>>> Traceback (most recent call last): >>>>> >>>>> File >>>>> "/opt/homebrew/lib/python3.11/site-packages/beancount/prices/price.py", >>>>> line 178, inimport_source >>>>> >>>>> __import__(default_name) >>>>> >>>>> ModuleNotFoundError: No module named >>>>> 'beancount.prices.sources.alphavantage' >>>>> >>>>> >>>>> During handling of the above exception, another exception occurred: >>>>> >>>>> >>>>> Traceback (most recent call last): >>>>> >>>>> File >>>>> "/opt/homebrew/lib/python3.11/site-packages/beancount/prices/price.py", >>>>> line 182, inimport_source >>>>> >>>>> __import__(module_name) >>>>> >>>>> ModuleNotFoundError: No module named 'alphavantage' >>>>> >>>>> >>>>> Ultimately, I’d like to fetch prices for some Australian stocks in my >>>>> portfolio (e.g., ASX:VDHG, ASX:VGS, etc.). >>>>> >>>>> >>>>> Does anyone have advice on: >>>>> >>>>> • Workarounds for Yahoo? >>>>> >>>>> • How to enable or properly configure Alphavantage as a source? >>>>> >>>>> • Any other sources I can use for Australian stocks? >>>>> >>>>> >>>>> Thanks in advance for your help! Any guidance would be much >>>>> appreciated. >>>>> >>>>> -- >>> You received this message because you are subscribed to the Google >>> Groups "Beancount" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to beancount+...@googlegroups.com. >>> To view this discussion visit >>> https://groups.google.com/d/msgid/beancount/1e797d83-4d9c-4951-8609-a20781fb5164n%40googlegroups.com >>> >>> <https://groups.google.com/d/msgid/beancount/1e797d83-4d9c-4951-8609-a20781fb5164n%40googlegroups.com?utm_medium=email&utm_source=footer> >>> . >>> >>> -- You received this message because you are subscribed to the Google Groups "Beancount" group. To unsubscribe from this group and stop receiving emails from it, send an email to beancount+unsubscr...@googlegroups.com. To view this discussion visit https://groups.google.com/d/msgid/beancount/467e47e2-209c-4bcb-9fb9-0a523c4c3c6dn%40googlegroups.com.