Estoy intentando descargar los datos de stock de yahoo finance a mi código de Julia y usarlos para un análisis más detallado. Dado que los paquetes relacionados con las acciones de Julia tienen muchos errores al descargar datos, quiero usar PyCall para utilizar la biblioteca de Python yfinance para obtener los datos.

El ejemplo de Python para obtener los datos se presenta a continuación:

import yfinance as yf
msft = yf.Ticker("MSFT")
# get stock info
msft.info

# get historical market data
hist = msft.history(period="max")

# show actions (dividends, splits)
msft.actions
print(msft.actions)

# show dividends
msft.dividends
print(msft.dividends)

# show splits
msft.splits
print(msft.splits)

# show financials
msft.financials
msft.quarterly_financials

# show major holders
msft.major_holders

# show institutional holders
msft.institutional_holders

# show balance sheet
msft.balance_sheet
msft.quarterly_balance_sheet

# show cashflow
msft.cashflow
msft.quarterly_cashflow

# show earnings
msft.earnings
msft.quarterly_earnings

# show sustainability
msft.sustainability

# show analysts recommendations
msft.recommendations

# show next event (earnings, etc)
msft.calendar

# show ISIN code - *experimental*
# ISIN = International Securities Identification Number
msft.isin

# show options expirations
msft.options

# get option chain for specific expiration
opt = msft.option_chain('2021-01-29')
# data available via: opt.calls, opt.puts

Mi opinión sobre el código julia:

module MyModule
using PyCall
function __init__()
    py"""
    import yfinance as yf
    def data()
        data = yf.download("SPY AAPL", start="2017-01-01", end="2017-04-30")
    """
end
tickers_data = py"data"

end

Disculpas por el mal ejemplo, pero no estoy seguro de cómo usar PyCall en tal escenario. Sugiera una solución a este problema.

Gracias de antemano.

Actualización:

Instalé yfinance en la anaconda (conda version 4.9.2) usando el siguiente comando:

conda install -c ranaroussi yfinance

Esto instalará la biblioteca yfinance en el base root de conda.

Siguiendo las sugerencias de @PrzemyslawSzufel, actualicé mi código PyCall:

using PyCall

yf = pyimport("yfinance")

# Tickers
msft = yf.Ticker("MSFT")

# get stock information
msft.info

# get historical market data
hist = msft.history(period="max")

# show actions (dividends, splits)
msft.actions
println(msft.actions)

Sin embargo, al ejecutar este fragmento, se lanza un PyError:

PyError (PyImport_ImportModule

The Python package yfinance could not be imported by pyimport. Usually this means
that you did not install yfinance in the Python version being used by PyCall.

PyCall is currently configured to use the Julia-specific Python distribution
installed by the Conda.jl package.  To install the yfinance module, you can
use `pyimport_conda("yfinance", PKG)`, where PKG is the Anaconda
package the contains the module yfinance, or alternatively you can use the
Conda package directly (via `using Conda` followed by `Conda.add` etcetera).

Alternatively, if you want to use a different Python distribution on your
system, such as a system-wide Python (as opposed to the Julia-specific Python),
you can re-configure PyCall with that Python.   As explained in the PyCall
documentation, set ENV["PYTHON"] to the path/name of the python executable
you want to use, run Pkg.build("PyCall"), and re-launch Julia.

Intenté resolver esto importando específicamente el paquete en julia usando conda:

using Conda

Conda.add("ranaroussi yfinance")
yf = pyimport_conda("yfinance", PKG)

Incluso esto no resuelve el problema. Sugiera una solución para este error. Gracias.

2
Mohammad Saad 24 ene. 2021 a las 22:48

1 respuesta

La mejor respuesta

Suponiendo que logró instalar yfinance, todo lo que necesita hacer es:

using PyCall
run(`$(PyCall.python) -m pip install yfinance`)
yf = pyimport("yfinance")
msft = yf.Ticker("MSFT")

Tenga en cuenta que, a partir de hoy, la instalación de yfinance a través de Conda.jl ni Anaconda parece no funcionar y, por lo tanto, es necesario utilizar pip.

Ahora puede copiar el resto del código a su función de Julia. Reemplaza print con println y todo funcionará.

Por ejemplo:

julia> # get stock info
       msft.info
Dict{Any, Any} with 123 entries:
  "tradeable"                    => false
  "market"                       => "us_market"
  "dayLow"                       => 224.22
  "sharesShort"                  => 39201229
  "priceToBook"                  => 14.0704
  "sharesOutstanding"            => 7560500224
  "nextFiscalYearEnd"            => 1656547200
  "threeYearAverageReturn"       => nothing
  "legalType"                    => nothing
  "address1"                     => "One Microsoft Way"
  "regularMarketPreviousClose"   => 225.95
  "priceHint"                    => 2
  "askSize"                      => 1400
  "fundFamily"                   => nothing
  "regularMarketVolume"          => 31716461
  "trailingEps"                  => 6.199
  "ask"                          => 229.88
  "lastSplitDate"                => 1045526400
  ⋮                              => ⋮

1
Przemyslaw Szufel 26 ene. 2021 a las 00:02