Difference between revisions of "Stocks/get prices"

From GnuCash
Jump to: navigation, search
(Even more simple script)
m (This document explains how to import historic stock quotes into gnucash)
Line 1: Line 1:
 
= This document explains how to import historic stock quotes into gnucash =
 
= This document explains how to import historic stock quotes into gnucash =
  
Some knowledge of perl and python is required. This example uses GnuCashs [[Python Bindings]]. You have to make sure that they are available to
+
Some knowledge of perl and python is required. This example uses GnuCash's [[Python Bindings]]. Ensure that both perl and python are available.
get this working.
 
  
To run the scripts below you need a gnucash xml file named "test.gnucash" with an account named Intel and a booking of the share INTC within this account. How you add the INTC stock to Gnucash is explained here [[stocks/add_stock|Add stock to portfolio]]. You have additionally to add one price of INTC into the database per hand.
+
To run the scripts below you need a gnucash xml file named "test.gnucash". For illustration, we show how to get prices for an account named Intel that contains shares of the INTC stock. The method for adding the INTC stock to Gnucash is explained here [[stocks/add_stock|Add stock to portfolio]]. You have additionally to add one price of INTC into the database by hand.
  
 
== Get the data ==
 
== Get the data ==
  
We get the data with the perl module [http://www.mojotoad.com/sisk/projects/Finance-QuoteHist/ QuoteHist]. A sample perl script to get quotes is e.g.:
+
We get the data with the perl module [http://www.mojotoad.com/sisk/projects/Finance-QuoteHist/ Finance::QuoteHist]. A sample perl script to get the quotes is as follows:
  
 
  #!/usr/bin/perl -w
 
  #!/usr/bin/perl -w
Line 32: Line 31:
  
  
On Unix/Linux save the text into a file (e.g. get_quotes) , do a chmod a+x and execute it with the argument INTC to get the Intel prices saved into the file INTC
+
On Unix/Linux, save the program text (above) into a file (e.g., get_quotes), make the script executable by running "chmod a+x get_quotes". Execute it with the argument INTC to get the Intel prices saved into the file INTC
chmod a+x get_quotes
+
% chmod a+x get_quotes
./get_quotes INTC
+
% ./get_quotes INTC
  
 
The INTC file should look similar to this:
 
The INTC file should look similar to this:
Line 40: Line 39:
 
  INTC,2000/01/04, 85.4400, 87.8700, 82.2500, 82.9400, 51019600
 
  INTC,2000/01/04, 85.4400, 87.8700, 82.2500, 82.9400, 51019600
 
  INTC,2000/01/05, 83.0000, 85.8700, 80.5000, 83.6200, 52389000
 
  INTC,2000/01/05, 83.0000, 85.8700, 80.5000, 83.6200, 52389000
and so on
 
  
  

Revision as of 03:28, 15 October 2014

This document explains how to import historic stock quotes into gnucash

Some knowledge of perl and python is required. This example uses GnuCash's Python Bindings. Ensure that both perl and python are available.

To run the scripts below you need a gnucash xml file named "test.gnucash". For illustration, we show how to get prices for an account named Intel that contains shares of the INTC stock. The method for adding the INTC stock to Gnucash is explained here Add stock to portfolio. You have additionally to add one price of INTC into the database by hand.

Get the data

We get the data with the perl module Finance::QuoteHist. A sample perl script to get the quotes is as follows:

#!/usr/bin/perl -w
use Finance::QuoteHist;
print "Will get stock quotes of $ARGV[0] and save it into the file $ARGV[0]\n";
$fname = $ARGV[0];
   open (MYFILE, ">$fname");
   $q = Finance::QuoteHist->new
      (
       symbols    => [($ARGV[0])],
       start_date => '01/01/2000',
       end_date   => 'today',
      ); 


print "name,date, open, high, low, close, volume\n";
foreach $row ($q->quotes()) {
       ($name,$date, $open, $high, $low, $close, $volume) = @$row;
       print MYFILE "$name,$date, $open, $high, $low, $close, $volume\n";
   }

close(MYFILE);


On Unix/Linux, save the program text (above) into a file (e.g., get_quotes), make the script executable by running "chmod a+x get_quotes". Execute it with the argument INTC to get the Intel prices saved into the file INTC % chmod a+x get_quotes % ./get_quotes INTC

The INTC file should look similar to this:

INTC,2000/01/03, 83.2700, 87.3700, 83.2500, 87.0000, 57710200
INTC,2000/01/04, 85.4400, 87.8700, 82.2500, 82.9400, 51019600
INTC,2000/01/05, 83.0000, 85.8700, 80.5000, 83.6200, 52389000


Import the data into Gnucash

The following python script will read the text file "INTC" and add the prices to the Gnucash file "test.gnucash".

from gnucash import Session, Account, Split
import gnucash
import datetime
from fractions import Fraction

FILE = "./test.gnucash"
url = "xml://"+FILE

# Read data from file
f = open('INTC')
data = []
while 1:
    tmp = f.readline()
    if(len(tmp)<2):
        break
    
    data.append(tmp)

f.close()

stock_date = []
stock_price = []
for i in range(1,len(data)):
    year = int(data[i].rsplit(',')[1].rsplit('/')[0])
    month = int(data[i].rsplit(',')[1].rsplit('/')[1])
    day = int(data[i].rsplit(',')[1].rsplit('/')[2])
    stock_date.append(datetime.datetime(year,month,day))
    stock_price.append(float(data[i].rsplit(',')[5]))

# Initialize Gnucash session
session = Session(url, True, False, False)
root = session.book.get_root_account()
book = session.book
account = book.get_root_account()
pdb = book.get_price_db()
commod_table = book.get_table()
stock = commod_table.lookup('NASDAQ', 'INTC')
cur = commod_table.lookup('CURRENCY', 'USD')
# Add the prices
pdb = book.get_price_db()
# Get stock data
pl = pdb.get_prices(stock,cur)
if len(pl)<1:
  print 'Need at least one database entry to clone ...'

pl0 = pl[0]
for i in range(1,len(pl)):
  pdb.remove_price(pl[i])

for i in range(0,len(stock_date)):
  p_new = pl0.clone(book)
  p_new = gnucash.GncPrice(instance=p_new)
  print 'Adding',i,stock_date[i],stock_price[i]
  p_new.set_time(stock_date[i])
  v = p_new.get_value()
  v.num = int(Fraction.from_float(stock_price[i]).limit_denominator(100000).numerator)
  v.denom = int(Fraction.from_float(stock_price[i]).limit_denominator(100000).denominator)
  p_new.set_value(v)
  pdb.add_price(p_new)

# Clean up
session.save()
session.end()
session.destroy()

You now have the stock quotes from Intel in your Gnucash file!

Further Information