stock-tracker

This commit is contained in:
C菌
2026-07-04 00:17:11 +08:00
commit 6087341a48
6463 changed files with 1929869 additions and 0 deletions
+7
View File
@@ -0,0 +1,7 @@
**/__pycache__/
**/.venv/
**/.env
**/.git/
**/node_modules/
**/stock_tracker.db
*.md
+68
View File
@@ -0,0 +1,68 @@
REGISTRY ?= your-registry
BACKEND_IMAGE ?= $(REGISTRY)/stock-tracker-backend
FRONTEND_IMAGE ?= $(REGISTRY)/stock-tracker-frontend
TAG ?= latest
PLATFORMS ?= linux/amd64,linux/arm64
.PHONY: help build build-backend build-frontend push push-backend \
push-frontend multiarch multiarch-backend multiarch-frontend \
compose-up compose-down compose-build clean
help: ## 显示帮助信息
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | \
awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}'
# ── 本地构建(当前架构) ──────────────────────────────────
build: build-backend build-frontend ## 构建后端和前端镜像(当前架构)
build-backend: ## 构建后端镜像
docker build -t $(BACKEND_IMAGE):$(TAG) ./backend
build-frontend: ## 构建前端镜像
docker build -t $(FRONTEND_IMAGE):$(TAG) ./frontend
# ── 推送单架构镜像 ──────────────────────────────────────
push: push-backend push-frontend ## 推送后端和前端镜像
push-backend: build-backend ## 构建并推送后端镜像
docker push $(BACKEND_IMAGE):$(TAG)
push-frontend: build-frontend ## 构建并推送前端镜像
docker push $(FRONTEND_IMAGE):$(TAG)
# ── 多架构构建(arm64 + amd64) ─────────────────────────
multiarch: multiarch-backend multiarch-frontend ## 构建并推送多架构镜像(arm64 + amd64
multiarch-backend: ## 构建并推送后端多架构镜像
docker buildx build \
--platform $(PLATFORMS) \
-t $(BACKEND_IMAGE):$(TAG) \
./backend \
--push
multiarch-frontend: ## 构建并推送前端多架构镜像
docker buildx build \
--platform $(PLATFORMS) \
-t $(FRONTEND_IMAGE):$(TAG) \
./frontend \
--push
# ── docker compose 管理 ────────────────────────────────
compose-up: ## 启动所有服务
docker compose up -d
compose-down: ## 停止所有服务
docker compose down
compose-build: ## 构建所有服务(本地架构)
docker compose build
# ── 清理 ───────────────────────────────────────────────
clean: ## 清理本地构建的镜像
-docker rmi $(BACKEND_IMAGE):$(TAG) 2>/dev/null || true
-docker rmi $(FRONTEND_IMAGE):$(TAG) 2>/dev/null || true
+241
View File
@@ -0,0 +1,241 @@
<#
.Synopsis
Activate a Python virtual environment for the current PowerShell session.
.Description
Pushes the python executable for a virtual environment to the front of the
$Env:PATH environment variable and sets the prompt to signify that you are
in a Python virtual environment. Makes use of the command line switches as
well as the `pyvenv.cfg` file values present in the virtual environment.
.Parameter VenvDir
Path to the directory that contains the virtual environment to activate. The
default value for this is the parent of the directory that the Activate.ps1
script is located within.
.Parameter Prompt
The prompt prefix to display when this virtual environment is activated. By
default, this prompt is the name of the virtual environment folder (VenvDir)
surrounded by parentheses and followed by a single space (ie. '(.venv) ').
.Example
Activate.ps1
Activates the Python virtual environment that contains the Activate.ps1 script.
.Example
Activate.ps1 -Verbose
Activates the Python virtual environment that contains the Activate.ps1 script,
and shows extra information about the activation as it executes.
.Example
Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv
Activates the Python virtual environment located in the specified location.
.Example
Activate.ps1 -Prompt "MyPython"
Activates the Python virtual environment that contains the Activate.ps1 script,
and prefixes the current prompt with the specified string (surrounded in
parentheses) while the virtual environment is active.
.Notes
On Windows, it may be required to enable this Activate.ps1 script by setting the
execution policy for the user. You can do this by issuing the following PowerShell
command:
PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
For more information on Execution Policies:
https://go.microsoft.com/fwlink/?LinkID=135170
#>
Param(
[Parameter(Mandatory = $false)]
[String]
$VenvDir,
[Parameter(Mandatory = $false)]
[String]
$Prompt
)
<# Function declarations --------------------------------------------------- #>
<#
.Synopsis
Remove all shell session elements added by the Activate script, including the
addition of the virtual environment's Python executable from the beginning of
the PATH variable.
.Parameter NonDestructive
If present, do not remove this function from the global namespace for the
session.
#>
function global:deactivate ([switch]$NonDestructive) {
# Revert to original values
# The prior prompt:
if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) {
Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt
Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT
}
# The prior PYTHONHOME:
if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) {
Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME
Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME
}
# The prior PATH:
if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) {
Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH
Remove-Item -Path Env:_OLD_VIRTUAL_PATH
}
# Just remove the VIRTUAL_ENV altogether:
if (Test-Path -Path Env:VIRTUAL_ENV) {
Remove-Item -Path env:VIRTUAL_ENV
}
# Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether:
if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) {
Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force
}
# Leave deactivate function in the global namespace if requested:
if (-not $NonDestructive) {
Remove-Item -Path function:deactivate
}
}
<#
.Description
Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the
given folder, and returns them in a map.
For each line in the pyvenv.cfg file, if that line can be parsed into exactly
two strings separated by `=` (with any amount of whitespace surrounding the =)
then it is considered a `key = value` line. The left hand string is the key,
the right hand is the value.
If the value starts with a `'` or a `"` then the first and last character is
stripped from the value before being captured.
.Parameter ConfigDir
Path to the directory that contains the `pyvenv.cfg` file.
#>
function Get-PyVenvConfig(
[String]
$ConfigDir
) {
Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg"
# Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue).
$pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue
# An empty map will be returned if no config file is found.
$pyvenvConfig = @{ }
if ($pyvenvConfigPath) {
Write-Verbose "File exists, parse `key = value` lines"
$pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath
$pyvenvConfigContent | ForEach-Object {
$keyval = $PSItem -split "\s*=\s*", 2
if ($keyval[0] -and $keyval[1]) {
$val = $keyval[1]
# Remove extraneous quotations around a string value.
if ("'""".Contains($val.Substring(0, 1))) {
$val = $val.Substring(1, $val.Length - 2)
}
$pyvenvConfig[$keyval[0]] = $val
Write-Verbose "Adding Key: '$($keyval[0])'='$val'"
}
}
}
return $pyvenvConfig
}
<# Begin Activate script --------------------------------------------------- #>
# Determine the containing directory of this script
$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition
$VenvExecDir = Get-Item -Path $VenvExecPath
Write-Verbose "Activation script is located in path: '$VenvExecPath'"
Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)"
Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)"
# Set values required in priority: CmdLine, ConfigFile, Default
# First, get the location of the virtual environment, it might not be
# VenvExecDir if specified on the command line.
if ($VenvDir) {
Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values"
}
else {
Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir."
$VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/")
Write-Verbose "VenvDir=$VenvDir"
}
# Next, read the `pyvenv.cfg` file to determine any required value such
# as `prompt`.
$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir
# Next, set the prompt from the command line, or the config file, or
# just use the name of the virtual environment folder.
if ($Prompt) {
Write-Verbose "Prompt specified as argument, using '$Prompt'"
}
else {
Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value"
if ($pyvenvCfg -and $pyvenvCfg['prompt']) {
Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'"
$Prompt = $pyvenvCfg['prompt'];
}
else {
Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virutal environment)"
Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'"
$Prompt = Split-Path -Path $venvDir -Leaf
}
}
Write-Verbose "Prompt = '$Prompt'"
Write-Verbose "VenvDir='$VenvDir'"
# Deactivate any currently active virtual environment, but leave the
# deactivate function in place.
deactivate -nondestructive
# Now set the environment variable VIRTUAL_ENV, used by many tools to determine
# that there is an activated venv.
$env:VIRTUAL_ENV = $VenvDir
if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) {
Write-Verbose "Setting prompt to '$Prompt'"
# Set the prompt to include the env name
# Make sure _OLD_VIRTUAL_PROMPT is global
function global:_OLD_VIRTUAL_PROMPT { "" }
Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT
New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt
function global:prompt {
Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) "
_OLD_VIRTUAL_PROMPT
}
}
# Clear PYTHONHOME
if (Test-Path -Path Env:PYTHONHOME) {
Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME
Remove-Item -Path Env:PYTHONHOME
}
# Add the venv to the PATH
Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH
$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH"
+66
View File
@@ -0,0 +1,66 @@
# This file must be used with "source bin/activate" *from bash*
# you cannot run it directly
deactivate () {
# reset old environment variables
if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then
PATH="${_OLD_VIRTUAL_PATH:-}"
export PATH
unset _OLD_VIRTUAL_PATH
fi
if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then
PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}"
export PYTHONHOME
unset _OLD_VIRTUAL_PYTHONHOME
fi
# This should detect bash and zsh, which have a hash command that must
# be called to get it to forget past commands. Without forgetting
# past commands the $PATH changes we made may not be respected
if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then
hash -r 2> /dev/null
fi
if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then
PS1="${_OLD_VIRTUAL_PS1:-}"
export PS1
unset _OLD_VIRTUAL_PS1
fi
unset VIRTUAL_ENV
if [ ! "${1:-}" = "nondestructive" ] ; then
# Self destruct!
unset -f deactivate
fi
}
# unset irrelevant variables
deactivate nondestructive
VIRTUAL_ENV="/Users/cjun/Code/github/stock-tracker/backend/.venv"
export VIRTUAL_ENV
_OLD_VIRTUAL_PATH="$PATH"
PATH="$VIRTUAL_ENV/bin:$PATH"
export PATH
# unset PYTHONHOME if set
# this will fail if PYTHONHOME is set to the empty string (which is bad anyway)
# could use `if (set -u; : $PYTHONHOME) ;` in bash
if [ -n "${PYTHONHOME:-}" ] ; then
_OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}"
unset PYTHONHOME
fi
if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then
_OLD_VIRTUAL_PS1="${PS1:-}"
PS1="(.venv) ${PS1:-}"
export PS1
fi
# This should detect bash and zsh, which have a hash command that must
# be called to get it to forget past commands. Without forgetting
# past commands the $PATH changes we made may not be respected
if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then
hash -r 2> /dev/null
fi
+25
View File
@@ -0,0 +1,25 @@
# This file must be used with "source bin/activate.csh" *from csh*.
# You cannot run it directly.
# Created by Davide Di Blasi <davidedb@gmail.com>.
# Ported to Python 3.3 venv by Andrew Svetlov <andrew.svetlov@gmail.com>
alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; test "\!:*" != "nondestructive" && unalias deactivate'
# Unset irrelevant variables.
deactivate nondestructive
setenv VIRTUAL_ENV "/Users/cjun/Code/github/stock-tracker/backend/.venv"
set _OLD_VIRTUAL_PATH="$PATH"
setenv PATH "$VIRTUAL_ENV/bin:$PATH"
set _OLD_VIRTUAL_PROMPT="$prompt"
if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then
set prompt = "(.venv) $prompt"
endif
alias pydoc python -m pydoc
rehash
+64
View File
@@ -0,0 +1,64 @@
# This file must be used with "source <venv>/bin/activate.fish" *from fish*
# (https://fishshell.com/); you cannot run it directly.
function deactivate -d "Exit virtual environment and return to normal shell environment"
# reset old environment variables
if test -n "$_OLD_VIRTUAL_PATH"
set -gx PATH $_OLD_VIRTUAL_PATH
set -e _OLD_VIRTUAL_PATH
end
if test -n "$_OLD_VIRTUAL_PYTHONHOME"
set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME
set -e _OLD_VIRTUAL_PYTHONHOME
end
if test -n "$_OLD_FISH_PROMPT_OVERRIDE"
functions -e fish_prompt
set -e _OLD_FISH_PROMPT_OVERRIDE
functions -c _old_fish_prompt fish_prompt
functions -e _old_fish_prompt
end
set -e VIRTUAL_ENV
if test "$argv[1]" != "nondestructive"
# Self-destruct!
functions -e deactivate
end
end
# Unset irrelevant variables.
deactivate nondestructive
set -gx VIRTUAL_ENV "/Users/cjun/Code/github/stock-tracker/backend/.venv"
set -gx _OLD_VIRTUAL_PATH $PATH
set -gx PATH "$VIRTUAL_ENV/bin" $PATH
# Unset PYTHONHOME if set.
if set -q PYTHONHOME
set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME
set -e PYTHONHOME
end
if test -z "$VIRTUAL_ENV_DISABLE_PROMPT"
# fish uses a function instead of an env var to generate the prompt.
# Save the current fish_prompt function as the function _old_fish_prompt.
functions -c fish_prompt _old_fish_prompt
# With the original prompt function renamed, we can override with our own.
function fish_prompt
# Save the return status of the last command.
set -l old_status $status
# Output the venv prompt; color taken from the blue of the Python logo.
printf "%s%s%s" (set_color 4B8BBE) "(.venv) " (set_color normal)
# Restore the return status of the previous command.
echo "exit $old_status" | .
# Output the original/"old" prompt.
_old_fish_prompt
end
set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV"
end
+8
View File
@@ -0,0 +1,8 @@
#!/Users/cjun/Code/github/stock-tracker/backend/.venv/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from dotenv.__main__ import cli
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(cli())
+8
View File
@@ -0,0 +1,8 @@
#!/Users/cjun/Code/github/stock-tracker/backend/.venv/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from numpy.f2py.f2py2e import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())
+8
View File
@@ -0,0 +1,8 @@
#!/Users/cjun/Code/github/stock-tracker/backend/.venv/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from fastapi.cli import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())
+8
View File
@@ -0,0 +1,8 @@
#!/Users/cjun/Code/github/stock-tracker/backend/.venv/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from idna.cli import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())
+8
View File
@@ -0,0 +1,8 @@
#!/Users/cjun/Code/github/stock-tracker/backend/.venv/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from charset_normalizer.cli import cli_detect
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(cli_detect())
+8
View File
@@ -0,0 +1,8 @@
#!/Users/cjun/Code/github/stock-tracker/backend/.venv/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from pip._internal.cli.main import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())
+8
View File
@@ -0,0 +1,8 @@
#!/Users/cjun/Code/github/stock-tracker/backend/.venv/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from pip._internal.cli.main import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())
+8
View File
@@ -0,0 +1,8 @@
#!/Users/cjun/Code/github/stock-tracker/backend/.venv/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from pip._internal.cli.main import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())
+1
View File
@@ -0,0 +1 @@
python3
+1
View File
@@ -0,0 +1 @@
/Applications/Xcode.app/Contents/Developer/usr/bin/python3
+1
View File
@@ -0,0 +1 @@
python3
+410
View File
@@ -0,0 +1,410 @@
#!/Users/cjun/Code/github/stock-tracker/backend/.venv/bin/python3
# Copyright (c) 2005-2012 Stephen John Machin, Lingfo Pty Ltd
# This script is part of the xlrd package, which is released under a
# BSD-style licence.
from __future__ import print_function
cmd_doc = """
Commands:
2rows Print the contents of first and last row in each sheet
3rows Print the contents of first, second and last row in each sheet
bench Same as "show", but doesn't print -- for profiling
biff_count[1] Print a count of each type of BIFF record in the file
biff_dump[1] Print a dump (char and hex) of the BIFF records in the file
fonts hdr + print a dump of all font objects
hdr Mini-overview of file (no per-sheet information)
hotshot Do a hotshot profile run e.g. ... -f1 hotshot bench bigfile*.xls
labels Dump of sheet.col_label_ranges and ...row... for each sheet
name_dump Dump of each object in book.name_obj_list
names Print brief information for each NAME record
ov Overview of file
profile Like "hotshot", but uses cProfile
show Print the contents of all rows in each sheet
version[0] Print versions of xlrd and Python and exit
xfc Print "XF counts" and cell-type counts -- see code for details
[0] means no file arg
[1] means only one file arg i.e. no glob.glob pattern
"""
options = None
if __name__ == "__main__":
import xlrd
import sys
import time
import glob
import traceback
import gc
from xlrd.timemachine import xrange, REPR
class LogHandler(object):
def __init__(self, logfileobj):
self.logfileobj = logfileobj
self.fileheading = None
self.shown = 0
def setfileheading(self, fileheading):
self.fileheading = fileheading
self.shown = 0
def write(self, text):
if self.fileheading and not self.shown:
self.logfileobj.write(self.fileheading)
self.shown = 1
self.logfileobj.write(text)
null_cell = xlrd.empty_cell
def show_row(bk, sh, rowx, colrange, printit):
if bk.ragged_rows:
colrange = range(sh.row_len(rowx))
if not colrange: return
if printit: print()
if bk.formatting_info:
for colx, ty, val, cxfx in get_row_data(bk, sh, rowx, colrange):
if printit:
print("cell %s%d: type=%d, data: %r, xfx: %s"
% (xlrd.colname(colx), rowx+1, ty, val, cxfx))
else:
for colx, ty, val, _unused in get_row_data(bk, sh, rowx, colrange):
if printit:
print("cell %s%d: type=%d, data: %r" % (xlrd.colname(colx), rowx+1, ty, val))
def get_row_data(bk, sh, rowx, colrange):
result = []
dmode = bk.datemode
ctys = sh.row_types(rowx)
cvals = sh.row_values(rowx)
for colx in colrange:
cty = ctys[colx]
cval = cvals[colx]
if bk.formatting_info:
cxfx = str(sh.cell_xf_index(rowx, colx))
else:
cxfx = ''
if cty == xlrd.XL_CELL_DATE:
try:
showval = xlrd.xldate_as_tuple(cval, dmode)
except xlrd.XLDateError as e:
showval = "%s:%s" % (type(e).__name__, e)
cty = xlrd.XL_CELL_ERROR
elif cty == xlrd.XL_CELL_ERROR:
showval = xlrd.error_text_from_code.get(cval, '<Unknown error code 0x%02x>' % cval)
else:
showval = cval
result.append((colx, cty, showval, cxfx))
return result
def bk_header(bk):
print()
print("BIFF version: %s; datemode: %s"
% (xlrd.biff_text_from_num[bk.biff_version], bk.datemode))
print("codepage: %r (encoding: %s); countries: %r"
% (bk.codepage, bk.encoding, bk.countries))
print("Last saved by: %r" % bk.user_name)
print("Number of data sheets: %d" % bk.nsheets)
print("Use mmap: %d; Formatting: %d; On demand: %d"
% (bk.use_mmap, bk.formatting_info, bk.on_demand))
print("Ragged rows: %d" % bk.ragged_rows)
if bk.formatting_info:
print("FORMATs: %d, FONTs: %d, XFs: %d"
% (len(bk.format_list), len(bk.font_list), len(bk.xf_list)))
if not options.suppress_timing:
print("Load time: %.2f seconds (stage 1) %.2f seconds (stage 2)"
% (bk.load_time_stage_1, bk.load_time_stage_2))
print()
def show_fonts(bk):
print("Fonts:")
for x in xrange(len(bk.font_list)):
font = bk.font_list[x]
font.dump(header='== Index %d ==' % x, indent=4)
def show_names(bk, dump=0):
bk_header(bk)
if bk.biff_version < 50:
print("Names not extracted in this BIFF version")
return
nlist = bk.name_obj_list
print("Name list: %d entries" % len(nlist))
for nobj in nlist:
if dump:
nobj.dump(sys.stdout,
header="\n=== Dump of name_obj_list[%d] ===" % nobj.name_index)
else:
print("[%d]\tName:%r macro:%r scope:%d\n\tresult:%r\n"
% (nobj.name_index, nobj.name, nobj.macro, nobj.scope, nobj.result))
def print_labels(sh, labs, title):
if not labs:return
for rlo, rhi, clo, chi in labs:
print("%s label range %s:%s contains:"
% (title, xlrd.cellname(rlo, clo), xlrd.cellname(rhi-1, chi-1)))
for rx in xrange(rlo, rhi):
for cx in xrange(clo, chi):
print(" %s: %r" % (xlrd.cellname(rx, cx), sh.cell_value(rx, cx)))
def show_labels(bk):
# bk_header(bk)
hdr = 0
for shx in range(bk.nsheets):
sh = bk.sheet_by_index(shx)
clabs = sh.col_label_ranges
rlabs = sh.row_label_ranges
if clabs or rlabs:
if not hdr:
bk_header(bk)
hdr = 1
print("sheet %d: name = %r; nrows = %d; ncols = %d" %
(shx, sh.name, sh.nrows, sh.ncols))
print_labels(sh, clabs, 'Col')
print_labels(sh, rlabs, 'Row')
if bk.on_demand: bk.unload_sheet(shx)
def show(bk, nshow=65535, printit=1):
bk_header(bk)
if 0:
rclist = xlrd.sheet.rc_stats.items()
rclist = sorted(rclist)
print("rc stats")
for k, v in rclist:
print("0x%04x %7d" % (k, v))
if options.onesheet:
try:
shx = int(options.onesheet)
except ValueError:
shx = bk.sheet_by_name(options.onesheet).number
shxrange = [shx]
else:
shxrange = range(bk.nsheets)
# print("shxrange", list(shxrange))
for shx in shxrange:
sh = bk.sheet_by_index(shx)
nrows, ncols = sh.nrows, sh.ncols
colrange = range(ncols)
anshow = min(nshow, nrows)
print("sheet %d: name = %s; nrows = %d; ncols = %d" %
(shx, REPR(sh.name), sh.nrows, sh.ncols))
if nrows and ncols:
# Beat the bounds
for rowx in xrange(nrows):
nc = sh.row_len(rowx)
if nc:
sh.row_types(rowx)[nc-1]
sh.row_values(rowx)[nc-1]
sh.cell(rowx, nc-1)
for rowx in xrange(anshow-1):
if not printit and rowx % 10000 == 1 and rowx > 1:
print("done %d rows" % (rowx-1,))
show_row(bk, sh, rowx, colrange, printit)
if anshow and nrows:
show_row(bk, sh, nrows-1, colrange, printit)
print()
if bk.on_demand: bk.unload_sheet(shx)
def count_xfs(bk):
bk_header(bk)
for shx in range(bk.nsheets):
sh = bk.sheet_by_index(shx)
nrows = sh.nrows
print("sheet %d: name = %r; nrows = %d; ncols = %d" %
(shx, sh.name, sh.nrows, sh.ncols))
# Access all xfindexes to force gathering stats
type_stats = [0, 0, 0, 0, 0, 0, 0]
for rowx in xrange(nrows):
for colx in xrange(sh.row_len(rowx)):
xfx = sh.cell_xf_index(rowx, colx)
assert xfx >= 0
cty = sh.cell_type(rowx, colx)
type_stats[cty] += 1
print("XF stats", sh._xf_index_stats)
print("type stats", type_stats)
print()
if bk.on_demand: bk.unload_sheet(shx)
def main(cmd_args):
import optparse
global options
usage = "\n%prog [options] command [input-file-patterns]\n" + cmd_doc
oparser = optparse.OptionParser(usage)
oparser.add_option(
"-l", "--logfilename",
default="",
help="contains error messages")
oparser.add_option(
"-v", "--verbosity",
type="int", default=0,
help="level of information and diagnostics provided")
oparser.add_option(
"-m", "--mmap",
type="int", default=-1,
help="1: use mmap; 0: don't use mmap; -1: accept heuristic")
oparser.add_option(
"-e", "--encoding",
default="",
help="encoding override")
oparser.add_option(
"-f", "--formatting",
type="int", default=0,
help="0 (default): no fmt info\n"
"1: fmt info (all cells)\n",
)
oparser.add_option(
"-g", "--gc",
type="int", default=0,
help="0: auto gc enabled; 1: auto gc disabled, manual collect after each file; 2: no gc")
oparser.add_option(
"-s", "--onesheet",
default="",
help="restrict output to this sheet (name or index)")
oparser.add_option(
"-u", "--unnumbered",
action="store_true", default=0,
help="omit line numbers or offsets in biff_dump")
oparser.add_option(
"-d", "--on-demand",
action="store_true", default=0,
help="load sheets on demand instead of all at once")
oparser.add_option(
"-t", "--suppress-timing",
action="store_true", default=0,
help="don't print timings (diffs are less messy)")
oparser.add_option(
"-r", "--ragged-rows",
action="store_true", default=0,
help="open_workbook(..., ragged_rows=True)")
options, args = oparser.parse_args(cmd_args)
if len(args) == 1 and args[0] in ("version", ):
pass
elif len(args) < 2:
oparser.error("Expected at least 2 args, found %d" % len(args))
cmd = args[0]
xlrd_version = getattr(xlrd, "__VERSION__", "unknown; before 0.5")
if cmd == 'biff_dump':
xlrd.dump(args[1], unnumbered=options.unnumbered)
sys.exit(0)
if cmd == 'biff_count':
xlrd.count_records(args[1])
sys.exit(0)
if cmd == 'version':
print("xlrd: %s, from %s" % (xlrd_version, xlrd.__file__))
print("Python:", sys.version)
sys.exit(0)
if options.logfilename:
logfile = LogHandler(open(options.logfilename, 'w'))
else:
logfile = sys.stdout
mmap_opt = options.mmap
mmap_arg = xlrd.USE_MMAP
if mmap_opt in (1, 0):
mmap_arg = mmap_opt
elif mmap_opt != -1:
print('Unexpected value (%r) for mmap option -- assuming default' % mmap_opt)
fmt_opt = options.formatting | (cmd in ('xfc', ))
gc_mode = options.gc
if gc_mode:
gc.disable()
for pattern in args[1:]:
for fname in glob.glob(pattern):
print("\n=== File: %s ===" % fname)
if logfile != sys.stdout:
logfile.setfileheading("\n=== File: %s ===\n" % fname)
if gc_mode == 1:
n_unreachable = gc.collect()
if n_unreachable:
print("GC before open:", n_unreachable, "unreachable objects")
try:
t0 = time.time()
bk = xlrd.open_workbook(
fname,
verbosity=options.verbosity, logfile=logfile,
use_mmap=mmap_arg,
encoding_override=options.encoding,
formatting_info=fmt_opt,
on_demand=options.on_demand,
ragged_rows=options.ragged_rows,
)
t1 = time.time()
if not options.suppress_timing:
print("Open took %.2f seconds" % (t1-t0,))
except xlrd.XLRDError as e:
print("*** Open failed: %s: %s" % (type(e).__name__, e))
continue
except KeyboardInterrupt:
print("*** KeyboardInterrupt ***")
traceback.print_exc(file=sys.stdout)
sys.exit(1)
except BaseException as e:
print("*** Open failed: %s: %s" % (type(e).__name__, e))
traceback.print_exc(file=sys.stdout)
continue
t0 = time.time()
if cmd == 'hdr':
bk_header(bk)
elif cmd == 'ov': # OverView
show(bk, 0)
elif cmd == 'show': # all rows
show(bk)
elif cmd == '2rows': # first row and last row
show(bk, 2)
elif cmd == '3rows': # first row, 2nd row and last row
show(bk, 3)
elif cmd == 'bench':
show(bk, printit=0)
elif cmd == 'fonts':
bk_header(bk)
show_fonts(bk)
elif cmd == 'names': # named reference list
show_names(bk)
elif cmd == 'name_dump': # named reference list
show_names(bk, dump=1)
elif cmd == 'labels':
show_labels(bk)
elif cmd == 'xfc':
count_xfs(bk)
else:
print("*** Unknown command <%s>" % cmd)
sys.exit(1)
del bk
if gc_mode == 1:
n_unreachable = gc.collect()
if n_unreachable:
print("GC post cmd:", fname, "->", n_unreachable, "unreachable objects")
if not options.suppress_timing:
t1 = time.time()
print("\ncommand took %.2f seconds\n" % (t1-t0,))
return None
av = sys.argv[1:]
if not av:
main(av)
firstarg = av[0].lower()
if firstarg == "hotshot":
import hotshot
import hotshot.stats
av = av[1:]
prof_log_name = "XXXX.prof"
prof = hotshot.Profile(prof_log_name)
# benchtime, result = prof.runcall(main, *av)
result = prof.runcall(main, *(av, ))
print("result", repr(result))
prof.close()
stats = hotshot.stats.load(prof_log_name)
stats.strip_dirs()
stats.sort_stats('time', 'calls')
stats.print_stats(20)
elif firstarg == "profile":
import cProfile
av = av[1:]
cProfile.run('main(av)', 'YYYY.prof')
import pstats
p = pstats.Stats('YYYY.prof')
p.strip_dirs().sort_stats('cumulative').print_stats(30)
else:
main(av)
+8
View File
@@ -0,0 +1,8 @@
#!/Users/cjun/Code/github/stock-tracker/backend/.venv/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from tabulate import _main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(_main())
+8
View File
@@ -0,0 +1,8 @@
#!/Users/cjun/Code/github/stock-tracker/backend/.venv/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from tqdm.cli import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())
+8
View File
@@ -0,0 +1,8 @@
#!/Users/cjun/Code/github/stock-tracker/backend/.venv/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from uvicorn.main import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())
+8
View File
@@ -0,0 +1,8 @@
#!/Users/cjun/Code/github/stock-tracker/backend/.venv/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from watchfiles.cli import cli
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(cli())
+8
View File
@@ -0,0 +1,8 @@
#!/Users/cjun/Code/github/stock-tracker/backend/.venv/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from websockets.cli import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())
@@ -0,0 +1,164 @@
/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */
/* Greenlet object interface */
#ifndef Py_GREENLETOBJECT_H
#define Py_GREENLETOBJECT_H
#include <Python.h>
#ifdef __cplusplus
extern "C" {
#endif
/* This is deprecated and undocumented. It does not change. */
#define GREENLET_VERSION "1.0.0"
#ifndef GREENLET_MODULE
#define implementation_ptr_t void*
#endif
typedef struct _greenlet {
PyObject_HEAD
PyObject* weakreflist;
PyObject* dict;
implementation_ptr_t pimpl;
} PyGreenlet;
#define PyGreenlet_Check(op) (op && PyObject_TypeCheck(op, &PyGreenlet_Type))
/* C API functions */
/* Total number of symbols that are exported */
#define PyGreenlet_API_pointers 12
#define PyGreenlet_Type_NUM 0
#define PyExc_GreenletError_NUM 1
#define PyExc_GreenletExit_NUM 2
#define PyGreenlet_New_NUM 3
#define PyGreenlet_GetCurrent_NUM 4
#define PyGreenlet_Throw_NUM 5
#define PyGreenlet_Switch_NUM 6
#define PyGreenlet_SetParent_NUM 7
#define PyGreenlet_MAIN_NUM 8
#define PyGreenlet_STARTED_NUM 9
#define PyGreenlet_ACTIVE_NUM 10
#define PyGreenlet_GET_PARENT_NUM 11
#ifndef GREENLET_MODULE
/* This section is used by modules that uses the greenlet C API */
static void** _PyGreenlet_API = NULL;
# define PyGreenlet_Type \
(*(PyTypeObject*)_PyGreenlet_API[PyGreenlet_Type_NUM])
# define PyExc_GreenletError \
((PyObject*)_PyGreenlet_API[PyExc_GreenletError_NUM])
# define PyExc_GreenletExit \
((PyObject*)_PyGreenlet_API[PyExc_GreenletExit_NUM])
/*
* PyGreenlet_New(PyObject *args)
*
* greenlet.greenlet(run, parent=None)
*/
# define PyGreenlet_New \
(*(PyGreenlet * (*)(PyObject * run, PyGreenlet * parent)) \
_PyGreenlet_API[PyGreenlet_New_NUM])
/*
* PyGreenlet_GetCurrent(void)
*
* greenlet.getcurrent()
*/
# define PyGreenlet_GetCurrent \
(*(PyGreenlet * (*)(void)) _PyGreenlet_API[PyGreenlet_GetCurrent_NUM])
/*
* PyGreenlet_Throw(
* PyGreenlet *greenlet,
* PyObject *typ,
* PyObject *val,
* PyObject *tb)
*
* g.throw(...)
*/
# define PyGreenlet_Throw \
(*(PyObject * (*)(PyGreenlet * self, \
PyObject * typ, \
PyObject * val, \
PyObject * tb)) \
_PyGreenlet_API[PyGreenlet_Throw_NUM])
/*
* PyGreenlet_Switch(PyGreenlet *greenlet, PyObject *args)
*
* g.switch(*args, **kwargs)
*/
# define PyGreenlet_Switch \
(*(PyObject * \
(*)(PyGreenlet * greenlet, PyObject * args, PyObject * kwargs)) \
_PyGreenlet_API[PyGreenlet_Switch_NUM])
/*
* PyGreenlet_SetParent(PyObject *greenlet, PyObject *new_parent)
*
* g.parent = new_parent
*/
# define PyGreenlet_SetParent \
(*(int (*)(PyGreenlet * greenlet, PyGreenlet * nparent)) \
_PyGreenlet_API[PyGreenlet_SetParent_NUM])
/*
* PyGreenlet_GetParent(PyObject* greenlet)
*
* return greenlet.parent;
*
* This could return NULL even if there is no exception active.
* If it does not return NULL, you are responsible for decrementing the
* reference count.
*/
# define PyGreenlet_GetParent \
(*(PyGreenlet* (*)(PyGreenlet*)) \
_PyGreenlet_API[PyGreenlet_GET_PARENT_NUM])
/*
* deprecated, undocumented alias.
*/
# define PyGreenlet_GET_PARENT PyGreenlet_GetParent
# define PyGreenlet_MAIN \
(*(int (*)(PyGreenlet*)) \
_PyGreenlet_API[PyGreenlet_MAIN_NUM])
# define PyGreenlet_STARTED \
(*(int (*)(PyGreenlet*)) \
_PyGreenlet_API[PyGreenlet_STARTED_NUM])
# define PyGreenlet_ACTIVE \
(*(int (*)(PyGreenlet*)) \
_PyGreenlet_API[PyGreenlet_ACTIVE_NUM])
/* Macro that imports greenlet and initializes C API */
/* NOTE: This has actually moved to ``greenlet._greenlet._C_API``, but we
keep the older definition to be sure older code that might have a copy of
the header still works. */
# define PyGreenlet_Import() \
{ \
_PyGreenlet_API = (void**)PyCapsule_Import("greenlet._C_API", 0); \
}
#endif /* GREENLET_MODULE */
#ifdef __cplusplus
}
#endif
#endif /* !Py_GREENLETOBJECT_H */
@@ -0,0 +1,19 @@
Copyright 2005-2024 SQLAlchemy authors and contributors <see AUTHORS file>.
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
@@ -0,0 +1,243 @@
Metadata-Version: 2.1
Name: SQLAlchemy
Version: 2.0.36
Summary: Database Abstraction Library
Home-page: https://www.sqlalchemy.org
Author: Mike Bayer
Author-email: mike_mp@zzzcomputing.com
License: MIT
Project-URL: Documentation, https://docs.sqlalchemy.org
Project-URL: Issue Tracker, https://github.com/sqlalchemy/sqlalchemy/
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python :: Implementation :: PyPy
Classifier: Topic :: Database :: Front-Ends
Requires-Python: >=3.7
Description-Content-Type: text/x-rst
License-File: LICENSE
Requires-Dist: typing-extensions >=4.6.0
Requires-Dist: greenlet !=0.4.17 ; python_version < "3.13" and (platform_machine == "aarch64" or (platform_machine == "ppc64le" or (platform_machine == "x86_64" or (platform_machine == "amd64" or (platform_machine == "AMD64" or (platform_machine == "win32" or platform_machine == "WIN32"))))))
Requires-Dist: importlib-metadata ; python_version < "3.8"
Provides-Extra: aiomysql
Requires-Dist: greenlet !=0.4.17 ; extra == 'aiomysql'
Requires-Dist: aiomysql >=0.2.0 ; extra == 'aiomysql'
Provides-Extra: aioodbc
Requires-Dist: greenlet !=0.4.17 ; extra == 'aioodbc'
Requires-Dist: aioodbc ; extra == 'aioodbc'
Provides-Extra: aiosqlite
Requires-Dist: greenlet !=0.4.17 ; extra == 'aiosqlite'
Requires-Dist: aiosqlite ; extra == 'aiosqlite'
Requires-Dist: typing-extensions !=3.10.0.1 ; extra == 'aiosqlite'
Provides-Extra: asyncio
Requires-Dist: greenlet !=0.4.17 ; extra == 'asyncio'
Provides-Extra: asyncmy
Requires-Dist: greenlet !=0.4.17 ; extra == 'asyncmy'
Requires-Dist: asyncmy !=0.2.4,!=0.2.6,>=0.2.3 ; extra == 'asyncmy'
Provides-Extra: mariadb_connector
Requires-Dist: mariadb !=1.1.10,!=1.1.2,!=1.1.5,>=1.0.1 ; extra == 'mariadb_connector'
Provides-Extra: mssql
Requires-Dist: pyodbc ; extra == 'mssql'
Provides-Extra: mssql_pymssql
Requires-Dist: pymssql ; extra == 'mssql_pymssql'
Provides-Extra: mssql_pyodbc
Requires-Dist: pyodbc ; extra == 'mssql_pyodbc'
Provides-Extra: mypy
Requires-Dist: mypy >=0.910 ; extra == 'mypy'
Provides-Extra: mysql
Requires-Dist: mysqlclient >=1.4.0 ; extra == 'mysql'
Provides-Extra: mysql_connector
Requires-Dist: mysql-connector-python ; extra == 'mysql_connector'
Provides-Extra: oracle
Requires-Dist: cx-oracle >=8 ; extra == 'oracle'
Provides-Extra: oracle_oracledb
Requires-Dist: oracledb >=1.0.1 ; extra == 'oracle_oracledb'
Provides-Extra: postgresql
Requires-Dist: psycopg2 >=2.7 ; extra == 'postgresql'
Provides-Extra: postgresql_asyncpg
Requires-Dist: greenlet !=0.4.17 ; extra == 'postgresql_asyncpg'
Requires-Dist: asyncpg ; extra == 'postgresql_asyncpg'
Provides-Extra: postgresql_pg8000
Requires-Dist: pg8000 >=1.29.1 ; extra == 'postgresql_pg8000'
Provides-Extra: postgresql_psycopg
Requires-Dist: psycopg >=3.0.7 ; extra == 'postgresql_psycopg'
Provides-Extra: postgresql_psycopg2binary
Requires-Dist: psycopg2-binary ; extra == 'postgresql_psycopg2binary'
Provides-Extra: postgresql_psycopg2cffi
Requires-Dist: psycopg2cffi ; extra == 'postgresql_psycopg2cffi'
Provides-Extra: postgresql_psycopgbinary
Requires-Dist: psycopg[binary] >=3.0.7 ; extra == 'postgresql_psycopgbinary'
Provides-Extra: pymysql
Requires-Dist: pymysql ; extra == 'pymysql'
Provides-Extra: sqlcipher
Requires-Dist: sqlcipher3-binary ; extra == 'sqlcipher'
SQLAlchemy
==========
|PyPI| |Python| |Downloads|
.. |PyPI| image:: https://img.shields.io/pypi/v/sqlalchemy
:target: https://pypi.org/project/sqlalchemy
:alt: PyPI
.. |Python| image:: https://img.shields.io/pypi/pyversions/sqlalchemy
:target: https://pypi.org/project/sqlalchemy
:alt: PyPI - Python Version
.. |Downloads| image:: https://static.pepy.tech/badge/sqlalchemy/month
:target: https://pepy.tech/project/sqlalchemy
:alt: PyPI - Downloads
The Python SQL Toolkit and Object Relational Mapper
Introduction
-------------
SQLAlchemy is the Python SQL toolkit and Object Relational Mapper
that gives application developers the full power and
flexibility of SQL. SQLAlchemy provides a full suite
of well known enterprise-level persistence patterns,
designed for efficient and high-performing database
access, adapted into a simple and Pythonic domain
language.
Major SQLAlchemy features include:
* An industrial strength ORM, built
from the core on the identity map, unit of work,
and data mapper patterns. These patterns
allow transparent persistence of objects
using a declarative configuration system.
Domain models
can be constructed and manipulated naturally,
and changes are synchronized with the
current transaction automatically.
* A relationally-oriented query system, exposing
the full range of SQL's capabilities
explicitly, including joins, subqueries,
correlation, and most everything else,
in terms of the object model.
Writing queries with the ORM uses the same
techniques of relational composition you use
when writing SQL. While you can drop into
literal SQL at any time, it's virtually never
needed.
* A comprehensive and flexible system
of eager loading for related collections and objects.
Collections are cached within a session,
and can be loaded on individual access, all
at once using joins, or by query per collection
across the full result set.
* A Core SQL construction system and DBAPI
interaction layer. The SQLAlchemy Core is
separate from the ORM and is a full database
abstraction layer in its own right, and includes
an extensible Python-based SQL expression
language, schema metadata, connection pooling,
type coercion, and custom types.
* All primary and foreign key constraints are
assumed to be composite and natural. Surrogate
integer primary keys are of course still the
norm, but SQLAlchemy never assumes or hardcodes
to this model.
* Database introspection and generation. Database
schemas can be "reflected" in one step into
Python structures representing database metadata;
those same structures can then generate
CREATE statements right back out - all within
the Core, independent of the ORM.
SQLAlchemy's philosophy:
* SQL databases behave less and less like object
collections the more size and performance start to
matter; object collections behave less and less like
tables and rows the more abstraction starts to matter.
SQLAlchemy aims to accommodate both of these
principles.
* An ORM doesn't need to hide the "R". A relational
database provides rich, set-based functionality
that should be fully exposed. SQLAlchemy's
ORM provides an open-ended set of patterns
that allow a developer to construct a custom
mediation layer between a domain model and
a relational schema, turning the so-called
"object relational impedance" issue into
a distant memory.
* The developer, in all cases, makes all decisions
regarding the design, structure, and naming conventions
of both the object model as well as the relational
schema. SQLAlchemy only provides the means
to automate the execution of these decisions.
* With SQLAlchemy, there's no such thing as
"the ORM generated a bad query" - you
retain full control over the structure of
queries, including how joins are organized,
how subqueries and correlation is used, what
columns are requested. Everything SQLAlchemy
does is ultimately the result of a developer-initiated
decision.
* Don't use an ORM if the problem doesn't need one.
SQLAlchemy consists of a Core and separate ORM
component. The Core offers a full SQL expression
language that allows Pythonic construction
of SQL constructs that render directly to SQL
strings for a target database, returning
result sets that are essentially enhanced DBAPI
cursors.
* Transactions should be the norm. With SQLAlchemy's
ORM, nothing goes to permanent storage until
commit() is called. SQLAlchemy encourages applications
to create a consistent means of delineating
the start and end of a series of operations.
* Never render a literal value in a SQL statement.
Bound parameters are used to the greatest degree
possible, allowing query optimizers to cache
query plans effectively and making SQL injection
attacks a non-issue.
Documentation
-------------
Latest documentation is at:
https://www.sqlalchemy.org/docs/
Installation / Requirements
---------------------------
Full documentation for installation is at
`Installation <https://www.sqlalchemy.org/docs/intro.html#installation>`_.
Getting Help / Development / Bug reporting
------------------------------------------
Please refer to the `SQLAlchemy Community Guide <https://www.sqlalchemy.org/support.html>`_.
Code of Conduct
---------------
Above all, SQLAlchemy places great emphasis on polite, thoughtful, and
constructive communication between users and developers.
Please see our current Code of Conduct at
`Code of Conduct <https://www.sqlalchemy.org/codeofconduct.html>`_.
License
-------
SQLAlchemy is distributed under the `MIT license
<https://www.opensource.org/licenses/mit-license.php>`_.
@@ -0,0 +1,530 @@
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/connectors/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/connectors/aioodbc.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/connectors/asyncio.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/connectors/pyodbc.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/cyextension/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/_typing.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/mssql/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/mssql/aioodbc.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/mssql/base.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/mssql/information_schema.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/mssql/json.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/mssql/provision.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/mssql/pymssql.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/mssql/pyodbc.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/mysql/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/mysql/aiomysql.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/mysql/asyncmy.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/mysql/base.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/mysql/cymysql.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/mysql/dml.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/mysql/enumerated.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/mysql/expression.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/mysql/json.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/mysql/mariadb.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/mysql/mariadbconnector.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/mysql/mysqlconnector.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/mysql/mysqldb.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/mysql/provision.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/mysql/pymysql.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/mysql/pyodbc.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/mysql/reflection.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/mysql/reserved_words.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/mysql/types.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/oracle/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/oracle/base.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/oracle/cx_oracle.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/oracle/dictionary.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/oracle/oracledb.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/oracle/provision.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/oracle/types.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/postgresql/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/postgresql/_psycopg_common.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/postgresql/array.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/postgresql/asyncpg.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/postgresql/base.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/postgresql/dml.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/postgresql/ext.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/postgresql/hstore.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/postgresql/json.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/postgresql/named_types.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/postgresql/operators.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/postgresql/pg8000.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/postgresql/pg_catalog.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/postgresql/provision.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/postgresql/psycopg.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/postgresql/psycopg2.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/postgresql/psycopg2cffi.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/postgresql/ranges.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/postgresql/types.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/sqlite/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/sqlite/aiosqlite.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/sqlite/base.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/sqlite/dml.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/sqlite/json.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/sqlite/provision.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/sqlite/pysqlcipher.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/dialects/sqlite/pysqlite.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/engine/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/engine/_py_processors.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/engine/_py_row.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/engine/_py_util.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/engine/base.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/engine/characteristics.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/engine/create.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/engine/cursor.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/engine/default.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/engine/events.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/engine/interfaces.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/engine/mock.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/engine/processors.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/engine/reflection.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/engine/result.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/engine/row.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/engine/strategies.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/engine/url.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/engine/util.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/event/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/event/api.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/event/attr.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/event/base.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/event/legacy.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/event/registry.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/events.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/exc.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/ext/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/ext/associationproxy.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/ext/asyncio/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/ext/asyncio/base.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/ext/asyncio/engine.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/ext/asyncio/exc.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/ext/asyncio/result.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/ext/asyncio/scoping.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/ext/asyncio/session.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/ext/automap.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/ext/baked.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/ext/compiler.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/ext/declarative/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/ext/declarative/extensions.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/ext/horizontal_shard.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/ext/hybrid.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/ext/indexable.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/ext/instrumentation.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/ext/mutable.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/ext/mypy/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/ext/mypy/apply.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/ext/mypy/decl_class.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/ext/mypy/infer.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/ext/mypy/names.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/ext/mypy/plugin.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/ext/mypy/util.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/ext/orderinglist.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/ext/serializer.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/future/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/future/engine.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/inspection.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/log.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/orm/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/orm/_orm_constructors.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/orm/_typing.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/orm/attributes.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/orm/base.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/orm/bulk_persistence.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/orm/clsregistry.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/orm/collections.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/orm/context.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/orm/decl_api.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/orm/decl_base.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/orm/dependency.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/orm/descriptor_props.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/orm/dynamic.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/orm/evaluator.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/orm/events.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/orm/exc.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/orm/identity.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/orm/instrumentation.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/orm/interfaces.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/orm/loading.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/orm/mapped_collection.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/orm/mapper.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/orm/path_registry.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/orm/persistence.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/orm/properties.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/orm/query.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/orm/relationships.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/orm/scoping.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/orm/session.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/orm/state.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/orm/state_changes.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/orm/strategies.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/orm/strategy_options.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/orm/sync.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/orm/unitofwork.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/orm/util.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/orm/writeonly.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/pool/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/pool/base.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/pool/events.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/pool/impl.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/schema.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/sql/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/sql/_dml_constructors.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/sql/_elements_constructors.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/sql/_orm_types.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/sql/_py_util.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/sql/_selectable_constructors.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/sql/_typing.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/sql/annotation.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/sql/base.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/sql/cache_key.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/sql/coercions.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/sql/compiler.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/sql/crud.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/sql/ddl.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/sql/default_comparator.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/sql/dml.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/sql/elements.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/sql/events.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/sql/expression.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/sql/functions.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/sql/lambdas.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/sql/naming.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/sql/operators.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/sql/roles.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/sql/schema.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/sql/selectable.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/sql/sqltypes.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/sql/traversals.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/sql/type_api.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/sql/util.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/sql/visitors.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/testing/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/testing/assertions.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/testing/assertsql.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/testing/asyncio.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/testing/config.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/testing/engines.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/testing/entities.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/testing/exclusions.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/testing/fixtures/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/testing/fixtures/base.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/testing/fixtures/mypy.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/testing/fixtures/orm.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/testing/fixtures/sql.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/testing/pickleable.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/testing/plugin/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/testing/plugin/bootstrap.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/testing/plugin/plugin_base.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/testing/plugin/pytestplugin.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/testing/profiling.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/testing/provision.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/testing/requirements.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/testing/schema.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/testing/suite/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/testing/suite/test_cte.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/testing/suite/test_ddl.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/testing/suite/test_deprecations.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/testing/suite/test_dialect.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/testing/suite/test_insert.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/testing/suite/test_reflection.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/testing/suite/test_results.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/testing/suite/test_rowcount.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/testing/suite/test_select.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/testing/suite/test_sequence.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/testing/suite/test_types.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/testing/suite/test_unicode_ddl.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/testing/suite/test_update_delete.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/testing/util.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/testing/warnings.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/types.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/util/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/util/_collections.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/util/_concurrency_py3k.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/util/_has_cy.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/util/_py_collections.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/util/compat.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/util/concurrency.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/util/deprecations.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/util/langhelpers.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/util/preloaded.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/util/queue.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/util/tool_support.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/util/topological.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/sqlalchemy/util/typing.cpython-39.pyc,,
SQLAlchemy-2.0.36.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
SQLAlchemy-2.0.36.dist-info/LICENSE,sha256=PA9Zq4h9BB3mpOUv_j6e212VIt6Qn66abNettue-MpM,1100
SQLAlchemy-2.0.36.dist-info/METADATA,sha256=EZH514FydYtyOhgoZk_OF1ZQEtI4eTAEddlnUlRjzac,9692
SQLAlchemy-2.0.36.dist-info/RECORD,,
SQLAlchemy-2.0.36.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
SQLAlchemy-2.0.36.dist-info/WHEEL,sha256=Oowyzh4gLJI0nJ4SOyThybgiPwAg4AzJ0OGG544_tlQ,108
SQLAlchemy-2.0.36.dist-info/top_level.txt,sha256=rp-ZgB7D8G11ivXON5VGPjupT1voYmWqkciDt5Uaw_Q,11
sqlalchemy/__init__.py,sha256=J2PsdiJiNW93Etxk6YN8o_C3TcpR1_DckU71r4LBcGE,13033
sqlalchemy/connectors/__init__.py,sha256=PzXPqZqi3BzEnrs1eW0DcsR4lyknAzhhN9rWcQ97hb4,476
sqlalchemy/connectors/aioodbc.py,sha256=GSTiNMO9h0qjPxgqaxDwWZ8HvhWMFNVR6MJQnN1oc40,5288
sqlalchemy/connectors/asyncio.py,sha256=Hq2bkXmG6-KO_RfCrwMqx4oGH-uH1Z1WWKqPWNjz8p4,6138
sqlalchemy/connectors/pyodbc.py,sha256=t7AjyxIOnaWg3CrlUEpBs4Y5l0HFdNt3P_cSSKhbi0Y,8501
sqlalchemy/cyextension/__init__.py,sha256=GzhhN8cjMnDTE0qerlUlpbrNmFPHQWCZ4Gk74OAxl04,244
sqlalchemy/cyextension/collections.cpython-39-darwin.so,sha256=XbMYw6iErLnYJx2FzElMiW0AZThhllaLtE-rd44qsbw,241424
sqlalchemy/cyextension/collections.pyx,sha256=L7DZ3DGKpgw2MT2ZZRRxCnrcyE5pU1NAFowWgAzQPEc,12571
sqlalchemy/cyextension/immutabledict.cpython-39-darwin.so,sha256=SMPz0PFSFgmzQPxn4IqUgAAXfNaD32RyDYUQHHlUkvs,110680
sqlalchemy/cyextension/immutabledict.pxd,sha256=3x3-rXG5eRQ7bBnktZ-OJ9-6ft8zToPmTDOd92iXpB0,291
sqlalchemy/cyextension/immutabledict.pyx,sha256=KfDTYbTfebstE8xuqAtuXsHNAK0_b5q_ymUiinUe_xs,3535
sqlalchemy/cyextension/processors.cpython-39-darwin.so,sha256=HpzMNa0FnqBURSoEKScnFsEQmBtCTUNc6AvoaG1D9k4,87960
sqlalchemy/cyextension/processors.pyx,sha256=R1rHsGLEaGeBq5VeCydjClzYlivERIJ9B-XLOJlf2MQ,1792
sqlalchemy/cyextension/resultproxy.cpython-39-darwin.so,sha256=nXMewPiyarm0fTvYcR8ndIl2T9SsYks2QriAGfu3zyU,90056
sqlalchemy/cyextension/resultproxy.pyx,sha256=eWLdyBXiBy_CLQrF5ScfWJm7X0NeelscSXedtj1zv9Q,2725
sqlalchemy/cyextension/util.cpython-39-darwin.so,sha256=Pbx4oeFrv88-c839LqS2PUTtXtKzRoKNUMqBia527g8,109080
sqlalchemy/cyextension/util.pyx,sha256=B85orxa9LddLuQEaDoVSq1XmAXIbLKxrxpvuB8ogV_o,2530
sqlalchemy/dialects/__init__.py,sha256=Kos9Gf5JZg1Vg6GWaCqEbD6e0r1jCwCmcnJIfcxDdcY,1770
sqlalchemy/dialects/_typing.py,sha256=hyv0nKucX2gI8ispB1IsvaUgrEPn9zEcq9hS7kfstEw,888
sqlalchemy/dialects/mssql/__init__.py,sha256=r5t8wFRNtBQoiUWh0WfIEWzXZW6f3D0uDt6NZTW_7Cc,1880
sqlalchemy/dialects/mssql/aioodbc.py,sha256=UQd9ecSMIML713TDnLAviuBVJle7P7i1FtqGZZePk2Y,2022
sqlalchemy/dialects/mssql/base.py,sha256=msl_N_a_z8ali7Nthx55AGoV7b5wakCWvWu560BvH9o,132423
sqlalchemy/dialects/mssql/information_schema.py,sha256=HswjDc6y0mPXCf_x6VyylHlBdBa4PSY6Evxmmlch700,8084
sqlalchemy/dialects/mssql/json.py,sha256=evUACW2O62TAPq8B7QIPagz7jfc664ql9ms68JqiYzg,4816
sqlalchemy/dialects/mssql/provision.py,sha256=ZAtt6Div9NLIngMs8kyloxfphw0KDNMsnRCAVd7-esE,5593
sqlalchemy/dialects/mssql/pymssql.py,sha256=LAv43q4vBCB85OsAwHQItaQUYTYIO0QJ-jvzaBrswmY,4097
sqlalchemy/dialects/mssql/pyodbc.py,sha256=vwM-vBlmRwrqxOc73P0sFOrBSwn24wzc5IkEOpalbXQ,27056
sqlalchemy/dialects/mysql/__init__.py,sha256=bxbi4hkysUK2OOVvr1F49akUj1cky27kKb07tgFzI9U,2153
sqlalchemy/dialects/mysql/aiomysql.py,sha256=-oMZnCqNsSki8mlQRTWIwiQPT1OVdZIuANkb90q8LAs,9999
sqlalchemy/dialects/mysql/asyncmy.py,sha256=YpuuOh8VknEeqHqUXQGfQ3jhfO3Xb-vZv78Jq5cscJ0,10067
sqlalchemy/dialects/mysql/base.py,sha256=giGlZNGrKsNMoSkbzY0PGgfamKjA9rOkSq1o5vKvno4,122755
sqlalchemy/dialects/mysql/cymysql.py,sha256=eXT1ry0w_qRxjiO24M980c-8PZ9qSsbhqBHntjEiKB0,2300
sqlalchemy/dialects/mysql/dml.py,sha256=HXJMAvimJsqvhj3UZO4vW_6LkF5RqaKbHvklAjor7yU,7645
sqlalchemy/dialects/mysql/enumerated.py,sha256=ipEPPQqoXfFwcywNdcLlZCEzHBtnitHRah1Gn6nItcg,8448
sqlalchemy/dialects/mysql/expression.py,sha256=lsmQCHKwfPezUnt27d2kR6ohk4IRFCA64KBS16kx5dc,4097
sqlalchemy/dialects/mysql/json.py,sha256=l6MEZ0qp8FgiRrIQvOMhyEJq0q6OqiEnvDTx5Cbt9uQ,2269
sqlalchemy/dialects/mysql/mariadb.py,sha256=kTfBLioLKk4JFFst4TY_iWqPtnvvQXFHknLfm89H2N8,853
sqlalchemy/dialects/mysql/mariadbconnector.py,sha256=_S1aV93kyP52Nvj7HR9weThML4oUvSLsLqiVFdoLR2o,8623
sqlalchemy/dialects/mysql/mysqlconnector.py,sha256=oq3mtsNOMldUjs32JbJG2u3Hy3DObyVzUUMYfOkwkHg,5729
sqlalchemy/dialects/mysql/mysqldb.py,sha256=qUBbA6STeYGozutyTxHCo5p1W3p59QFFS2FwCgPrjBA,9503
sqlalchemy/dialects/mysql/provision.py,sha256=Jnk8UO9_Apd2odR2IQFLrscCfAmYxuBKcB8giS3bBog,3575
sqlalchemy/dialects/mysql/pymysql.py,sha256=GUnSHd2M2uKjmN46Hheymtm26g7phEgwYOXrX0zLY8M,4083
sqlalchemy/dialects/mysql/pyodbc.py,sha256=072crI4qVyPhajYvHnsfFeSrNjLFVPIjBQKo5uyz5yk,4297
sqlalchemy/dialects/mysql/reflection.py,sha256=3u34YwT1JJh3uThGZJZ3FKdnUcT7v08QB-tAl1r7VRk,22834
sqlalchemy/dialects/mysql/reserved_words.py,sha256=ucKX2p2c3UnMq2ayZuOHuf73eXhu7SKsOsTlIN1Q83I,9258
sqlalchemy/dialects/mysql/types.py,sha256=L5cTCsMT1pTedszNEM3jSxFNZEMcHQLprYCZ0vmfsnA,24343
sqlalchemy/dialects/oracle/__init__.py,sha256=p4-2gw7TT0bX_MoJXTGD4i8WHctYsK9kCRbkpzykBrc,1493
sqlalchemy/dialects/oracle/base.py,sha256=zLMZedrr6j1LvJz4qYnoSjikI5RZY92YFeQHiZ_YvW0,119676
sqlalchemy/dialects/oracle/cx_oracle.py,sha256=q8Nyj15UZCE2TWOmxuWp5ZsxiCiGMzqfd_9UkmjIja0,55235
sqlalchemy/dialects/oracle/dictionary.py,sha256=7WMrbPkqo8ZdGjaEZyQr-5f2pajSOF1OTGb8P97z8-g,19519
sqlalchemy/dialects/oracle/oracledb.py,sha256=fZRKGqNIwW9LG4i8yDOXABrucbfzn_yC86Od-BJ3PcM,13619
sqlalchemy/dialects/oracle/provision.py,sha256=O9ZpF4OG6Cx4mMzLRfZwhs8dZjrJETWR402n9c7726A,8304
sqlalchemy/dialects/oracle/types.py,sha256=QK3hJvWzKnnCe3oD3rItwEEIwcoBze8qGg7VFOvVlIk,8231
sqlalchemy/dialects/postgresql/__init__.py,sha256=wwnNAq4wDQzrlPRzDNB06ayuq3L2HNO99nzeEvq-YcU,3892
sqlalchemy/dialects/postgresql/_psycopg_common.py,sha256=7TudtgsPiSB8O5kX8W8KxcNYR8t5h_UHb86b_ChL0P8,5696
sqlalchemy/dialects/postgresql/array.py,sha256=bWcame7ntmI_Kx6gmBX0-chwADFdLHeCvaDQ4iX8id8,13734
sqlalchemy/dialects/postgresql/asyncpg.py,sha256=9P0Itn9eeSBu67kGSsHuzx8xd4YYwRKdiZ5m7bF5onU,41074
sqlalchemy/dialects/postgresql/base.py,sha256=dGPsaV3Esw6-AwE3QcgHF0Fray3Yw5-gLLgCvgdxvS0,179083
sqlalchemy/dialects/postgresql/dml.py,sha256=Pc69Le6qzmUHHb1FT5zeUSD31dWm6SBgdCAGW89cs3s,11212
sqlalchemy/dialects/postgresql/ext.py,sha256=1bZ--iNh2O9ym7l2gXZX48yP3yMO4dqb9RpYro2Mj2Q,16262
sqlalchemy/dialects/postgresql/hstore.py,sha256=otAx-RTDfpi_tcXkMuQV0JOIXtYgevgnsikLKKOkI6U,11541
sqlalchemy/dialects/postgresql/json.py,sha256=53rQWon9cUXd1yCjIvUpJjWwNyRSy3U7Kz0HV70ftrc,11618
sqlalchemy/dialects/postgresql/named_types.py,sha256=3IV1ufo7zJjKmX4VtGDEnoXE6xEqLJAtGG82IiqHXwY,17594
sqlalchemy/dialects/postgresql/operators.py,sha256=NsAaWun_tL3d_be0fs9YL6T4LPKK6crnmFxxIJHgyeY,2808
sqlalchemy/dialects/postgresql/pg8000.py,sha256=3yoekiWSF-xnaWMqG76XrYPMqerg-42TdmfsW_ivK9E,18640
sqlalchemy/dialects/postgresql/pg_catalog.py,sha256=hY3NXEUHxTWD4umhd2aowNu3laC-61Q_qQ_pReyXTUM,9254
sqlalchemy/dialects/postgresql/provision.py,sha256=t6TZj0XaWG9zrpCjNr0oJRjAC_WQzaNdp3kaKJIbS8I,5770
sqlalchemy/dialects/postgresql/psycopg.py,sha256=Uwf45f9fInOtaExiEdwiP9xzRo7hw0XyZTkRtgdom44,23168
sqlalchemy/dialects/postgresql/psycopg2.py,sha256=kwEnflz5bAqJcuO_20eYiCtha_a4m_tg5_lppdDnaeU,31998
sqlalchemy/dialects/postgresql/psycopg2cffi.py,sha256=M7wAYSL6Pvt-4nbfacAHGyyw4XMKJ_bQZ1tc1pBtIdg,1756
sqlalchemy/dialects/postgresql/ranges.py,sha256=6CgV7qkxEMJ9AQsiibo_XBLJYzGh-2ZxpG83sRaesVY,32949
sqlalchemy/dialects/postgresql/types.py,sha256=Jfxqw9JaKNOq29JRWBublywgb3lLMyzx8YZI7CXpS2s,7300
sqlalchemy/dialects/sqlite/__init__.py,sha256=lp9DIggNn349M-7IYhUA8et8--e8FRExWD2V_r1LJk4,1182
sqlalchemy/dialects/sqlite/aiosqlite.py,sha256=g3qGV6jmiXabWyb3282g_Nmxtj1jThxGSe9C9yalb-U,12345
sqlalchemy/dialects/sqlite/base.py,sha256=LcnW6hzxqTtPlDBOInHumvuDt8a31THA5Jnm4vFvdFI,97811
sqlalchemy/dialects/sqlite/dml.py,sha256=9GE55WvwoktKy2fHeT-Wbc9xPHgsbh5oBfd_fckMH5Q,8443
sqlalchemy/dialects/sqlite/json.py,sha256=Eoplbb_4dYlfrtmQaI8Xddd2suAIHA-IdbDQYM-LIhs,2777
sqlalchemy/dialects/sqlite/provision.py,sha256=UCpmwxf4IWlrpb2eLHGbPTpCFVbdI_KAh2mKtjiLYao,5632
sqlalchemy/dialects/sqlite/pysqlcipher.py,sha256=OL2S_05DK9kllZj6DOz7QtEl7jI7syxjW6woS725ii4,5356
sqlalchemy/dialects/sqlite/pysqlite.py,sha256=aDp47n0J509kl2hDchoaBKXEQVZtkux54DwfKytUAe4,28068
sqlalchemy/dialects/type_migration_guidelines.txt,sha256=-uHNdmYFGB7bzUNT6i8M5nb4j6j9YUKAtW4lcBZqsMg,8239
sqlalchemy/engine/__init__.py,sha256=Stb2oV6l8w65JvqEo6J4qtKoApcmOpXy3AAxQud4C1o,2818
sqlalchemy/engine/_py_processors.py,sha256=j9i_lcYYQOYJMcsDerPxI0sVFBIlX5sqoYMdMJlgWPI,3744
sqlalchemy/engine/_py_row.py,sha256=wSqoUFzLOJ1f89kgDb6sJm9LUrF5LMFpXPcK1vUsKcs,3787
sqlalchemy/engine/_py_util.py,sha256=f2DI3AN1kv6EplelowesCVpwS8hSXNufRkZoQmJtSH8,2484
sqlalchemy/engine/base.py,sha256=frWSMmt3dlentYH4QNN3cijdGzp8NbunColUZwWsWgI,122958
sqlalchemy/engine/characteristics.py,sha256=N3kbvw_ApMh86wb5yAGnxtPYD4YRhYMWion1H_aVZBI,4765
sqlalchemy/engine/create.py,sha256=mYJtOG2ZKM8sgyfjpGpamW15RDU7JXi5s6iibbJHMIs,33206
sqlalchemy/engine/cursor.py,sha256=cFq61yrw76k-QR_xNUBWuL-Zeyb14ltG-6jo2Q2iuuw,76392
sqlalchemy/engine/default.py,sha256=2wwKKdsagb3QTajRSEw8Hl-EnQ-LmRxy822xOGyenHc,84648
sqlalchemy/engine/events.py,sha256=c0unNFFiHzTAvkUtXoJaxzMFMDwurBkHiiUhuN8qluc,37381
sqlalchemy/engine/interfaces.py,sha256=fcVHOmnMo7JZLHzgSKoK3QsdVHH7kJ_AmrDvwW9Ka3k,112936
sqlalchemy/engine/mock.py,sha256=yvpxgFmRw5G4QsHeF-ZwQGHKES-HqQOucTxFtN1uzdk,4179
sqlalchemy/engine/processors.py,sha256=XyfINKbo-2fjN-mW55YybvFyQMOil50_kVqsunahkNs,2379
sqlalchemy/engine/reflection.py,sha256=gwGs8y7x6py5z-ZWx3hQqQrwpHepMCTJyQcFwWJjPlw,75364
sqlalchemy/engine/result.py,sha256=NZEskTMAcDzK-vjE96Fw8VvBL58s5Y6rt9vXcmZdM4w,77651
sqlalchemy/engine/row.py,sha256=9AAQo9zYDL88GcZ3bjcQTwMT-YIcuGTSMAyTfmBJ_yM,12032
sqlalchemy/engine/strategies.py,sha256=DqFSWaXJPL-29Omot9O0aOcuGL8KmCGyOvnPGDkAJoE,442
sqlalchemy/engine/url.py,sha256=8eWkUaIUyDExOcJ2D4xJXRcn4OY1GQJ3Q2duSX6UGAg,30784
sqlalchemy/engine/util.py,sha256=bNirO8k1S8yOW61uNH-a9QrWtAJ9VGFgbiR0lk1lUQU,5682
sqlalchemy/event/__init__.py,sha256=KBrp622xojnC3FFquxa2JsMamwAbfkvzfv6Op0NKiYc,997
sqlalchemy/event/api.py,sha256=DtDVgjKSorOfp9MGJ7fgMWrj4seC_hkwF4D8CW1RFZU,8226
sqlalchemy/event/attr.py,sha256=X8QeHGK4ioSYht1vkhc11f606_mq_t91jMNIT314ubs,20751
sqlalchemy/event/base.py,sha256=270OShTD17-bSFUFnPtKdVnB0NFJZ2AouYPo1wT0aJw,15127
sqlalchemy/event/legacy.py,sha256=teMPs00fO-4g8a_z2omcVKkYce5wj_1uvJO2n2MIeuo,8227
sqlalchemy/event/registry.py,sha256=nfTSSyhjZZXc5wseWB4sXn-YibSc0LKX8mg17XlWmAo,10835
sqlalchemy/events.py,sha256=k-ZD38aSPD29LYhED7CBqttp5MDVVx_YSaWC2-cu9ec,525
sqlalchemy/exc.py,sha256=M_8-O1hd8i6gbyx-TapV400p_Lxq2QqTGMXUAO-YgCc,23976
sqlalchemy/ext/__init__.py,sha256=S1fGKAbycnQDV01gs-JWGaFQ9GCD4QHwKcU2wnugg_o,322
sqlalchemy/ext/associationproxy.py,sha256=ZGc_ssGf7FC6eKrja1iTvnWEKLkFZQA8CiVAjR8iVRw,66062
sqlalchemy/ext/asyncio/__init__.py,sha256=1OqSxEyIUn7RWLGyO12F-jAUIvk1I6DXlVy80-Gvkds,1317
sqlalchemy/ext/asyncio/base.py,sha256=fl7wxZD9KjgFiCtG3WXrYjHEvanamcsodCqq9pH9lOk,8905
sqlalchemy/ext/asyncio/engine.py,sha256=S_IRWX4QAjj2veLSu4Y3gKBIXkKQt7_2StJAK2_KUDY,48190
sqlalchemy/ext/asyncio/exc.py,sha256=8sII7VMXzs2TrhizhFQMzSfcroRtiesq8o3UwLfXSgQ,639
sqlalchemy/ext/asyncio/result.py,sha256=3rbVIY_wySi50JwaK3Kf2qa3c5Fc8W84FtUpt-9i9Vk,30477
sqlalchemy/ext/asyncio/scoping.py,sha256=UxHAFxtWKqA7TEozyN2h7MJyzSspTCrS-1SlgQLTExo,52608
sqlalchemy/ext/asyncio/session.py,sha256=QpXnqspwYnT28znD1EdpUIaVjQOO1BirtS0BJeBxeZk,63087
sqlalchemy/ext/automap.py,sha256=r0mUSyogNyqdBL4m9AA1NXbLiTLQmtvyQymsssNEipo,61581
sqlalchemy/ext/baked.py,sha256=H6T1il7GY84BhzPFj49UECSpZh_eBuiHomA-QIsYOYQ,17807
sqlalchemy/ext/compiler.py,sha256=6X6sZCAo9v-PQfLbwBSYQUK0-XH2xTE5Jm0Zg6Ka6eM,20877
sqlalchemy/ext/declarative/__init__.py,sha256=20psLdFQbbOWfpdXHZ0CTY6I1k4UqXvKemNVu1LvPOI,1818
sqlalchemy/ext/declarative/extensions.py,sha256=uCjN1GisQt54AjqYnKYzJdUjnGd2pZBW47WWdPlS7FE,19547
sqlalchemy/ext/horizontal_shard.py,sha256=wuwAPnHymln0unSBnyx-cpX0AfESKSsypaSQTYCvzDk,16750
sqlalchemy/ext/hybrid.py,sha256=IYkCaPZ29gm2cPKPg0cWMkLCEqMykD8-JJTvgacGbmc,52458
sqlalchemy/ext/indexable.py,sha256=UkTelbydKCdKelzbv3HWFFavoET9WocKaGRPGEOVfN8,11032
sqlalchemy/ext/instrumentation.py,sha256=sg8ghDjdHSODFXh_jAmpgemnNX1rxCeeXEG3-PMdrNk,15707
sqlalchemy/ext/mutable.py,sha256=L5ZkHBGYhMaqO75Xtyrk2DBR44RDk0g6Rz2HzHH0F8Q,37355
sqlalchemy/ext/mypy/__init__.py,sha256=0WebDIZmqBD0OTq5JLtd_PmfF9JGxe4d4Qv3Ml3PKUg,241
sqlalchemy/ext/mypy/apply.py,sha256=Aek_-XA1eXihT4attxhfE43yBKtCgsxBSb--qgZKUqc,10550
sqlalchemy/ext/mypy/decl_class.py,sha256=1vVJRII2apnLTUbc5HkJS6Z2GueaUv_eKvhbqh7Wik4,17384
sqlalchemy/ext/mypy/infer.py,sha256=KVnmLFEVS33Al8pUKI7MJbJQu3KeveBUMl78EluBORw,19369
sqlalchemy/ext/mypy/names.py,sha256=Q3ef8XQBgVm9WUwlItqlYCXDNi_kbV5DdLEgbtEMEI8,10479
sqlalchemy/ext/mypy/plugin.py,sha256=74ML8LI9xar0V86oCxnPFv5FQGEEfUzK64vOay4BKFs,9750
sqlalchemy/ext/mypy/util.py,sha256=DKRaurkXHI2lAMAAcEO5GLXbX_m2Xqy7l_juh8Byf5U,9960
sqlalchemy/ext/orderinglist.py,sha256=TGYbsGH72wEZcFNQDYDsZg9OSPuzf__P8YX8_2HtYUo,14384
sqlalchemy/ext/serializer.py,sha256=D0g4jMZkRk0Gjr0L-FZe81SR63h0Zs-9JzuWtT_SD7k,6140
sqlalchemy/future/__init__.py,sha256=q2mw-gxk_xoxJLEvRoyMha3vO1xSRHrslcExOHZwmPA,512
sqlalchemy/future/engine.py,sha256=AgIw6vMsef8W6tynOTkxsjd6o_OQDwGjLdbpoMD8ue8,495
sqlalchemy/inspection.py,sha256=MF-LE358wZDUEl1IH8-Uwt2HI65EsQpQW5o5udHkZwA,5063
sqlalchemy/log.py,sha256=8x9UR3nj0uFm6or6bQF-JWb4fYv2zOeQjG_w-0wOJFA,8607
sqlalchemy/orm/__init__.py,sha256=ZYys5nL3RFUDCMOLFDBrRI52F6er3S1U1OY9TeORuKs,8463
sqlalchemy/orm/_orm_constructors.py,sha256=8EQfYsDL2k_ev0eK-wxMl3algouczN38Gu43CrRlAlo,103434
sqlalchemy/orm/_typing.py,sha256=DVBfpHmDVK4x1zxaGJPY2GoTrAsyR6uexv20Lzf1afc,4973
sqlalchemy/orm/attributes.py,sha256=lorOHBJvJJYndOuafWJhHBbQ1pR6FAyimhqz-mErBRQ,92534
sqlalchemy/orm/base.py,sha256=FXkYTSCDUJFQSB5pcyPt2wG-dRctf5P6ySjyjVxQsX0,27502
sqlalchemy/orm/bulk_persistence.py,sha256=1FC23bRJKjpfbp2D5hYuV1qOVIKGSswu9XPXbbSJ5Mo,72663
sqlalchemy/orm/clsregistry.py,sha256=IjoDZwWpjG42ji59L4M1EZvjBEoXPZykzENDtKWxU8A,17974
sqlalchemy/orm/collections.py,sha256=WEKuUCRgLhDhJEIBhZ21UrE0pBOyRm2zxD20GvbgA9g,52243
sqlalchemy/orm/context.py,sha256=FMPyw07OA9OXWQ32RQx52AEa2xTLSkqdYgx9R_yN1x0,112955
sqlalchemy/orm/decl_api.py,sha256=_WPKQ_vSE5k2TLtNmkaxxYmvbhZvkRMrrvCeDxdqDQE,63998
sqlalchemy/orm/decl_base.py,sha256=8R7go5sULTYNRlhYiEjXIJkQ34oPp7DY_fC2nS5D5is,83343
sqlalchemy/orm/dependency.py,sha256=hgjksUWhgbmgHK5GdJdiDCBgDAIGQXIrY-Tj79tbL2k,47631
sqlalchemy/orm/descriptor_props.py,sha256=dR_h4Gvdtpcdp4sj_ZOR4P5Nng2J2vhsvFHouRLlntc,37244
sqlalchemy/orm/dynamic.py,sha256=rWAZ-nfAkREuNjt8e_FRdqYrvHDdbODn1CcfyP8Y18k,9816
sqlalchemy/orm/evaluator.py,sha256=tRETz4dNZ71VsEA8nG0hpefByB-W0zBt02IxcSR5H2g,12353
sqlalchemy/orm/events.py,sha256=1PiGT7JMUWTDAb3X1T79P02BMVDmcWEpatz1FwpLqoA,127777
sqlalchemy/orm/exc.py,sha256=IP40P-wOeXhkYk0YizuTC3wqm6W9cPTaQU08f5MMaQ0,7413
sqlalchemy/orm/identity.py,sha256=jHdCxCpCyda_8mFOfGmN_Pr0XZdKiU-2hFZshlNxbHs,9249
sqlalchemy/orm/instrumentation.py,sha256=M-kZmkUvHUxtf-0mCA8RIM5QmMH1hWlYR_pKMwaidjA,24321
sqlalchemy/orm/interfaces.py,sha256=7Lni4Cue41b1CsmN4VbeUyWwzuNMcKtkrpihc9U-WIw,48690
sqlalchemy/orm/loading.py,sha256=9RacpzFOWbuKgPRWHFmyIvD4fYCLAnkpwBFASyQ2CoI,58277
sqlalchemy/orm/mapped_collection.py,sha256=zK3d3iozORzDruBUrAmkVC0RR3Orj5szk-TSQ24xzIU,19682
sqlalchemy/orm/mapper.py,sha256=W-srpoEc3UIYv_6qTXTd_dG_TVeQcToG77VGrXt85PM,171738
sqlalchemy/orm/path_registry.py,sha256=sJZMv_WPqUpHfQtKWaX3WYFeKBcNJ8C3wOM2mkBGkTE,25920
sqlalchemy/orm/persistence.py,sha256=dzyB2JOXNwQgaCbN8kh0sEz00WFePr48qf8NWVCUZH8,61701
sqlalchemy/orm/properties.py,sha256=eDPFzxYUgdM3uWjHywnb1XW-i0tVKKyx7A2MCD31GQU,29306
sqlalchemy/orm/query.py,sha256=Cf0e94-u1XyoXJoOAmr4iFvtCwNY98kxUYyMPenaWTE,117708
sqlalchemy/orm/relationships.py,sha256=dS5SY0v1MiD7iCNnAQlHaI6prUQhL5EkXT7ijc8FR8E,128644
sqlalchemy/orm/scoping.py,sha256=rJVc7_Lic4V00HZ-UvYFWkVpXqdrMayRmIs4fIwH1UA,78688
sqlalchemy/orm/session.py,sha256=CZJTQ-wPwIy0c3AMFxgJnBgaft6eEf4JzcCLcaaCSjg,195979
sqlalchemy/orm/state.py,sha256=327-F4TG29s6mLC8oWRiO2PuvYIUZzY1MqUPjtUy7M4,37670
sqlalchemy/orm/state_changes.py,sha256=qKYg7NxwrDkuUY3EPygAztym6oAVUFcP2wXn7QD3Mz4,6815
sqlalchemy/orm/strategies.py,sha256=-tsBRsmEqkaxAAIn4t2F-U5SrRIPoPCyzpqFYGTAwNs,119866
sqlalchemy/orm/strategy_options.py,sha256=oeDl_rMDNAC_90N7ytsni-psXWAeQMhABQFyKBSmai0,85353
sqlalchemy/orm/sync.py,sha256=g7iZfSge1HgxMk9SKRgUgtHEbpbZ1kP_CBqOIdTOXqc,5779
sqlalchemy/orm/unitofwork.py,sha256=fiVaqcymbDDHRa1NjS90N9Z466nd5pkJOEi1dHO6QLY,27033
sqlalchemy/orm/util.py,sha256=5SC4MOVU0cPObexDjpMvXvetueiU5pze42raL94gj24,81021
sqlalchemy/orm/writeonly.py,sha256=SYu2sAaHZONk2pW4PmtE871LG-O0P_bjidvKzY1H_zI,22305
sqlalchemy/pool/__init__.py,sha256=qiDdq4r4FFAoDrK6ncugF_i6usi_X1LeJt-CuBHey0s,1804
sqlalchemy/pool/base.py,sha256=WF4az4ZKuzQGuKeSJeyexaYjmWZUvYdC6KIi8zTGodw,52236
sqlalchemy/pool/events.py,sha256=xGjkIUZl490ZDtCHqnQF9ZCwe2Jv93eGXmnQxftB11E,13147
sqlalchemy/pool/impl.py,sha256=JwpALSkH-pCoO_6oENbkHYY00Jx9nlttyoI61LivRNc,18944
sqlalchemy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
sqlalchemy/schema.py,sha256=dKiWmgHYjcKQ4TiiD6vD0UMmIsD8u0Fsor1M9AAeGUs,3194
sqlalchemy/sql/__init__.py,sha256=UNa9EUiYWoPayf-FzNcwVgQvpsBdInPZfpJesAStN9o,5820
sqlalchemy/sql/_dml_constructors.py,sha256=YdBJex0MCVACv4q2nl_ii3uhxzwU6aDB8zAsratX5UQ,3867
sqlalchemy/sql/_elements_constructors.py,sha256=833Flez92odZkE2Vy6SXK8LcoO1AwkfVzOnATJLWFsA,63168
sqlalchemy/sql/_orm_types.py,sha256=T-vjcry4C1y0GToFKVxQCnmly_-Zsq4IO4SHN6bvUF4,625
sqlalchemy/sql/_py_util.py,sha256=hiM9ePbRSGs60bAMxPFuJCIC_p9SQ1VzqXGiPchiYwE,2173
sqlalchemy/sql/_selectable_constructors.py,sha256=wjE6HrLm9cR7bxvZXT8sFLUqT6t_J9G1XyQCnYmBDl0,18780
sqlalchemy/sql/_typing.py,sha256=oqwrYHVMtK-AuKGH9c4SgfiOEJUt5vjkzSEzzscMHkM,12771
sqlalchemy/sql/annotation.py,sha256=aqbbVz9kfbCT3_66CZ9GEirVN197Cukoqt8rq48FgkQ,18245
sqlalchemy/sql/base.py,sha256=M1b-Tg49ikUW2mnZv0aI38oASG6dgeo4jBNWDgJgAg8,73925
sqlalchemy/sql/cache_key.py,sha256=0Db8mR8IrpBgdzXs4TGTt98LOpL3c7KABd72MAPKUQQ,33668
sqlalchemy/sql/coercions.py,sha256=hAEou9Ycyswzu8yz_Q7QkwL2_c3nctzBJQS2oDEr4iE,40664
sqlalchemy/sql/compiler.py,sha256=hrTptbOKIgVIHapywj4Lk5OMwpXvHS-KGg3odFwlo-I,274687
sqlalchemy/sql/crud.py,sha256=HBX4QPtW_PYYJmIKfNr-wE8IdEr963N24WXzFBUZOo0,56514
sqlalchemy/sql/ddl.py,sha256=lKqvOigbcYrDG0euxd5F4tu9HbBi1kmp3eFPc45HH-8,45636
sqlalchemy/sql/default_comparator.py,sha256=utXWsZVGEjflhFfCT4ywa6RnhORc1Rryo87Hga71Rps,16707
sqlalchemy/sql/dml.py,sha256=pn0Lm1ofC5qVZzwGWFW73lPCiNba8OsTeemurJgwRyg,65614
sqlalchemy/sql/elements.py,sha256=YfccXzQc9DlgF8q15kDf-zKBUY_vpIe0FGaVDBPoic4,176544
sqlalchemy/sql/events.py,sha256=iC_Q1Htm1Aobt5tOYxWfHHqNpoytrULORmUKcusH_-E,18290
sqlalchemy/sql/expression.py,sha256=VMX-dLpsZYnVRJpYNDozDUgaj7iQ0HuewUKVefD57PE,7586
sqlalchemy/sql/functions.py,sha256=kMMYplvuIHFAPwxBI03SizwaLcYEHzysecWk-R1V-JM,63762
sqlalchemy/sql/lambdas.py,sha256=DP0Qz7Ypo8QhzMwygGHYgRhwJMx-rNezO1euouH3iYU,49292
sqlalchemy/sql/naming.py,sha256=ZHs1qSV3ou8TYmZ92uvU3sfdklUQlIz4uhe330n05SU,6858
sqlalchemy/sql/operators.py,sha256=himArRqBzrljob3Zfhi_ZS-Jleg1u6YFp0g3d7Co6IM,76106
sqlalchemy/sql/roles.py,sha256=pOsVn_OZD7mF2gJByHf24Rjopt0_Hu3dUCEOK5t4KS8,7662
sqlalchemy/sql/schema.py,sha256=iFleWHkxi-3mKGiK_N1TzUqxnNwOpypB4bWDuAVQe8c,229717
sqlalchemy/sql/selectable.py,sha256=cgyV0AsPy4CXAFdhMiTCkbgaHiFilW9sclzxlHJKH3o,236460
sqlalchemy/sql/sqltypes.py,sha256=5_N9MhprQFWYc3yjcXgFC_DmvkQU-Jz-Ok9nIMYp2Q4,127469
sqlalchemy/sql/traversals.py,sha256=3ScTC1fh1-y8Y478h_2Azmd2xdQdWPWkDve4YgrwMf8,33664
sqlalchemy/sql/type_api.py,sha256=SN16_oNZG6G65cvG6ABPcptz_YV5vfB2fknwJZxrkOs,84464
sqlalchemy/sql/util.py,sha256=qGHQF-tPCj-m1FBerzT7weCanGcXU7dK5m-W7NHio-4,48077
sqlalchemy/sql/visitors.py,sha256=71wdVvhhZL4nJvVwFAs6ssaW-qZgNRSmKjpAcOzF_TA,36317
sqlalchemy/testing/__init__.py,sha256=zgitAYzsCWT_U48ZiifXHHLJFo8nZBYmI-5TueA4_lE,3160
sqlalchemy/testing/assertions.py,sha256=gL0rA7CCZJbcVgvWOPV91tTZTRwQc1_Ta0-ykBn83Ew,31439
sqlalchemy/testing/assertsql.py,sha256=IgQG7l94WaiRP8nTbilJh1ZHZl125g7GPq-S5kmQZN0,16817
sqlalchemy/testing/asyncio.py,sha256=kM8uuOqDBagZF0r9xvGmsiirUVLUQ_KBzjUFU67W-b8,3830
sqlalchemy/testing/config.py,sha256=AqyH1qub_gDqX0BvlL-JBQe7N-t2wo8655FtwblUNOY,12090
sqlalchemy/testing/engines.py,sha256=HFJceEBD3Q_TTFQMTtIV5wGWO_a7oUgoKtUF_z636SM,13481
sqlalchemy/testing/entities.py,sha256=IphFegPKbff3Un47jY6bi7_MQXy6qkx_50jX2tHZJR4,3354
sqlalchemy/testing/exclusions.py,sha256=T8B01hmm8WVs-EKcUOQRzabahPqblWJfOidi6bHJ6GA,12460
sqlalchemy/testing/fixtures/__init__.py,sha256=dMClrIoxqlYIFpk2ia4RZpkbfxsS_3EBigr9QsPJ66g,1198
sqlalchemy/testing/fixtures/base.py,sha256=9r_J2ksiTzClpUxW0TczICHrWR7Ny8PV8IsBz6TsGFI,12256
sqlalchemy/testing/fixtures/mypy.py,sha256=gdxiwNFIzDlNGSOdvM3gbwDceVCC9t8oM5kKbwyhGBk,11973
sqlalchemy/testing/fixtures/orm.py,sha256=8EFbnaBbXX_Bf4FcCzBUaAHgyVpsLGBHX16SGLqE3Fg,6095
sqlalchemy/testing/fixtures/sql.py,sha256=KZMjco9_3dsuspmkew5Ejp88Wlr9PsSBB1qeJGFxQAk,15900
sqlalchemy/testing/pickleable.py,sha256=U9mIqk-zaxq9Xfy7HErP7UrKgTov-A3QFnhZh-NiOjI,2833
sqlalchemy/testing/plugin/__init__.py,sha256=79F--BIY_NTBzVRIlJGgAY5LNJJ3cD19XvrAo4X0W9A,247
sqlalchemy/testing/plugin/bootstrap.py,sha256=oYScMbEW4pCnWlPEAq1insFruCXFQeEVBwo__i4McpU,1685
sqlalchemy/testing/plugin/plugin_base.py,sha256=BgNzWNEmgpK4CwhyblQQKnH-7FDKVi_Uul5vw8fFjBU,21578
sqlalchemy/testing/plugin/pytestplugin.py,sha256=6jkQHH2VQMD75k2As9CuWXmEy9jrscoFRhCNg6-PaTw,27656
sqlalchemy/testing/profiling.py,sha256=PbuPhRFbauFilUONeY3tV_Y_5lBkD7iCa8VVyH2Sk9Y,10148
sqlalchemy/testing/provision.py,sha256=3qFor_sN1FFlS7odUGkKqLUxGmQZC9XM67I9vQ_zeXo,14626
sqlalchemy/testing/requirements.py,sha256=Z__o-1Rj9B7dI8E_l3qsKTvsg0rK198vB0A1p7A5dcM,52832
sqlalchemy/testing/schema.py,sha256=lr4GkGrGwagaHMuSGzWdzkMaj3HnS7dgfLLWfxt__-U,6513
sqlalchemy/testing/suite/__init__.py,sha256=Y5DRNG0Yl1u3ypt9zVF0Z9suPZeuO_UQGLl-wRgvTjU,722
sqlalchemy/testing/suite/test_cte.py,sha256=6zBC3W2OwX1Xs-HedzchcKN2S7EaLNkgkvV_JSZ_Pq0,6451
sqlalchemy/testing/suite/test_ddl.py,sha256=1Npkf0C_4UNxphthAGjG078n0vPEgnSIHpDu5MfokxQ,12031
sqlalchemy/testing/suite/test_deprecations.py,sha256=BcJxZTcjYqeOAENVElCg3hVvU6fkGEW3KGBMfnW8bng,5337
sqlalchemy/testing/suite/test_dialect.py,sha256=EH4ZQWbnGdtjmx5amZtTyhYmrkXJCvW1SQoLahoE7uk,22923
sqlalchemy/testing/suite/test_insert.py,sha256=9azifj6-OCD7s8h_tAO1uPw100ibQv8YoKc_VA3hn3c,18824
sqlalchemy/testing/suite/test_reflection.py,sha256=7sML8-owubSQeEM7Ve6LbnB8uIVlNV00WWepKwII2a8,109648
sqlalchemy/testing/suite/test_results.py,sha256=X720GafdA4p75SOGS93j-dXkt6QDEnnJbU2bh18VCcg,16914
sqlalchemy/testing/suite/test_rowcount.py,sha256=3KDTlRgjpQ1OVfp__1cv8Hvq4CsDKzmrhJQ_WIJWoJg,7900
sqlalchemy/testing/suite/test_select.py,sha256=ulRZQJlzkwwcewEyisuBEXVWFR0Wshz9MEDxYYiYLwQ,61732
sqlalchemy/testing/suite/test_sequence.py,sha256=66bCoy4xo99GBSaX6Hxb88foANAykLGRz1YEKbvpfuA,9923
sqlalchemy/testing/suite/test_types.py,sha256=K4MGHvnTtgqeksoQOBCZRVQYC7HoYO6Z6rVt5vj2t9o,67805
sqlalchemy/testing/suite/test_unicode_ddl.py,sha256=c3_eIxLyORuSOhNDP0jWKxPyUf3SwMFpdalxtquwqlM,6141
sqlalchemy/testing/suite/test_update_delete.py,sha256=yTiM2unnfOK9rK8ZkqeTTU_MkT-RsKFLmdYliniZfAY,3994
sqlalchemy/testing/util.py,sha256=qldXKw8gRJ4I2x3uXsBssYMqwatmcMFMTOveRQCmfDU,14469
sqlalchemy/testing/warnings.py,sha256=fJ-QJUY2zY2PPxZJKv9medW-BKKbCNbA4Ns_V3YwFXM,1546
sqlalchemy/types.py,sha256=cQFM-hFRmaf1GErun1qqgEs6QxufvzMuwKqj9tuMPpE,3168
sqlalchemy/util/__init__.py,sha256=5D5Mquvx3SOmud0QErKzzGvBTkqMdhrrd_sXijOILeo,8312
sqlalchemy/util/_collections.py,sha256=aZoSAVOXnHBoYEsxDOi0O9odg9wqLbGb7PGjaWQKiyY,20078
sqlalchemy/util/_concurrency_py3k.py,sha256=zb0Bow2Y_QjTdaACEviBEEaFvqDuVvpJfmwCjaw8xNE,9170
sqlalchemy/util/_has_cy.py,sha256=wCQmeSjT3jaH_oxfCEtGk-1g0gbSpt5MCK5UcWdMWqk,1247
sqlalchemy/util/_py_collections.py,sha256=U6L5AoyLdgSv7cdqB4xxQbw1rpeJjyOZVXffgxgga8I,16714
sqlalchemy/util/compat.py,sha256=cnucBQOKspo58vjRpQXUBrHGguHOSFvftpD-I8vfUy0,8760
sqlalchemy/util/concurrency.py,sha256=9lT_cMoO1fZNdY8QTUZ22oeSf-L5I-79Ke7chcBNPA0,3304
sqlalchemy/util/deprecations.py,sha256=YBwvvYhSB8LhasIZRKvg_-WNoVhPUcaYI1ZrnjDn868,11971
sqlalchemy/util/langhelpers.py,sha256=uIK3szZuq9aMnO-vEpSlNekNWv4I-E391e56bkTnUm0,65090
sqlalchemy/util/preloaded.py,sha256=az7NmLJLsqs0mtM9uBkIu10-841RYDq8wOyqJ7xXvqE,5904
sqlalchemy/util/queue.py,sha256=CaeSEaYZ57YwtmLdNdOIjT5PK_LCuwMFiO0mpp39ybM,10185
sqlalchemy/util/tool_support.py,sha256=9braZyidaiNrZVsWtGmkSmus50-byhuYrlAqvhjcmnA,6135
sqlalchemy/util/topological.py,sha256=N3M3Le7KzGHCmqPGg0ZBqixTDGwmFLhOZvBtc4rHL_g,3458
sqlalchemy/util/typing.py,sha256=lFcGo1dJbZIZ9drAnvef-PzP0cX4LMxMSwgk3lJBb0g,18182
@@ -0,0 +1,5 @@
Wheel-Version: 1.0
Generator: setuptools (75.1.0)
Root-Is-Purelib: false
Tag: cp39-cp39-macosx_10_9_x86_64
@@ -0,0 +1,128 @@
import sys
import os
import re
import importlib
import warnings
is_pypy = '__pypy__' in sys.builtin_module_names
warnings.filterwarnings('ignore',
r'.+ distutils\b.+ deprecated',
DeprecationWarning)
def warn_distutils_present():
if 'distutils' not in sys.modules:
return
if is_pypy and sys.version_info < (3, 7):
# PyPy for 3.6 unconditionally imports distutils, so bypass the warning
# https://foss.heptapod.net/pypy/pypy/-/blob/be829135bc0d758997b3566062999ee8b23872b4/lib-python/3/site.py#L250
return
warnings.warn(
"Distutils was imported before Setuptools, but importing Setuptools "
"also replaces the `distutils` module in `sys.modules`. This may lead "
"to undesirable behaviors or errors. To avoid these issues, avoid "
"using distutils directly, ensure that setuptools is installed in the "
"traditional way (e.g. not an editable install), and/or make sure "
"that setuptools is always imported before distutils.")
def clear_distutils():
if 'distutils' not in sys.modules:
return
warnings.warn("Setuptools is replacing distutils.")
mods = [name for name in sys.modules if re.match(r'distutils\b', name)]
for name in mods:
del sys.modules[name]
def enabled():
"""
Allow selection of distutils by environment variable.
"""
which = os.environ.get('SETUPTOOLS_USE_DISTUTILS', 'stdlib')
return which == 'local'
def ensure_local_distutils():
clear_distutils()
distutils = importlib.import_module('setuptools._distutils')
distutils.__name__ = 'distutils'
sys.modules['distutils'] = distutils
# sanity check that submodules load as expected
core = importlib.import_module('distutils.core')
assert '_distutils' in core.__file__, core.__file__
def do_override():
"""
Ensure that the local copy of distutils is preferred over stdlib.
See https://github.com/pypa/setuptools/issues/417#issuecomment-392298401
for more motivation.
"""
if enabled():
warn_distutils_present()
ensure_local_distutils()
class DistutilsMetaFinder:
def find_spec(self, fullname, path, target=None):
if path is not None:
return
method_name = 'spec_for_{fullname}'.format(**locals())
method = getattr(self, method_name, lambda: None)
return method()
def spec_for_distutils(self):
import importlib.abc
import importlib.util
class DistutilsLoader(importlib.abc.Loader):
def create_module(self, spec):
return importlib.import_module('setuptools._distutils')
def exec_module(self, module):
pass
return importlib.util.spec_from_loader('distutils', DistutilsLoader())
def spec_for_pip(self):
"""
Ensure stdlib distutils when running under pip.
See pypa/pip#8761 for rationale.
"""
if self.pip_imported_during_build():
return
clear_distutils()
self.spec_for_distutils = lambda: None
@staticmethod
def pip_imported_during_build():
"""
Detect if pip is being imported in a build script. Ref #2355.
"""
import traceback
return any(
frame.f_globals['__file__'].endswith('setup.py')
for frame, line in traceback.walk_stack(None)
)
DISTUTILS_FINDER = DistutilsMetaFinder()
def add_shim():
sys.meta_path.insert(0, DISTUTILS_FINDER)
def remove_shim():
try:
sys.meta_path.remove(DISTUTILS_FINDER)
except ValueError:
pass
@@ -0,0 +1 @@
__import__('_distutils_hack').do_override()
@@ -0,0 +1,33 @@
# This is a stub package designed to roughly emulate the _yaml
# extension module, which previously existed as a standalone module
# and has been moved into the `yaml` package namespace.
# It does not perfectly mimic its old counterpart, but should get
# close enough for anyone who's relying on it even when they shouldn't.
import yaml
# in some circumstances, the yaml module we imoprted may be from a different version, so we need
# to tread carefully when poking at it here (it may not have the attributes we expect)
if not getattr(yaml, '__with_libyaml__', False):
from sys import version_info
exc = ModuleNotFoundError if version_info >= (3, 6) else ImportError
raise exc("No module named '_yaml'")
else:
from yaml._yaml import *
import warnings
warnings.warn(
'The _yaml extension module is now located at yaml._yaml'
' and its location is subject to change. To use the'
' LibYAML-based parser and emitter, import from `yaml`:'
' `from yaml import CLoader as Loader, CDumper as Dumper`.',
DeprecationWarning
)
del warnings
# Don't `del yaml` here because yaml is actually an existing
# namespace member of _yaml.
__name__ = '_yaml'
# If the module is top-level (i.e. not a part of any specific package)
# then the attribute should be set to ''.
# https://docs.python.org/3.8/library/types.html
__package__ = ''
@@ -0,0 +1,314 @@
Metadata-Version: 2.4
Name: akshare
Version: 1.18.64
Summary: AKShare is an elegant and simple financial data interface library for Python, built for human beings!
Author-email: AKFamily <albertandking@gmail.com>
License: MIT
Project-URL: Homepage, https://github.com/akfamily/akshare
Keywords: stock,option,futures,fund,bond,index,air,finance,spider,quant,quantitative,investment,trading,algotrading,data
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Requires-Python: >=3.9
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: beautifulsoup4>=4.9.1
Requires-Dist: lxml>=4.2.1
Requires-Dist: pandas>=2.0.0
Requires-Dist: requests>=2.22.0
Requires-Dist: curl_cffi>=0.13.0
Requires-Dist: html5lib>=1.0.1
Requires-Dist: xlrd>=1.2.0
Requires-Dist: urllib3>=1.25.8
Requires-Dist: tqdm>=4.43.0
Requires-Dist: openpyxl>=3.0.3
Requires-Dist: jsonpath>=0.82
Requires-Dist: tabulate>=0.8.6
Requires-Dist: decorator>=4.4.2
Requires-Dist: mini-racer>=0.12.4; platform_system != "Linux"
Requires-Dist: py-mini-racer>=0.6.0; platform_system == "Linux"
Requires-Dist: akracer>=0.0.13; platform_system == "Linux"
Provides-Extra: full
Requires-Dist: akqmt; extra == "full"
Provides-Extra: qmt
Requires-Dist: akqmt; extra == "qmt"
Provides-Extra: dev
Requires-Dist: akqmt>=0.1.0; extra == "dev"
Requires-Dist: commitizen>=4.12.1; python_version >= "3.10" and extra == "dev"
Requires-Dist: pre-commit>=3.6.2; python_version >= "3.9" and extra == "dev"
Requires-Dist: sphinx>=7.4.3; extra == "dev"
Requires-Dist: recommonmark>=0.7.1; extra == "dev"
Requires-Dist: sphinx_markdown_tables>=0.0.17; extra == "dev"
Requires-Dist: sphinx_rtd_theme>=1.0.0; extra == "dev"
Requires-Dist: mplfinance>=0.12.10b0; extra == "dev"
Requires-Dist: ruff>=0.14.14; python_version >= "3.10" and extra == "dev"
Requires-Dist: ruff-lsp>=0.0.53; python_version >= "3.10" and extra == "dev"
Dynamic: license-file
**资源分享**:对于想了解更多财经数据与量化投研的小伙伴,推荐一个专注于财经数据和量化研究的知识社区。
该社区提供相关文档和视频学习资源,汇集了各类财经数据源和量化投研工具的使用经验。
有兴趣深入学习的朋友可点此[了解更多](https://t.zsxq.com/ZCxUG),也推荐大家关注微信公众号【数据科学实战】。
**重磅推荐**:AKQuant 是一款专为 **量化投研 (Quantitative Research)** 打造的高性能量化回测框架。它以 Rust 铸造极速撮合内核,
以 Python 链接数据与 AI 生态,旨在为量化投资者提供可靠高效的量化投研解决方案。参见[AKQuant](https://github.com/akfamily/akquant)
**工具推荐**:期魔方是一款本地化期货量化分析工具,适合数据分析爱好者使用。无需复杂部署,支持数据分析和机器学习功能,研究功能免费开放。
如需了解更多信息可访问[期魔方](https://qmfquant.com)。
![AKShare Logo](https://github.com/akfamily/akshare/blob/main/assets/images/akshare_logo.jpg)
[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/akshare.svg)](https://pypi.org/project/akshare/)
[![PyPI](https://img.shields.io/pypi/v/akshare.svg)](https://pypi.org/project/akshare/)
[![PyPI Downloads](https://static.pepy.tech/personalized-badge/akshare?period=total&units=INTERNATIONAL_SYSTEM&left_color=BLACK&right_color=GREEN&left_text=downloads)](https://pepy.tech/projects/akshare)
[![Documentation Status](https://readthedocs.org/projects/akshare/badge/?version=latest)](https://akshare.readthedocs.io/?badge=latest)
[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
[![akshare](https://img.shields.io/badge/Data%20Science-AKShare-green)](https://github.com/akfamily/akshare)
[![Actions Status](https://github.com/akfamily/akshare/actions/workflows/release_and_deploy.yml/badge.svg)](https://github.com/akfamily/akshare/actions)
[![MIT Licence](https://img.shields.io/badge/license-MIT-blue)](https://github.com/akfamily/akshare/blob/main/LICENSE)
[![](https://img.shields.io/github/forks/jindaxiang/akshare)](https://github.com/akfamily/akshare)
[![](https://img.shields.io/github/stars/jindaxiang/akshare)](https://github.com/akfamily/akshare)
[![](https://img.shields.io/github/issues/jindaxiang/akshare)](https://github.com/akfamily/akshare)
[![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier)
## Overview
[AKShare](https://github.com/akfamily/akshare) requires Python(64 bit) 3.9 or higher and
aims to simplify the process of fetching financial data.
**Write less, get more!**
- Documentation: [中文文档](https://akshare.akfamily.xyz/)
## Installation
### General
```shell
pip install akshare --upgrade
```
### China
```shell
pip install akshare -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host=mirrors.aliyun.com --upgrade
```
### PR
Please check out [Documentation](https://akshare.akfamily.xyz/contributing.html) if you
want to contribute to AKShare
### Docker
#### Pull images
```shell
docker pull registry.cn-shanghai.aliyuncs.com/akfamily/aktools:jupyter
```
#### Run Container
```shell
docker run -it registry.cn-shanghai.aliyuncs.com/akfamily/aktools:jupyter python
```
#### Test
```python
import akshare as ak
print(ak.__version__)
```
## Usage
### Data
Code:
```python
import akshare as ak
stock_zh_a_hist_df = ak.stock_zh_a_hist(symbol="000001", period="daily", start_date="20170301", end_date='20231022', adjust="")
print(stock_zh_a_hist_df)
```
Output:
```
日期 开盘 收盘 最高 ... 振幅 涨跌幅 涨跌额 换手率
0 2017-03-01 9.49 9.49 9.55 ... 0.84 0.11 0.01 0.21
1 2017-03-02 9.51 9.43 9.54 ... 1.26 -0.63 -0.06 0.24
2 2017-03-03 9.41 9.40 9.43 ... 0.74 -0.32 -0.03 0.20
3 2017-03-06 9.40 9.45 9.46 ... 0.74 0.53 0.05 0.24
4 2017-03-07 9.44 9.45 9.46 ... 0.63 0.00 0.00 0.17
... ... ... ... ... ... ... ... ...
1610 2023-10-16 11.00 11.01 11.03 ... 0.73 0.09 0.01 0.26
1611 2023-10-17 11.01 11.02 11.05 ... 0.82 0.09 0.01 0.25
1612 2023-10-18 10.99 10.95 11.02 ... 1.00 -0.64 -0.07 0.34
1613 2023-10-19 10.91 10.60 10.92 ... 3.01 -3.20 -0.35 0.61
1614 2023-10-20 10.55 10.60 10.67 ... 1.51 0.00 0.00 0.27
[1615 rows x 11 columns]
```
### Plot
Code:
```python
import akshare as ak
import mplfinance as mpf # Please install mplfinance as follows: pip install mplfinance
stock_us_daily_df = ak.stock_us_daily(symbol="AAPL", adjust="qfq")
stock_us_daily_df = stock_us_daily_df.set_index(["date"])
stock_us_daily_df = stock_us_daily_df["2020-04-01": "2020-04-29"]
mpf.plot(stock_us_daily_df, type="candle", mav=(3, 6, 9), volume=True, show_nontrading=False)
```
Output:
![KLine](https://jfds-1252952517.cos.ap-chengdu.myqcloud.com/akshare/readme/home/AAPL_candle.png)
## Features
- **Easy of use**: Just one line code to fetch the data;
- **Extensible**: Easy to customize your own code with other application;
- **Powerful**: Python ecosystem.
## Tutorials
1. [Overview](https://akshare.akfamily.xyz/introduction.html)
2. [Installation](https://akshare.akfamily.xyz/installation.html)
3. [Tutorial](https://akshare.akfamily.xyz/tutorial.html)
4. [Data Dict](https://akshare.akfamily.xyz/data/index.html)
5. [Subjects](https://akshare.akfamily.xyz/topic/index.html)
## Contribution
[AKShare](https://github.com/akfamily/akshare) is still under developing, feel free to open issues and pull requests:
- Report or fix bugs
- Require or publish interface
- Write or fix documentation
- Add test cases
> Notice: We use [Ruff](https://github.com/astral-sh/ruff) to format the code
## Statement
1. All data provided by [AKShare](https://github.com/akfamily/akshare) is just for academic research purpose;
2. The data provided by [AKShare](https://github.com/akfamily/akshare) is for reference only and does not constitute any investment proposal;
3. Any investor based on [AKShare](https://github.com/akfamily/akshare) research should pay more attention to data risk;
4. [AKShare](https://github.com/akfamily/akshare) will insist on providing open-source financial data;
5. Based on some uncontrollable factors, some data interfaces in [AKShare](https://github.com/akfamily/akshare) may be removed;
6. Please follow the relevant open-source protocol used by [AKShare](https://github.com/akfamily/akshare);
7. Provide HTTP API for the person who uses other program language: [AKTools](https://aktools.readthedocs.io/).
## Show your style
Use the badge in your project's README.md:
```markdown
[![Data: akshare](https://img.shields.io/badge/Data%20Science-AKShare-green)](https://github.com/akfamily/akshare)
```
Using the badge in README.rst:
```
.. image:: https://img.shields.io/badge/Data%20Science-AKShare-green
:target: https://github.com/akfamily/akshare
```
Looks like this:
[![Data: akshare](https://img.shields.io/badge/Data%20Science-AKShare-green)](https://github.com/akfamily/akshare)
## Citation
Please use this **bibtex** if you want to cite this repository in your publications:
```markdown
@misc{akshare,
author = {Albert King and Yaojie Zhang},
title = {AKShare},
year = {2022},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {\url{https://github.com/akfamily/akshare}},
}
```
## Acknowledgement
Special thanks [FuShare](https://github.com/LowinLi/fushare) for the opportunity of learning from the project;
Special thanks [TuShare](https://github.com/waditu/tushare) for the opportunity of learning from the project;
Thanks for the data provided by [东方财富网站](http://data.eastmoney.com);
Thanks for the data provided by [新浪财经网站](https://finance.sina.com.cn);
Thanks for the data provided by [金十数据网站](https://www.jin10.com/);
Thanks for the data provided by [生意社网站](http://www.100ppi.com/);
Thanks for the data provided by [中国银行间市场交易商协会网站](http://www.nafmii.org.cn/);
Thanks for the data provided by [99期货网站](http://www.99qh.com/);
Thanks for the data provided by [中国外汇交易中心暨全国银行间同业拆借中心网站](http://www.chinamoney.com.cn/chinese/);
Thanks for the data provided by [和讯财经网站](http://www.hexun.com/);
Thanks for the data provided by [DACHENG-XIU 网站](https://dachxiu.chicagobooth.edu/);
Thanks for the data provided by [上海证券交易所网站](http://www.sse.com.cn/assortment/options/price/);
Thanks for the data provided by [深证证券交易所网站](http://www.szse.cn/);
Thanks for the data provided by [北京证券交易所网站](http://www.bse.cn/);
Thanks for the data provided by [中国金融期货交易所网站](http://www.cffex.com.cn/);
Thanks for the data provided by [上海期货交易所网站](http://www.shfe.com.cn/);
Thanks for the data provided by [大连商品交易所网站](http://www.dce.com.cn/);
Thanks for the data provided by [郑州商品交易所网站](http://www.czce.com.cn/);
Thanks for the data provided by [上海国际能源交易中心网站](http://www.ine.com.cn/);
Thanks for the data provided by [Timeanddate 网站](https://www.timeanddate.com/);
Thanks for the data provided by [河北省空气质量预报信息发布系统网站](http://110.249.223.67/publish/);
Thanks for the data provided by [Economic Policy Uncertainty 网站](http://www.nanhua.net/nhzc/varietytrend.html);
Thanks for the data provided by [申万指数网站](http://www.swsindex.com/idx0120.aspx?columnid=8832);
Thanks for the data provided by [真气网网站](https://www.zq12369.com/);
Thanks for the data provided by [财富网站](http://www.fortunechina.com/);
Thanks for the data provided by [中国证券投资基金业协会网站](http://gs.amac.org.cn/);
Thanks for the data provided by [Expatistan 网站](https://www.expatistan.com/cost-of-living);
Thanks for the data provided by [北京市碳排放权电子交易平台网站](https://www.bjets.com.cn/article/jyxx/);
Thanks for the data provided by [国家金融与发展实验室网站](http://www.nifd.cn/);
Thanks for the data provided by [义乌小商品指数网站](http://www.ywindex.com/Home/Product/index/);
Thanks for the data provided by [百度迁徙网站](https://qianxi.baidu.com/?from=shoubai#city=0);
Thanks for the data provided by [思知网站](https://www.ownthink.com/);
Thanks for the data provided by [Currencyscoop 网站](https://currencyscoop.com/);
Thanks for the data provided by [新加坡交易所网站](https://www.sgx.com/zh-hans/research-education/derivatives);
@@ -0,0 +1,823 @@
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/_version.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/air/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/air/air_hebei.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/air/air_zhenqi.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/air/cons.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/air/sunrise_tad.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/article/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/article/cons.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/article/epu_index.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/article/ff_factor.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/article/fred_md.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/article/risk_rv.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/bank/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/bank/bank_cbirc_2020.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/bank/cons.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/bond/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/bond/bond_buy_back_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/bond/bond_cb_sina.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/bond/bond_cb_ths.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/bond/bond_cbond.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/bond/bond_china.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/bond/bond_china_money.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/bond/bond_convert.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/bond/bond_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/bond/bond_gb_sina.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/bond/bond_info_cm.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/bond/bond_issue_cninfo.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/bond/bond_nafmii.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/bond/bond_summary.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/bond/bond_zh_cov.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/bond/bond_zh_sina.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/bond/cons.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/cal/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/cal/rv.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/crypto/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/crypto/crypto_bitcoin_cme.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/crypto/crypto_hold.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/currency/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/currency/currency.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/currency/currency_china_bank_sina.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/currency/currency_safe.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/data/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/datasets.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/economic/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/economic/cons.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/economic/macro_australia.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/economic/macro_bank.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/economic/macro_canada.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/economic/macro_china.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/economic/macro_china_hk.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/economic/macro_china_nbs.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/economic/macro_constitute.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/economic/macro_euro.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/economic/macro_finance_ths.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/economic/macro_germany.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/economic/macro_info_ws.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/economic/macro_japan.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/economic/macro_other.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/economic/macro_swiss.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/economic/macro_uk.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/economic/macro_usa.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/economic/marco_cnbs.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/energy/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/energy/energy_carbon.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/energy/energy_oil_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/event/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/event/cons.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/event/migration.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/exceptions.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/file_fold/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/forex/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/forex/cons.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/forex/forex_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/fortune/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/fortune/fortune_500.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/fortune/fortune_bloomberg.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/fortune/fortune_forbes_500.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/fortune/fortune_hurun.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/fortune/fortune_xincaifu_500.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/fund/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/fund/fund_amac.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/fund/fund_announcement_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/fund/fund_aum_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/fund/fund_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/fund/fund_etf_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/fund/fund_etf_sina.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/fund/fund_etf_sse.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/fund/fund_etf_szse.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/fund/fund_etf_ths.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/fund/fund_fee_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/fund/fund_fhsp_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/fund/fund_info_ths.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/fund/fund_init_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/fund/fund_init_ths.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/fund/fund_lof_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/fund/fund_manager.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/fund/fund_overview_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/fund/fund_portfolio_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/fund/fund_position_lg.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/fund/fund_rank_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/fund/fund_rating.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/fund/fund_report_cninfo.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/fund/fund_scale_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/fund/fund_scale_sina.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/fund/fund_scale_szse.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/fund/fund_xq.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/futures/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/futures/cons.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/futures/cot.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/futures/futures_basis.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/futures/futures_comex_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/futures/futures_comm_ctp.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/futures/futures_comm_js.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/futures/futures_comm_qihuo.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/futures/futures_contract_detail.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/futures/futures_daily_bar.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/futures/futures_foreign.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/futures/futures_hf_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/futures/futures_hist_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/futures/futures_hq_sina.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/futures/futures_index_ccidx.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/futures/futures_inventory_99.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/futures/futures_inventory_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/futures/futures_news_shmet.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/futures/futures_roll_yield.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/futures/futures_rule.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/futures/futures_rule_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/futures/futures_settle.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/futures/futures_settlement_price_sgx.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/futures/futures_spot_stock_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/futures/futures_stock_js.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/futures/futures_to_spot.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/futures/futures_warehouse_receipt.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/futures/futures_zh_sina.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/futures/receipt.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/futures/requests_fun.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/futures/symbol_var.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/futures_derivative/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/futures_derivative/cons.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/futures_derivative/futures_contract_info_cffex.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/futures_derivative/futures_contract_info_czce.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/futures_derivative/futures_contract_info_dce.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/futures_derivative/futures_contract_info_gfex.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/futures_derivative/futures_contract_info_ine.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/futures_derivative/futures_contract_info_shfe.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/futures_derivative/futures_cot_sina.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/futures_derivative/futures_hog.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/futures_derivative/futures_index_sina.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/futures_derivative/futures_spot_sys.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/fx/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/fx/cons.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/fx/currency_investing.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/fx/fx_c_swap_cm.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/fx/fx_quote.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/fx/fx_quote_baidu.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/hf/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/hf/hf_sp500.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/index/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/index/cons.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/index/index_cflp.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/index/index_cni.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/index/index_cons.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/index/index_csindex.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/index/index_cx.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/index/index_drewry.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/index/index_eri.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/index/index_global_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/index/index_global_sina.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/index/index_hog.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/index/index_kq_fz.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/index/index_kq_ss.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/index/index_option_qvix.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/index/index_research_fund_sw.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/index/index_research_sw.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/index/index_spot.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/index/index_stock_hk.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/index/index_stock_us_sina.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/index/index_stock_zh.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/index/index_stock_zh_csindex.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/index/index_sugar.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/index/index_sw.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/index/index_yw.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/index/index_zh_a_scope.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/index/index_zh_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/interest_rate/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/interest_rate/interbank_rate_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/movie/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/movie/artist_yien.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/movie/movie_yien.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/movie/video_yien.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/news/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/news/news_baidu.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/news/news_cctv.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/news/news_stock.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/nlp/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/nlp/nlp_interface.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/option/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/option/cons.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/option/option_comm_qihuo.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/option/option_commodity.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/option/option_commodity_sina.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/option/option_contract_info_ctp.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/option/option_current_sse.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/option/option_current_szse.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/option/option_czce.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/option/option_daily_stats_sse_szse.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/option/option_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/option/option_finance.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/option/option_finance_sina.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/option/option_lhb_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/option/option_margin.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/option/option_premium_analysis_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/option/option_risk_analysis_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/option/option_risk_indicator_sse.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/option/option_value_analysis_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/other/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/other/other_car_cpca.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/other/other_car_gasgoo.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/other/other_taptap.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/pro/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/pro/client.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/pro/cons.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/pro/data_pro.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/qdii/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/qdii/qdii_jsl.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/qhkc/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/qhkc/qhkc_api.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/qhkc_web/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/qhkc_web/qhkc_fund.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/qhkc_web/qhkc_index.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/qhkc_web/qhkc_tool.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/rate/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/rate/repo_rate.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/reits/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/reits/reits_basic.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/request.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/spot/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/spot/spot_hog_soozhu.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/spot/spot_price_qh.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/spot/spot_sge.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/cons.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_allotment_cninfo.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_ask_bid_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_board_concept_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_board_industry_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_cg_equity_mortgage.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_cg_guarantee.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_cg_lawsuit.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_dividend_cninfo.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_dzjy_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_fund_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_fund_hold.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_gsrl_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_hk_comparison_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_hk_famous.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_hk_fhpx_ths.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_hk_hot_rank_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_hk_sina.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_hold_control_cninfo.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_hold_control_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_hold_num_cninfo.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_hot_rank_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_hot_search_baidu.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_hot_up_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_hsgt_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_industry.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_industry_cninfo.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_industry_pe_cninfo.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_industry_sw.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_info.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_info_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_intraday_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_intraday_sina.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_ipo_summary_cninfo.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_new_cninfo.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_news_cx.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_profile_cninfo.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_profile_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_rank_forecast.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_repurchase_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_share_changes_cninfo.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_share_hold.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_stop.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_summary.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_us_famous.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_us_js.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_us_pink.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_us_sina.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_weibo_nlp.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_xq.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_zh_a_sina.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_zh_a_special.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_zh_a_tick_tx.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_zh_a_tx.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_zh_ah_tx.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_zh_b_sina.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_zh_comparison_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_zh_kcb_report.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock/stock_zh_kcb_sina.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/cons.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_a_below_net_asset_statistics.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_a_high_low.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_a_indicator.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_a_pe_and_pb.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_account_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_all_pb.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_analyst_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_board_concept_ths.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_board_industry_ths.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_buffett_index_lg.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_classify_sina.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_comment_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_concept_futu.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_congestion_lg.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_cyq_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_disclosure_cninfo.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_dxsyl_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_ebs_lg.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_esg_sina.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_fhps_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_fhps_ths.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_fund_flow.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_gddh_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_gdfx_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_gdhs.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_gdzjc_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_gpzy_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_gxl_lg.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_hist_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_hist_tx.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_hk_valuation_baidu.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_hot_xq.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_hsgt_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_hsgt_exchange_rate.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_hsgt_min_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_info.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_inner_trade_xq.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_irm_cninfo.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_jgdy_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_lh_yybpm.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_lhb_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_lhb_sina.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_margin_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_margin_sse.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_margin_szse.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_market_legu.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_pankou_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_qsjy_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_report_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_research_report_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_sns_sseinfo.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_sy_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_technology_ths.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_tfp_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_three_report_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_ttm_lyr.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_us_valuation_baidu.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_value_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_yjbb_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_yjyg_cninfo.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_yjyg_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_yzxdr_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_zdhtmx_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_zf_pg.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_zh_valuation_baidu.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_zh_vote_baidu.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_feature/stock_ztb_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_fundamental/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_fundamental/stock_basic_info_xq.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_fundamental/stock_finance_hk_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_fundamental/stock_finance_sina.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_fundamental/stock_finance_ths.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_fundamental/stock_finance_us_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_fundamental/stock_gbjg_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_fundamental/stock_hold.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_fundamental/stock_ipo_declare.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_fundamental/stock_ipo_review.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_fundamental/stock_ipo_ths.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_fundamental/stock_ipo_tutor.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_fundamental/stock_kcb_detail_sse.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_fundamental/stock_kcb_sse.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_fundamental/stock_notice.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_fundamental/stock_profit_forecast_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_fundamental/stock_profit_forecast_hk_etnet.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_fundamental/stock_profit_forecast_ths.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_fundamental/stock_recommend.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_fundamental/stock_register_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_fundamental/stock_restricted_em.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_fundamental/stock_zygc.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/stock_fundamental/stock_zyjs_ths.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/tool/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/tool/trade_date_hist.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/utils/__init__.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/utils/cons.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/utils/context.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/utils/demjson.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/utils/func.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/utils/multi_decrypt.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/utils/request.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/utils/token_process.cpython-39.pyc,,
../../../../../../../../Library/Caches/com.apple.python/Users/cjun/Code/github/stock-tracker/backend/.venv/lib/python3.9/site-packages/akshare/utils/tqdm.cpython-39.pyc,,
akshare-1.18.64.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
akshare-1.18.64.dist-info/METADATA,sha256=jP5OCB46wqmZJXkAxKmGY2Ll3gMvaPv29CSBjg0kzDg,13169
akshare-1.18.64.dist-info/RECORD,,
akshare-1.18.64.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
akshare-1.18.64.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
akshare-1.18.64.dist-info/licenses/LICENSE,sha256=0chPuszV_bx1zRKrmgX095HYnuJmVpvJdsiwvvr8LWU,1073
akshare-1.18.64.dist-info/top_level.txt,sha256=IqbV2ffZP5qIrLBa8TqOSfh4lN2HGToow-uSjXGsm_A,8
akshare/__init__.py,sha256=6qQ_NF3pxQoRwx-QlFgEpUhQHsUMJSMmijLGq6vTSCI,205304
akshare/_version.py,sha256=qr5wIitlDNO9WazYSujjG_W4jYQenWo6KmiKprJP-vI,24
akshare/air/__init__.py,sha256=RMTf1bT5EOE3ttWpn3hGu1LtUmsVxDoa0W7W0gXHOy8,81
akshare/air/air_hebei.py,sha256=jFhsi41EfSGYpRUo98bvJ1oer1FPiQgw1grSrb_q5Yg,5415
akshare/air/air_zhenqi.py,sha256=LFu7tflruXDIiCUVJNNwzFh-txyZM8NGXXm16-wptjQ,9447
akshare/air/cons.py,sha256=wGDO6_sXnnr1WzT-BbsKzb8QGBtRZnpY1bLMq2uYPyg,9772
akshare/air/crypto.js,sha256=ZekRtmCpvWxxWt3qpXj034qx_4SmMIKBQCgrlaYlBso,8444
akshare/air/outcrypto.js,sha256=Av3Ded3hxv9vnL_r8p2mmHfUsngs7wCavtFc8jbqlhg,142354
akshare/air/sunrise_tad.py,sha256=TmZDVhHJENyK2YUcHuiByZBIpqEBhYPiFqaKyzzIvbk,4138
akshare/article/__init__.py,sha256=98SxnOLCcIi59h2uZVgEx4spYd_QRDo_4bvctcwGNQw,82
akshare/article/cons.py,sha256=mTJFPBijwYfTxPwqE2HgjLlo3PbrQzrKxdmu93nUTDM,277
akshare/article/epu_index.py,sha256=uXGY3uAdyQpRYfs30cfQbu6bwIx8WY16XABpz2bX9bQ,1917
akshare/article/ff_factor.py,sha256=SZUIzSWACciTaM9UaSO_IqkdxkXNrxM6BmwHc_uBPnY,4579
akshare/article/fred_md.py,sha256=zYiten_ByzfG5UnC6IhY_Br6OZ30w09jCiwVDiO0UG0,2300
akshare/article/risk_rv.py,sha256=yLEdnzzJkvKjEGKDNuzoXkstquMvnvXuIVLjkyC8FQw,12866
akshare/bank/__init__.py,sha256=yWsPgiDnsP8CjWRLb_0zmK61iDjJ2fWJGeUyczi8x8Q,81
akshare/bank/bank_cbirc_2020.py,sha256=wmJVa0kkAoNThuE3MxtHNyX7yuzAf91nq55yoOdVweA,7418
akshare/bank/cons.py,sha256=j4LTlewazSEOmPOnPo7wiVSKAeBZr9JEj3y3uFtFZhI,1457
akshare/bond/__init__.py,sha256=RMTf1bT5EOE3ttWpn3hGu1LtUmsVxDoa0W7W0gXHOy8,81
akshare/bond/bond_buy_back_em.py,sha256=vktXxcsNm_vu3NPUGViuIM4cPxHh2AvuIXaHeT7OxMw,7369
akshare/bond/bond_cb_sina.py,sha256=-1htAsWdAngHMYQ__YA-361SxhOuQltlmKfPnOemr9k,1812
akshare/bond/bond_cb_ths.py,sha256=sxpcGr5teUR0fSGolBKl1bDUkdA94gKdXdLvr5NSC0U,3079
akshare/bond/bond_cbond.py,sha256=zQUA-8JFkpR5BvRIS35k3XlIZfZzFZEeFlq9SQh_4ao,12165
akshare/bond/bond_china.py,sha256=Gjp2x2aNFRlGfHFpQYX_Prv19V9a4INiw5O946rLLtA,6535
akshare/bond/bond_china_money.py,sha256=giMcXH5xqYszEB33mmmTI4GbAmsW8QzNJSdU7ejUe1E,13729
akshare/bond/bond_convert.py,sha256=BAp5ZyTZhzDklfn2b714PKtM5EJW0H4yRfAZFzBfpH4,12691
akshare/bond/bond_em.py,sha256=E519B6pwiL1M5aPEnDTAYW1OSwr71saN6WOW0vxnYcg,5431
akshare/bond/bond_gb_sina.py,sha256=_N77D_NYslciUfWi5IQXu5K1NaLZ6UJsTGkPP5Nlekg,4139
akshare/bond/bond_info_cm.py,sha256=iVgeOx1XwWd3NLKYaXdixQp3wjfXs_g0EpzmK12_DOI,8130
akshare/bond/bond_issue_cninfo.py,sha256=tPoZhF-_sIX9ztCKB0K0-Z4Kd9b-389bP3_CdFK7Wb0,21672
akshare/bond/bond_nafmii.py,sha256=cekcobyXKMG1zDuM8wHWOn__SuWELxYmUwfGVmLRP40,2155
akshare/bond/bond_summary.py,sha256=_Z2OVjE3UpfxN2GhQ2FoE9eHCjQFENz0DStyJQcYkH4,3584
akshare/bond/bond_zh_cov.py,sha256=NTZdlw5tycPv9qJT6aTz4qQ_-YE9wTxpt7j5XUUYcw0,23399
akshare/bond/bond_zh_sina.py,sha256=Y3S5-JpF2HrOzE4BbtlQkconhPJLqMhTPWrzjv8hp2g,4780
akshare/bond/cons.py,sha256=lY3_MpNX5f6FQ_EO56vjebxEecQXLfggkuhWf4xybvQ,28201
akshare/cal/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
akshare/cal/rv.py,sha256=jo8SHvS2bXoQ8ECA77l4TOw_w6QPVWOhokdRJOoAKS8,6548
akshare/crypto/__init__.py,sha256=rd-OC5RqLcnl7xVjGYogmOqJw9eGbkpW_TNas1s_rok,82
akshare/crypto/crypto_bitcoin_cme.py,sha256=o9WYp9j5ukS-SfcUxt_kgX1pEsVNZQ2cADxOl_GAZbc,2476
akshare/crypto/crypto_hold.py,sha256=kdn9KziWwTtPwYfhiX_6cBONyEIjG6KA3rQtNmy6mPo,2419
akshare/currency/__init__.py,sha256=d8yOOiPqY7_A0AuIpCI71-qxxwyUyCaax5jhE54CeMo,80
akshare/currency/currency.py,sha256=cUi2vnl9NbpsxufNyDj-EP4YZVQUjSiMxg7JEG7k6ow,6398
akshare/currency/currency_china_bank_sina.py,sha256=wwYPj7WoB6HG17H2mSRnTw9f3gz-oqzG-BWiuOMhj-Q,4461
akshare/currency/currency_safe.py,sha256=1JXYSJ-Ll2m5PPIFyyIO--zOFtnXi9sI22qZ4TgywFg,1941
akshare/data/__init__.py,sha256=EJprxT_QYazNISwoVzA0CbNDG_46XaRpSbsvsg_UTLM,81
akshare/data/cninfo.js,sha256=81NKFLoOtovaEQGtJY6Zyh52HDVAlYvPdmOHQBSW28M,208856
akshare/data/crypto_info.zip,sha256=egMaxGtQiac_yDsbuHxNUkLQem_D7UWrJtJ4ofe1Rw4,122225
akshare/data/ths.js,sha256=AWPkHf3L2Il1UUL0F5qDqNn1dfU0OlZBNUbMf8AmI3Y,39664
akshare/datasets.py,sha256=rKuRNZrqi6IMsZ9nyvO3Rx02js0tH3zMLjz8HQNAoPQ,963
akshare/economic/__init__.py,sha256=7dWJSrPs7KTj9_Ffs-ZS3aYDrf3v4nOnZYqwUZ3DJms,82
akshare/economic/cons.py,sha256=gUUfujOCm80QdUKxCa41AmYXl4H-Glhwk_DQm-DuBIM,16619
akshare/economic/macro_australia.py,sha256=YwfEAb6ewRaza1haewcHDitjnksBoqiZoBf9VBLUAbw,11438
akshare/economic/macro_bank.py,sha256=wG_u5w5YjeFRn1wr-Re7ty_s2CbQ0Qphxs_bIF_20UQ,11495
akshare/economic/macro_canada.py,sha256=IKXqGCh46YwqVc1u5sqik_Dn9uLlO64FXPHPoYTRJcU,15236
akshare/economic/macro_china.py,sha256=HGhXeO-_xp5f1YSTV119L4qy3N6USOrc1eEGL_CM1Ug,149512
akshare/economic/macro_china_hk.py,sha256=webG_vVlf7OP6TdHRR28GjfFzuyRe8nIHXEFfg0Qf-k,5944
akshare/economic/macro_china_nbs.py,sha256=nP6dI-fawch8dz7GMcfGVJsTri-FfIAkvTf3h7DT-kc,9679
akshare/economic/macro_constitute.py,sha256=cCfWupKJ86uUzg_pULsg1C2FleHb25mYbfE4x29VnKA,8197
akshare/economic/macro_euro.py,sha256=mJFNHV3l0uTQuuPRVIDjDByJbBtOxmeV0ngYFeSZZMM,41076
akshare/economic/macro_finance_ths.py,sha256=u0qVSZVa5Ftu1QgehAX-bOenlmejJyy3QWlsf8C5W14,4852
akshare/economic/macro_germany.py,sha256=4I7B8kB5oVBvX7EmLUULmYSKFeyZ_Q3NGcsnWS4wgkQ,5883
akshare/economic/macro_info_ws.py,sha256=t0PDcsWCD4vt8eq1sWa3zfiYtxil1ekhaV61yu9R32Y,3076
akshare/economic/macro_japan.py,sha256=AhHKtgm0eSEl28UUQd5l-Lql2JTA5TQHB9R11ljzUJM,4266
akshare/economic/macro_other.py,sha256=zGEwV5LpXSymby8RvjFnaphxH8eJ9y1cagfEmUhHghs,4968
akshare/economic/macro_swiss.py,sha256=Ny2AkmrDhL-QcqSCy4uUO56dPSbZB7Xrt77Fpto2xqc,4340
akshare/economic/macro_uk.py,sha256=lh2JKCvstYaKIUhZl7SwkKtY1Annk-ZJPaCc50xofac,8440
akshare/economic/macro_usa.py,sha256=E5Yhwy1Sel4hHamWkIelnF-V1RZCTYqVYEZBJtLv6Lw,48425
akshare/economic/marco_cnbs.py,sha256=gWLy489eEQrxqqpoztls5FnM6yJKSw-H7o40sK6ssMU,2490
akshare/energy/__init__.py,sha256=hnsOSZlRX38q13LxfitiByNj_hUcVM-VtWDDnDoHe3s,82
akshare/energy/energy_carbon.py,sha256=9nW-u8ziJk-bLSAyjYn_ynJTezO88xjbyyjFoT6h4ZE,11311
akshare/energy/energy_oil_em.py,sha256=7mWexgPtuVN0S-dgpuYO3yHhGS_nbZzF-xVgEwKixrI,4028
akshare/event/__init__.py,sha256=mVSp-1QdNOPVPjQyEtXfnwsFPTeL9zjfJsrahhvRjkI,80
akshare/event/cons.py,sha256=7Ml4vYhrLkQFRyOFbgf0t5QN3b15gWG2pq9JEoxbj44,12391
akshare/event/migration.py,sha256=2lR3D_XHRlOKiarBSbjQVEIm3Spj5hbZIwDOvcyKsEU,3760
akshare/exceptions.py,sha256=WEJjIhSmJ_xXNW6grwV4nufE_cfmmyuhmueVGiN1VAg,878
akshare/file_fold/__init__.py,sha256=RMTf1bT5EOE3ttWpn3hGu1LtUmsVxDoa0W7W0gXHOy8,81
akshare/file_fold/calendar.json,sha256=8fHOM8XM61xTDDJx_JUUBctWJNLzC-zshdx6hf1H5lY,123161
akshare/forex/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
akshare/forex/cons.py,sha256=62e0ogTbuanOtrw79swGCuygsabJsUqvWdsEwQFJMJA,3659
akshare/forex/forex_em.py,sha256=dpNrDIWBrkWBsTd8k7XZvV_K0oTqL2cTNb-ASSTNoQo,4534
akshare/fortune/__init__.py,sha256=4OCuVKMykUB3Ubm8WogA814U5EGLdrexmfTAOcBnYM4,82
akshare/fortune/fortune_500.py,sha256=QqF3dLdDiCcSoDxsyEgJf8CHu72Ppsu7u0EajbXr6mg,3197
akshare/fortune/fortune_bloomberg.py,sha256=cFuuM2Zf712ZpTzY2zVBr7n2li4sf0nAmYjJnO6rZ2E,3690
akshare/fortune/fortune_forbes_500.py,sha256=RYPEDUb42pa5fYNl0J2RhnD4Qu6jWWZ3R8JrWdYLjhw,1384
akshare/fortune/fortune_hurun.py,sha256=TKwC1C4tDH3M8dyG-cE3gObit8nNOPOKEfERW88IL-w,11508
akshare/fortune/fortune_xincaifu_500.py,sha256=GNg14YJraS-Ywarbs-tUWvQOiSt3vKOrm2gddcmfMzI,1869
akshare/fund/__init__.py,sha256=RMTf1bT5EOE3ttWpn3hGu1LtUmsVxDoa0W7W0gXHOy8,81
akshare/fund/fund_amac.py,sha256=Dml3EgpJhmVgkttb0OdaWN41ynOCIbJ0-1qAPDWF0oo,33800
akshare/fund/fund_announcement_em.py,sha256=5E0_eT52TDVmegKJIMtT-G-wK-Du3Nnro-MBTXB6JkI,5040
akshare/fund/fund_aum_em.py,sha256=L5WtgBDkDCmLaTbRrYAzHywYOIEtIzHeykdyVsMZ2js,3659
akshare/fund/fund_em.py,sha256=mKwYkiiRDNW8wTtlCLSkaBLolWi1J_oBGsfeYphw9VI,43408
akshare/fund/fund_etf_em.py,sha256=4nvKeQQggf1-bjJR5DGq5bLi3PCTDTo4gYpgCdlOov0,17595
akshare/fund/fund_etf_sina.py,sha256=LIMEK36YAWiF8D_NNO0RXUWBtAAEsrO7aDIL73EsTq0,7056
akshare/fund/fund_etf_sse.py,sha256=EWQ_ZVcSawVnwkictkpOXfh5TuSb90NoY6wUV4Cpf_A,2309
akshare/fund/fund_etf_szse.py,sha256=BdkIcETjKEuFZehtKKI71_-CHHxrwrlm0ZcdLTIKsDQ,2132
akshare/fund/fund_etf_ths.py,sha256=QRoWFoff44MlxJVmcKEBLs-G5HAxLNYz9jmnVd7FTHM,5485
akshare/fund/fund_fee_em.py,sha256=-wRHseuZMWP_DbASJnof7pg_15gD03b5DCvOOXsEktM,7121
akshare/fund/fund_fhsp_em.py,sha256=G9j_wb2UltvHvBAxIlRnd9vOsTZCw_maTgwB6PADUUk,9238
akshare/fund/fund_info_ths.py,sha256=k2wKJaDY5XemZqCst3WlvBoPSNPDSRrsfD0YQ2I3Uo8,1583
akshare/fund/fund_init_em.py,sha256=9nravXI3ayvIRyREHy07U8gO9_dPTNoh3W36iByhmhM,2225
akshare/fund/fund_init_ths.py,sha256=3TJ4WopBoX05em291GfyCBU0v8eDwltgNQ644pafwZE,4321
akshare/fund/fund_lof_em.py,sha256=ULWndoG8LswDm8NBApyxzW3-c4llseru_iU-4fnNA2w,12226
akshare/fund/fund_manager.py,sha256=piQi1Abqm3u4E0FxTOwiTGx-KTkacH0tCxm-nALlyjY,3101
akshare/fund/fund_overview_em.py,sha256=I2SHaUXnt6hFB88kuUWw2_I-8UH1K0cGT3jXjWhztyk,1131
akshare/fund/fund_portfolio_em.py,sha256=jMYpt3zrUCma3XcDuLKwsdTnp_W0-qXupvo8vjIsu6s,10855
akshare/fund/fund_position_lg.py,sha256=lUBAftC6pGZhDp4PqmHsUvugoKRAXX2RDF2PeI63uWY,3939
akshare/fund/fund_rank_em.py,sha256=4JoRCwI6k1YXKGjWWG4qQBKEuHYQ3mNGBzFQqnwmWHo,17784
akshare/fund/fund_rating.py,sha256=gLUJntv1_2fWa7004yT-Z_IyYC4i27QrdURWgnlp_cE,11948
akshare/fund/fund_report_cninfo.py,sha256=rhztaa3J48VdnCEXFAl8wMg-P7MI2iQa0HculkvL8CI,8785
akshare/fund/fund_scale_em.py,sha256=Fl4ru-j1h99-aEcWZAW6Rd-lvslQ456R0RPdIYPoogE,4312
akshare/fund/fund_scale_sina.py,sha256=A0qIzWBQdE3IGS9-cxO9_FNpuH-BAG5HhPk5KzTFTFc,8167
akshare/fund/fund_scale_szse.py,sha256=C_tLobZ9TZlxfkcx_hjsa_TPN0LpC9PMtt9v-M4qDFY,4409
akshare/fund/fund_xq.py,sha256=AxMZB-940bNY7-BatVLZiseHNxiWA17hQzTfuxGibPU,11306
akshare/futures/__init__.py,sha256=RMTf1bT5EOE3ttWpn3hGu1LtUmsVxDoa0W7W0gXHOy8,81
akshare/futures/cons.py,sha256=VDcE_2qlz3dtu93RJl6LPbbPvbLss1f0UpIij4sp2qU,18189
akshare/futures/cot.py,sha256=eiQ6THnoieKj58n3cTXE4tiLbF8vVW6e6A1bqWNETC8,58079
akshare/futures/futures_basis.py,sha256=sGjzB5coiTUVI0RHl1vScE9HhqPRyBDnFdtG1OmegdQ,16254
akshare/futures/futures_comex_em.py,sha256=NPwOCD6lZUDL4wlGxvbmmJIFkQlW427ERO0vTux13WU,3172
akshare/futures/futures_comm_ctp.py,sha256=IyVRCUvhLTFzmcUVvlIaYZ1e38ll7AF8ExhgtXKuzrI,1003
akshare/futures/futures_comm_js.py,sha256=C_hziAWX0OcyWIqDdHTp2w-iJoHWkINqJNOEdNNOvNo,2975
akshare/futures/futures_comm_qihuo.py,sha256=S4FixnKy3ccIybx8RefFn1dRSq3nVfOjEccAmh0dpvs,12008
akshare/futures/futures_contract_detail.py,sha256=FVCL9cQ55DTpFF850MTlAfhj08acXmIO0QYwIcnWRbg,2876
akshare/futures/futures_daily_bar.py,sha256=xUf8yHfTpNptDtYKimYKektB4vheKZgYxy6xexnrjco,26928
akshare/futures/futures_foreign.py,sha256=f5Os5Ta4g0JpZpRJuTi9hErZGDjt9DsS8iVJGJG_RhQ,2266
akshare/futures/futures_hf_em.py,sha256=lemuSxBpZ7OZXvNz-lexpoRMtkgMCnlaP8BTMHfNaHg,8191
akshare/futures/futures_hist_em.py,sha256=lWtESyqqau5XbDY9fQYUBvEPbimk3WZW1nlbLPf8S1E,6517
akshare/futures/futures_hq_sina.py,sha256=HZBAve1yxp1fnwgEy_2CqVoniTXRkt8KI3REt0N0TiY,9575
akshare/futures/futures_index_ccidx.py,sha256=w1p2waOq6LC97kg4cfySy6k0tnn7LHt1vjQxlv3vXEE,1962
akshare/futures/futures_inventory_99.py,sha256=9mjq8lRx9levT4KgpzsJrBRR5BccpKcjPTpxyMgVSnU,3569
akshare/futures/futures_inventory_em.py,sha256=OwgONgg3Tu1WCIADcH6LpahDedAPz0iQcmNJb4ma5Dw,2620
akshare/futures/futures_news_shmet.py,sha256=1epZ3MwDc-T2n1ie4SSDfvUaBiMpSL0Q_xb2VoZ_llU,2465
akshare/futures/futures_roll_yield.py,sha256=nPskFCFqbvWKgB6nXr5f8zRQDo4T70jpBrrPvO5uyfA,6140
akshare/futures/futures_rule.py,sha256=9RTovEWmK0b3JVCCaefl_cUSLaGY03BUaEUdE-Pdx-g,1587
akshare/futures/futures_rule_em.py,sha256=qcXfYZibRJLN2pb3ybNIkNonUOjDMvSirG5xKkRoWqk,963
akshare/futures/futures_settle.py,sha256=lrslizNoHItvuJdVLXWf0jLrfCH_01Pdo0ceN2qTfmw,16551
akshare/futures/futures_settlement_price_sgx.py,sha256=SJxAGNuNxNEGDk7EF2odRPrWKIpzFoNf6PSNGW2KO9M,2525
akshare/futures/futures_spot_stock_em.py,sha256=43CPkAouDu691M6aCMdO1SGKglTak2aba2Np7ftkAdg,3523
akshare/futures/futures_stock_js.py,sha256=sAao7ZcqBovdEo4wrVt2K6kXK2rf1_kT_StQdzhm9og,1635
akshare/futures/futures_to_spot.py,sha256=fDsnmwUDUWQSF11MBvGEKn_c69fJmaGnRigWzvQMaZc,12898
akshare/futures/futures_warehouse_receipt.py,sha256=vBW0deHQPxeV8MJqU8Wnujkhtw9K27IcMucYWDozZOA,9267
akshare/futures/futures_zh_sina.py,sha256=iD3cq2TNCbUohiKIGhfnLTBtc-Q0Az_LkrNAH3OntSU,26185
akshare/futures/receipt.py,sha256=jS03BF95dsaP1IIccxaEEuqWdcu0kmefu4lUgqAsVB0,26068
akshare/futures/requests_fun.py,sha256=0pID8nRIukbgmIEZJYZEPs5pBBEOwvUO8DLdNs8vbe8,2910
akshare/futures/symbol_var.py,sha256=0NOG3AoyOPprWBz01J4dxpKgizeUqhvzxF_-fPQxPsE,6814
akshare/futures_derivative/__init__.py,sha256=COFyP01gIUhWs4EBr6hwL73B7IWePIzg7vP7oEY3G3I,82
akshare/futures_derivative/cons.py,sha256=VkG1HMwPVxvj7BaMifcvDpRYLsfd506npVNiEIaLF_s,5914
akshare/futures_derivative/futures_contract_info_cffex.py,sha256=Vv8ovM3FR1HTNj0Oe6LDmP1CO3lWYhcls9ck-iFir8U,3497
akshare/futures_derivative/futures_contract_info_czce.py,sha256=PQOcX1DBphqdf01U9zH5D5vqZvPuSif5Tlpisnrzl_U,4329
akshare/futures_derivative/futures_contract_info_dce.py,sha256=S3vhBELsmn1J6ql69rkdYsGe3faf1iEYrv8kDDCPTCs,2254
akshare/futures_derivative/futures_contract_info_gfex.py,sha256=jWQ7TKPNfEjf1FUCnJqWlHmkvv0qYX0xi0JEEUAuzRg,2313
akshare/futures_derivative/futures_contract_info_ine.py,sha256=vwCPG-Vl8c_Wy3ydBZ11ghMM5gjuPN0x9QFvyWxewXI,2433
akshare/futures_derivative/futures_contract_info_shfe.py,sha256=NjJNYqRl0VO7vlYSVmLA1DImLcUsG5rqP4ENJvmw6sM,2470
akshare/futures_derivative/futures_cot_sina.py,sha256=CmoZu_pItwqX0QNsJMpmEu9I84GBaQhq4dIUkP0Piyw,2815
akshare/futures_derivative/futures_hog.py,sha256=8VVd7w5LCUZWFdkffV7-dqihGcqdJlR1ks1evpcU9O0,11613
akshare/futures_derivative/futures_index_sina.py,sha256=uYkm4YvXGokpgCUhGccIK3Gv5iMjZouUnyfCDx8D0rM,5888
akshare/futures_derivative/futures_spot_sys.py,sha256=Ufqh7S7UAeW_zkASap_DZGqwyW_Vgrf2UOhedYhe-BU,3351
akshare/fx/__init__.py,sha256=fvH_pVxTFPnzXvnPvJZDD_vv0IBJusHkJxZ3dJ8ogl8,82
akshare/fx/cons.py,sha256=6BC2DoF02ptSILzmYuT1so7z3Ne47Z0eHC95i3a3Zt4,604
akshare/fx/currency_investing.py,sha256=rvrz_XD8M6z7ZBSucFInaH3kDX_vASTAsmAOhLW6p4k,2909
akshare/fx/fx_c_swap_cm.py,sha256=2WA-pWb-hwyqVPOB1chKbyf4l_996hwzbyVDBVlJ69U,2128
akshare/fx/fx_quote.py,sha256=lkBSwc6dJQ2qq1JAODk4knCZInIw3iLhJOGpCnYJo88,3426
akshare/fx/fx_quote_baidu.py,sha256=M92Dh42BILPPjC5aGv3ox7OljJiKb6drw2JCT7qChaM,2932
akshare/hf/__init__.py,sha256=hFNcepESmuHlH6Ipv9IrHbB6KMxMOD43u_EVX6BzcAo,81
akshare/hf/hf_sp500.py,sha256=cEbrP6-C3HPsjUKnErWh_rQBctWGRir31y8cCVl06jk,1207
akshare/index/__init__.py,sha256=RMTf1bT5EOE3ttWpn3hGu1LtUmsVxDoa0W7W0gXHOy8,81
akshare/index/cons.py,sha256=sstxvhtdG3m2inIhE2geZZnHqNLXrK6GuhcqfI_zE6Q,7789
akshare/index/index_cflp.py,sha256=iPn_0kePK74eScwC7rj0IhC-3w-kGQWtWlwsW-J0nbs,4422
akshare/index/index_cni.py,sha256=-7nd6KjxP8YOvCCu5nC180zBoJhgWvP3OpMkL1A9vhM,7536
akshare/index/index_cons.py,sha256=exCYkXauu3u_liWS5Y0W89F19eSwt6gJmlBciM86txQ,7616
akshare/index/index_csindex.py,sha256=-LvkugxNpvHCE8XQzqJubfdhHZFCIGArW9sOzepdOHw,1864
akshare/index/index_cx.py,sha256=jLGXfe2hLKet4yYI2ZqHarJf0VzxvlEXz13s3hFprx4,16737
akshare/index/index_drewry.py,sha256=BM7V6P8K4QUFQArsdaWRu5qJUZaCoyNz97_b8dmLeCw,2937
akshare/index/index_eri.py,sha256=N1yP2_n04WCIJ_vdPb7w5xdSNMIdomqgZ43Wg69hzts,2112
akshare/index/index_global_em.py,sha256=UNYBCpO-sD16RKgSmaEDE4IXVLMgKL9SKiv_mSxiQ_0,5912
akshare/index/index_global_sina.py,sha256=fFJeW-u6Jo1iiuRMVaGJaUZBUA6wUT0L0u6KT3vkJ4I,2494
akshare/index/index_hog.py,sha256=kb867BVagt70_ycZMn22ks5Z9jlVbMiuTsvq5ygjeig,1657
akshare/index/index_kq_fz.py,sha256=7RoRYptw5pwKzkfE94qLlhUkK_fXQzwm7G6o6vPk7jM,3376
akshare/index/index_kq_ss.py,sha256=VLhpKSa1MJTFfkYjD7Z5oI8pO_4NbWIpcsn4N7sCE84,3334
akshare/index/index_option_qvix.py,sha256=1HkeoqtgoFgkStx1QiGW9zcXfdyJmx8bTlnbZkVpfcY,14050
akshare/index/index_research_fund_sw.py,sha256=kVYjBl3vZg6CyYBCrxZiSv8taHMnqmG7PQ-LVmMNd3I,4603
akshare/index/index_research_sw.py,sha256=Mm1YtiP-PXhDysJwmFidX3RZSZZ92AyXpjl_tVrjdwA,21758
akshare/index/index_spot.py,sha256=meTBTCp2DPVTX_N3qpCLtkI-0q3XhrJ3gndNugRBGKg,1767
akshare/index/index_stock_hk.py,sha256=VrofVg4QJH-k4pOyMKDQhUCaV-SnVAqpoBPrLx6LeaE,9649
akshare/index/index_stock_us_sina.py,sha256=IxOk4G49oasv7EfEQenL9-GLuelyUus6c4JPyRlaOzY,1551
akshare/index/index_stock_zh.py,sha256=kUFvpPUiyXfuU23tjS6WMH5IScUuGicwHyKXVJJ7nBs,18762
akshare/index/index_stock_zh_csindex.py,sha256=sRVoDD-fitqAMuDs0XPm1oCz2nZ2QTkvNswL1WvXpwo,4164
akshare/index/index_sugar.py,sha256=u-huRz_WLCc2xHKRDrI3BHD7lm0XrMkQQwcEfS3FMvo,5104
akshare/index/index_sw.py,sha256=hETMmFszQb7JDY8UHjLK8szfwkr7Ui_6QcseOoEfxaI,10456
akshare/index/index_yw.py,sha256=pQoF_9HP1MEN3mnI0xUyLNZ96KnM9kQpIwA0P55JN50,4048
akshare/index/index_zh_a_scope.py,sha256=4Ej2Gnqtd66EBiI67sQZKhblcIJXdD5CoMIJYD_KwYU,1367
akshare/index/index_zh_em.py,sha256=YliKV790ypLdw9oEZ23xVVl6sbGiGxB2grmVXpSHSeA,14090
akshare/interest_rate/__init__.py,sha256=O6dl1roEQUWwtXgRpa6wOABUU7MH0YmFDrkfhBpYOX4,81
akshare/interest_rate/interbank_rate_em.py,sha256=p6sTfOfu38kAZj7oZS_0LvmLvBmv6nxVJV3-mFzG6xA,4519
akshare/movie/__init__.py,sha256=YzijIIzvGpcc9hORC6qJSEK6vkjH5c4Docb5tQq2iHs,82
akshare/movie/artist_yien.py,sha256=hYLSb1e9Eowem2vj248xKloqRykIBbIb3ZdNttmw2CE,3876
akshare/movie/jm.js,sha256=Emr0kB7KvhBaeVYFwYJ84Ra6EBThVIE_RVPKkOO7uvk,117171
akshare/movie/movie_yien.py,sha256=BP3eGmGeTJerlIIF-sOq-TsssZiKM-DiX3vwV3dwi8o,13574
akshare/movie/video_yien.py,sha256=2JsyKTwiP4RTuDNzQR6d9V9fzMnByH2ATJFzdtPyXSQ,3524
akshare/news/__init__.py,sha256=B7G1wejQ9jRov6hXKLh9xy4F-UcfPps3AgVLDZnKM4w,82
akshare/news/news_baidu.py,sha256=c5l8OWSpigiU8E6OhEh-ZwHFDxg0sJWKQc418YHgC0w,14399
akshare/news/news_cctv.py,sha256=MRODE1qilypQijyCZedgC1Ctju_3ySdJlhT2nuJcuwc,7389
akshare/news/news_stock.py,sha256=s2_ROtls6pHfajGUolU6FP9YROL5bvbs08bFE3yvCOg,4381
akshare/nlp/__init__.py,sha256=F-1D7ifZQ4RiE2zsQuPc4Aj_C7RhqxGPvObcRNcLPGs,79
akshare/nlp/nlp_interface.py,sha256=PyZjT3PkuTbloop-JwLwZ2kNi22zdO-r_pRUWQ5SmgM,1856
akshare/option/__init__.py,sha256=RMTf1bT5EOE3ttWpn3hGu1LtUmsVxDoa0W7W0gXHOy8,81
akshare/option/cons.py,sha256=WgeX4UvkvFmTsNTMYwXcIJkqSfCw6A3hn3qM73QrIM0,4817
akshare/option/option_comm_qihuo.py,sha256=kjbdp-94KJJJi1ex5U03abtlgviqwP0Aahb6FwddPkk,3128
akshare/option/option_commodity.py,sha256=QTYjDHM0OXtGh9n_SkvH_om__l-0-kULnfzCOjNnAPg,26394
akshare/option/option_commodity_sina.py,sha256=NN2qywfGZphKlHiEuwU7_3aNXTEKaXH0UrU8xLIQ5XQ,7731
akshare/option/option_contract_info_ctp.py,sha256=qei5aN2AIghbxnxTap2xQUouwMD2VlEUI53zHBY6mFs,2111
akshare/option/option_current_sse.py,sha256=6xeFc5KwAXV1xCBthytr2SrnJiAd7v1iQxHZH56_2SU,2019
akshare/option/option_current_szse.py,sha256=1UInsz1APGtn5gVcq-ajUU67pXxQKkbZEMv6fb2RgOQ,3771
akshare/option/option_czce.py,sha256=9FCgqgxrHX3DBdvg3F6HZ1Hs7uSO7w21KJWpS8Wykgg,2538
akshare/option/option_daily_stats_sse_szse.py,sha256=Igqi2IPX_1UT2qgIsPDJtSZ660TjvHy9twn_q7Vrodw,4932
akshare/option/option_em.py,sha256=9Vm5tDk-i8a0ybzWwa13sUBbWPp5HskYzBlfcs-rF7g,5830
akshare/option/option_finance.py,sha256=LF9-j7l2qH469qMzs8Iel2BfJeNuQHtP2nC4hHoIpF4,12608
akshare/option/option_finance_sina.py,sha256=EFrM3hD2T75VBsgX0IxMNRq-I7RCo9ibapVjfLUha2I,37867
akshare/option/option_lhb_em.py,sha256=lzATTo7aXeJeAq1CqpGiRiWGHPfdDAo9Rm3C0Aoukh4,9010
akshare/option/option_margin.py,sha256=j5wyt8pdB8-k1t0Zc3s5dgeM-8YZsHqeubiRUStlGdU,2577
akshare/option/option_premium_analysis_em.py,sha256=E0_RVSnEcUBlicHv1GdWG5gJYzCgqx6uTXY81y4LY5c,2543
akshare/option/option_risk_analysis_em.py,sha256=OcmZ42Ewg9XCJkNDt8uLjtF9akmKsEdoF9Zu97Hz4eE,2587
akshare/option/option_risk_indicator_sse.py,sha256=DQ4e-FHUbfdBUxera83u44fAXHYGQpF4kYeh3hfx-ZE,2453
akshare/option/option_value_analysis_em.py,sha256=KIzLJxax1P8SuIUFD0CnnEpTntSnaObwYotGn28DgoY,2658
akshare/other/__init__.py,sha256=tSF3ugxWds8utQeRU2yL0MuPphY0iyrW9l4EkQZeNdg,81
akshare/other/other_car_cpca.py,sha256=hCBNUrCI2l3OCP3Gqgr_4zpyzhO99XCBoiwkIhUM3r0,34987
akshare/other/other_car_gasgoo.py,sha256=KaCMVPydiGJvhJN9eZEvObygYquCsSgsZkQRB0J6srk,3046
akshare/other/other_taptap.py,sha256=gbD9shIaMPQJHyWPUgf_5PakAPmgwDtt1xYku_iNXuM,5669
akshare/pro/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
akshare/pro/client.py,sha256=XiAT5uEKQrYugg1MilEdyXJnJiSwvS13cftR8YY4tgA,2281
akshare/pro/cons.py,sha256=ZXTuihl3Pej84O17YdFG1SqPhfD6dQR34Pp8IKak7oQ,245
akshare/pro/data_pro.py,sha256=XLpqaZNUPddOBcFK1jBvf4AOYnHJAnoeEitTs0mAA10,831
akshare/qdii/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
akshare/qdii/qdii_jsl.py,sha256=9KUMOR-7wK7_GqILqbPFO6bCerJ8oZENo0CiqILOV6U,8161
akshare/qhkc/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
akshare/qhkc/qhkc_api.py,sha256=LsgyPG57HIF3Ot1EjF2M6qWGSwEg1vdPXKgCg4G4Sec,8364
akshare/qhkc_web/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
akshare/qhkc_web/qhkc_fund.py,sha256=FZmskiqSVfwLaOHe4xrtcQ0jwwPzMKD5aaC71f2nRnw,17551
akshare/qhkc_web/qhkc_index.py,sha256=Dk_ral7UbjyQ0LEyTgDWfIVExPybIKLl77P-t2E4EjA,9501
akshare/qhkc_web/qhkc_tool.py,sha256=wLy5Vi_eqwjsiNfw8qSCQwOH12XdUcGKdXygRyznt0c,9286
akshare/rate/__init__.py,sha256=qbRx0IhTYi5ZakakyP1xD7dwHmqqkuAvBh0Z1kQr3MQ,82
akshare/rate/repo_rate.py,sha256=lxSEMOeWsf-cVfJfZ7XBfSqOwYYQSJKp3iamCWubfjg,4295
akshare/reits/__init__.py,sha256=icmIWDUbQg5O-0SJCvf44FzvypneQrb3D-s540_kFk8,81
akshare/reits/reits_basic.py,sha256=CRE-_paiPwQ8vWqvJfs8ZAN_LqiMGYkawV4u96aUfGI,7327
akshare/request.py,sha256=HtFFf9MhfEibR-ETWe-1Tts6ELU4VKSqA-ghaXjegQM,4252
akshare/spot/__init__.py,sha256=BvXm1zCReGMWbcANKydbK9uvYzNU-cbReuUYbdDqunI,82
akshare/spot/spot_hog_soozhu.py,sha256=IEt7zrDs0ptAKgMA7QRIk45jcMLcA_LGq6Y3lKLFTi0,9397
akshare/spot/spot_price_qh.py,sha256=rRv09vR8K0U_x6x8AiLgGluxytIXkLatFNVkFbIh8eQ,3756
akshare/spot/spot_sge.py,sha256=fXy6I9GchX2rfdPDD2wSN8K-hcDdS3ABzLDLdH-9t4Y,8696
akshare/stock/__init__.py,sha256=jSa9260d6aNZajaW68chI2mpPkDSXLOgi3eXrqo4MQ8,82
akshare/stock/cons.py,sha256=iWAKVzjg9vGliyPt7ECeDB44kv4YQY7q-gFd5nTsb4s,43453
akshare/stock/stock_allotment_cninfo.py,sha256=OVjVdWp2XVRNbJvVgtgVVoBmPBJgBB4RyIIgA_9QHM8,6066
akshare/stock/stock_ask_bid_em.py,sha256=bo7VNkp1PmK4Z-GPZuVn_I-IAdzeW8cs3W_75KodxCg,3368
akshare/stock/stock_board_concept_em.py,sha256=hl8KWtGCcV3wHmrWIuNSqrrbw0ma5p9qxfDsYmb17AQ,18015
akshare/stock/stock_board_industry_em.py,sha256=9QfIxNb5EN5xOYEVXcKr1sQVrpt9muSnc7JhTP1Chco,18396
akshare/stock/stock_cg_equity_mortgage.py,sha256=Pui5aWKKPwGuKjF_GNpejDzsMGNPrxiaJviLz3x2e9I,3426
akshare/stock/stock_cg_guarantee.py,sha256=ts7qcQhhyN1PHB7Q4XlMn38HhfVvubOvky9RZfmUP94,3844
akshare/stock/stock_cg_lawsuit.py,sha256=6Y92pPw0JgyrInteqHuU07G1jwmdX2wjaDtrJN8y6Hg,4129
akshare/stock/stock_dividend_cninfo.py,sha256=o9VI3RKWy1xWWumtGi9gpJIJvPSfMVMZNCXM5q2LKRQ,3770
akshare/stock/stock_dzjy_em.py,sha256=DKzwOg2BtQRjHEJM4-aqRQqTaN8MWLDHabZvczF9H_c,22556
akshare/stock/stock_fund_em.py,sha256=sXIZ-2B6_LhfF24my-NLjAArEbjgxvRV6oSy2WObm08,48913
akshare/stock/stock_fund_hold.py,sha256=WstyW_tQuNj2pTEYJ2XMV6I1IQXEZl6EnXEsV26G7Gs,6022
akshare/stock/stock_gsrl_em.py,sha256=LF88NFHrW4tjUwT3CloZxomnfuI49h7uCmR_Rpgdy_0,1952
akshare/stock/stock_hk_comparison_em.py,sha256=vXPfqtAOeJSk_-ECvHUNJ12soYK7UheIy1fOm5J28DM,7084
akshare/stock/stock_hk_famous.py,sha256=Kij-j0RF2EwrBONY-VXgrzHz8YHdjZe07ToYo0DpjFE,2988
akshare/stock/stock_hk_fhpx_ths.py,sha256=aMKVjhg7nEeXKbVPsq7BkdTe2hpo1JhRHuWxPuLlVoQ,2192
akshare/stock/stock_hk_hot_rank_em.py,sha256=OXdm03AW_4M7VuWciauq_tl0FOkb1Yli4Fbnuz4kp4U,4747
akshare/stock/stock_hk_sina.py,sha256=--7vkaYvvx_cG-hotjr8mpstDUKVOlDJHTEdIg8V3TQ,10193
akshare/stock/stock_hold_control_cninfo.py,sha256=J1CGX1tZ22UJdOWAkED19o7vdE10Hke91cEbiN1RIYQ,10038
akshare/stock/stock_hold_control_em.py,sha256=pPd_nXUqSN8FHxFbG1JAl5iiRpYyOqVoeqYgBgjpHtQ,7289
akshare/stock/stock_hold_num_cninfo.py,sha256=JY9LcZMhhTiCHfQJv4pwMrLrpUxTKGLE4oRD6pvflsU,3706
akshare/stock/stock_hot_rank_em.py,sha256=ktRHbxyslr6WtjUv1KubcRkWiU0BLBDxVCFGSq-O8dg,7424
akshare/stock/stock_hot_search_baidu.py,sha256=SZ9iZcLM5sR0xr4JhX56iOaBu_XnBMiBmA17mJ4brlg,2018
akshare/stock/stock_hot_up_em.py,sha256=aSV1QIpTeLLkuHbB6GP10A8VFXCfcqLV3HumRTdjiIA,2524
akshare/stock/stock_hsgt_em.py,sha256=uI4zc8IsU9rvLcIX54ao58muO90MhoS5EA2UeTNq_Sk,5054
akshare/stock/stock_industry.py,sha256=gG8FwylKstLgL_lvM0CWSQgcsd7pe-a4oCSdzCr4bEo,5768
akshare/stock/stock_industry_cninfo.py,sha256=-qgKWECckdsEN3o5B57avBY7QrIWaJVBRsOE1-gEThY,6576
akshare/stock/stock_industry_pe_cninfo.py,sha256=0OjjsFGG90zJRZEBqaCsjKSpSAgrp3PpXzMtom_ll_s,4287
akshare/stock/stock_industry_sw.py,sha256=C0FjDg976EA0EksRS3sChbmJOZmOPEOzKCrHVs2YqTg,1441
akshare/stock/stock_info.py,sha256=0yiJA9HozneW4FG_vmUcsVqtCynUBDJ3sEmE887HKJI,16398
akshare/stock/stock_info_em.py,sha256=MmRDYZOQFlXMz5FFYDJ863_H2_kZeFmE2mRRyl6l0z8,2508
akshare/stock/stock_intraday_em.py,sha256=lKa33VVH9OPisYvUnfib-lmaGzl_iM12uyKUwRERDZE,2391
akshare/stock/stock_intraday_sina.py,sha256=gmHW17BJhCu8d3faq-ve-xcblDGH5xkekhj1WMKRnPk,2359
akshare/stock/stock_ipo_summary_cninfo.py,sha256=Ma-54GsOOhRWxilLH-Qmm0VVbpJQGf2XWKaJ8NBSgAY,3847
akshare/stock/stock_new_cninfo.py,sha256=EOuZowDLQSSHyPAwXcuPXbQkqhbz2nRBZsM7o2ZWILE,5725
akshare/stock/stock_news_cx.py,sha256=vLUK4xfvScj6LjIQw9nHYPZOUgG9w8UKoNZD10G0Ib0,1162
akshare/stock/stock_profile_cninfo.py,sha256=UgUH3GK52Xl25s3WIXlFmVTlKzDd6QGiTTjj0l-GKsk,3170
akshare/stock/stock_profile_em.py,sha256=oxhEQouwmDFcXIu3696Ih-wSbwGTuPX8qj1hSxpqFpA,11203
akshare/stock/stock_rank_forecast.py,sha256=5U0fa4tzhqKrw5kDRahUCFSrbrEx_aRtlqZq2mpeJaU,3199
akshare/stock/stock_repurchase_em.py,sha256=oOefrlTUo7gJsREaTHdj5HKr_sQeVamU43ATM0Sffts,5029
akshare/stock/stock_share_changes_cninfo.py,sha256=siy4PiZgYuNQn5jUUg2G7CyZ_yvuXNi3MVUDFhe5npY,4923
akshare/stock/stock_share_hold.py,sha256=PSPiU4gHKe2UGPI_bCgm-Uw-DlQy1VOXAHwWYpiLVNo,10998
akshare/stock/stock_stop.py,sha256=WRFvnldImkwNI8b8Y3kAdS6Ua69DUG5s5nlKHZav7R0,1161
akshare/stock/stock_summary.py,sha256=eULzk8xqhfxdtJ4JJ03noTFokl5SniBsGmjpyogW1rs,12835
akshare/stock/stock_us_famous.py,sha256=3WezC7YxnfB8DeZOICwCOhgvL9IbBgzyOkRA1cmEcHU,3634
akshare/stock/stock_us_js.py,sha256=VleGUb7K-NjmW3jMPRc2jwHXM0CMq4IzVM9kUpwURDQ,2503
akshare/stock/stock_us_pink.py,sha256=BPupikFfWMxREE944_0Z5EJjRDTG1dakGfPhqKx6ulI,3437
akshare/stock/stock_us_sina.py,sha256=gUeZiR19Uhn3OcZRVE6sJ5aC6NQDOvnkMU6QZvzTXJo,8192
akshare/stock/stock_weibo_nlp.py,sha256=-k7gzAusb8_D4l0rc6bOzQ3x4b2dFBXJ2hgOntwEGc8,3266
akshare/stock/stock_xq.py,sha256=kRPyWbYYd6Adkm7hpuDimk2nXRz8T-mIajboyDNvcBc,4903
akshare/stock/stock_zh_a_sina.py,sha256=o6zJRiWYPsIzt2nTav50IQfdhlWIzPN5m1grq9ct4rg,18401
akshare/stock/stock_zh_a_special.py,sha256=E2BU73FLyOC-3LcXiLEVQosZ6Vvu6sIgo-Ee66kzzTM,10079
akshare/stock/stock_zh_a_tick_tx.py,sha256=-HOilipACz-FEZWlkSXy9lH8A-BpNzuLDcXr_Rv6dYQ,2230
akshare/stock/stock_zh_a_tx.py,sha256=OuEuqPkpjT4XWQPmZ_YiLBlcTPeHXvnIu39_YPyhx9o,1063
akshare/stock/stock_zh_ah_tx.py,sha256=1DfvP1xF9G4jDnqlacZiYIMWZBujxW9Kycre3yr6MhM,9212
akshare/stock/stock_zh_b_sina.py,sha256=-sd0wG4zETsgrJSXivww4YieXfnVMNSfh3phsX_XBBc,16058
akshare/stock/stock_zh_comparison_em.py,sha256=8M27v0hr97DN8VybxKYSUWXU5cdfBFXlX3ye71rZlNY,9934
akshare/stock/stock_zh_kcb_report.py,sha256=7zRovNGqXrPIYtUj9C3ivlYzfiudkaeBNiYPYlzDWkQ,2914
akshare/stock/stock_zh_kcb_sina.py,sha256=ZKFoyq9Y-6LhBoYERc4Oqv5q3Llpne7ngDIZcCs8Yq0,9862
akshare/stock_feature/__init__.py,sha256=c2VDBGyg8nWZYLvtnnSqUoQ92Cu6dJ7UFOeJsB2Gff8,82
akshare/stock_feature/cons.py,sha256=h_cIhO4YEx8joPozwE5-jHABPsT8tN7tkZ5v-gcTfmw,466
akshare/stock_feature/stock_a_below_net_asset_statistics.py,sha256=XrhZI-wLuXXufI5Nh1l9gUx9x7f0iDtdtKa14wexo54,2653
akshare/stock_feature/stock_a_high_low.py,sha256=YbbH4r2GCgEEHBP3oJwcxYd6qVJJVhdF_si-0kIT4vw,2050
akshare/stock_feature/stock_a_indicator.py,sha256=6_gTR5HiDfPv6c94DD4AFqIPXRRAxgPxt_A8funQrts,2897
akshare/stock_feature/stock_a_pe_and_pb.py,sha256=dhfB8MAFK7SVbBwJ98txOMgfPuc3e2hKyjLi3_vCmCo,19055
akshare/stock_feature/stock_account_em.py,sha256=4Vh1zoRXmuoGWu1Dw65c9mhIALqOVpb9PLqG5BJgQVg,3312
akshare/stock_feature/stock_all_pb.py,sha256=57hIpe5FrlDiiwBHXPJryQIyuSf_2jdxvN8SI8vPYdI,1185
akshare/stock_feature/stock_analyst_em.py,sha256=dFUQpgOZUxUmvICFBLRYJP7rjlILStGwm8L0LLbya7M,9406
akshare/stock_feature/stock_board_concept_ths.py,sha256=SsJ_kPbs4v9Tge25GLe3LA-meN-c_E_nAGHF3Hfi0IY,11265
akshare/stock_feature/stock_board_industry_ths.py,sha256=c22JP9MJGncLaqvBmkAxHUz3HKNMCKf58Rug9n2vlAU,15102
akshare/stock_feature/stock_buffett_index_lg.py,sha256=BXM2rdkYwNoIyG4FSKGCjKsC_M42HOPW8yRBk19Arnw,2079
akshare/stock_feature/stock_classify_sina.py,sha256=a_AfXPTfb1GwljesjaW4Nifc0BxZ5bib25HygfI314I,3175
akshare/stock_feature/stock_comment_em.py,sha256=L8iLRbscqXOZqaPUN2crp5nIE7PwXYhv1Xg52z0o_nI,10479
akshare/stock_feature/stock_concept_futu.py,sha256=jKJ9mfdJXgXwcMb3gVpbDl5ivr-zcMkuGO7jjgyA3os,6228
akshare/stock_feature/stock_congestion_lg.py,sha256=lAG-5gio95_IfAWyWrDAvIYIf67G6nCupNhsS9pE-3U,1301
akshare/stock_feature/stock_cyq_em.py,sha256=fCplJB2glYDmn7DhahiVFP-knPQQOc-hXOSQP6HwhxM,10805
akshare/stock_feature/stock_disclosure_cninfo.py,sha256=Vl9MBLQogH1SzCTw8F9nkorHCWW4r9nCGEVh4TvSj0A,10676
akshare/stock_feature/stock_dxsyl_em.py,sha256=h-v3_XBrVe8x8jFyolCZfePNE1E_oJf0FZ_fY762IfQ,19285
akshare/stock_feature/stock_ebs_lg.py,sha256=ZjAIBc-HWOwpGkjGeDYT05o3lkCs6Vk6jdoMOHDpT88,1787
akshare/stock_feature/stock_esg_sina.py,sha256=NKHbyYtuSgYubko1jDWgW0qQFTTcEVEtKA0kasHsahc,11544
akshare/stock_feature/stock_fhps_em.py,sha256=Ex355qj1j_EfuM7ImObuFJoUUqpXO73a-zXaDJMKVuU,9471
akshare/stock_feature/stock_fhps_ths.py,sha256=h7NTla-ZQRtyEhFS9BHzh-HTGT5aj3OmFL7L_Z2nKIA,2196
akshare/stock_feature/stock_fund_flow.py,sha256=cqBqsFrzwmuLP3k3wYQzvW085QUUfHZ4nBW8Zx7egkQ,18669
akshare/stock_feature/stock_gddh_em.py,sha256=N4sH_qF7LZvMs46t7eGtbnahNrEBQPDk6tRSP_1ModM,3563
akshare/stock_feature/stock_gdfx_em.py,sha256=TK8LeufVjYlJdfgyBM6QXN9SZOuj9zMcB1sllZn23V4,39249
akshare/stock_feature/stock_gdhs.py,sha256=PuAUbxuvoQJTDsjnWcW_klJu1Ccsq95qbbNTKc3qpZc,9128
akshare/stock_feature/stock_gdzjc_em.py,sha256=3bx2kQmM7OeZWoa9WtkwoCXVaMfIUZw23xpCvs5VSNM,4547
akshare/stock_feature/stock_gpzy_em.py,sha256=S4Wgb7GRrKpo9bJtHhQoF1W46z8mO2SjM-bKUS7wSrA,18629
akshare/stock_feature/stock_gxl_lg.py,sha256=jwaFojHqS2_Fqn9B3PREuUCQEE1UfowtMaZ00K4cMTw,2688
akshare/stock_feature/stock_hist_em.py,sha256=dJqUoZK8157naGf7jfx8VjYTzwivsd1yylqXxHG809g,65443
akshare/stock_feature/stock_hist_tx.py,sha256=3Ogdg0yOtzTN8mxQDIqDxcreM3O4LstP43RYWOKZJi0,3400
akshare/stock_feature/stock_hk_valuation_baidu.py,sha256=7UOUglXJtLbtj9jh6RnKR7XA_mQZ55TGJhqMxIsoA4M,1885
akshare/stock_feature/stock_hot_xq.py,sha256=P4-fLjrh-9CdVe5BQ2O5hmeSesHQAu9E49aMKmhMedM,9023
akshare/stock_feature/stock_hsgt_em.py,sha256=npwLcEc81PSn_29gUrD40GBjS3gQyPUJ9de4Hs1zqMs,62194
akshare/stock_feature/stock_hsgt_exchange_rate.py,sha256=dSNtqVUyySIqfBu9U5TiDZOETwb2fcO6Y16vLc67c0w,7152
akshare/stock_feature/stock_hsgt_min_em.py,sha256=DBNrZwbbR_XoGvGHvi-vexWsBq1Ddio8qe0L9ck0iqY,2841
akshare/stock_feature/stock_info.py,sha256=z7IugCECS5qL8VNNIprwHQppeL_ONpfPGRR65c27Ckk,7247
akshare/stock_feature/stock_inner_trade_xq.py,sha256=XNeQheeWcjdhuvfO2NWt_m191HX88HS452nZdXFBm9w,2652
akshare/stock_feature/stock_irm_cninfo.py,sha256=xD028gllzaHYj6xU9pRKvSLI_gIkVhCTnFH0dSPv1gY,6112
akshare/stock_feature/stock_jgdy_em.py,sha256=5xrD-mLcFEpq4wiaanUBXOIkiAfaxxrvaMzYddQn8qg,6109
akshare/stock_feature/stock_lh_yybpm.py,sha256=7VlqA-UGbfiQ4ez7Ah9znIfUcVI-7Fxxz_V03JO8LTY,3614
akshare/stock_feature/stock_lhb_em.py,sha256=F1L5gLgyS--VCH23D0r3ANFF3Wy8juokjE04E47itPA,38303
akshare/stock_feature/stock_lhb_sina.py,sha256=W5F5aPlxAmHzzxcf1AAiJuMVtTK9PlYMo_XamCZ5N1o,9232
akshare/stock_feature/stock_margin_em.py,sha256=DRuZ3nwtpYq55Yq3WF8jFlj4xEou3bf9krcc_JbJOPM,3327
akshare/stock_feature/stock_margin_sse.py,sha256=T0lEh4Sx-yI2d_Es29SksFn70q4Ji2NQ-ek5_RkQ7TI,7046
akshare/stock_feature/stock_margin_szse.py,sha256=ifCtC52y9OCa6nNJuaeDMXeieggYwmB8jKztddjUJ7g,6452
akshare/stock_feature/stock_market_legu.py,sha256=Fdu7olXV8Qz6t9Zfz2GGgVp-U24zPpay_mAOLjgF8iA,1914
akshare/stock_feature/stock_pankou_em.py,sha256=oynvJGmtlMsiT6NTBOasrR-USeyvccvYgFeV1CUgYmc,5539
akshare/stock_feature/stock_qsjy_em.py,sha256=AvCe5GMR70WbNzUHvL0eOuDbzvaE7mHyNjtfDg6nQmM,3970
akshare/stock_feature/stock_report_em.py,sha256=IBJJIBciKkBdXNOW06KaOEvHndjB3E0-hzfx0jYb14M,18075
akshare/stock_feature/stock_research_report_em.py,sha256=_zRGyO7WxUG2wplPjFzHGfHp9xJ9k3j4CGO8UHSjjBY,6159
akshare/stock_feature/stock_sns_sseinfo.py,sha256=TGGLw5P77Hh-sSHgw_KKoK29d1m_V_2GDQXe9m_XFew,4556
akshare/stock_feature/stock_sy_em.py,sha256=GysP1WvPpqCLhbCRXH5sxwmXCPYvgtbJYQ_jltDqaA0,17721
akshare/stock_feature/stock_technology_ths.py,sha256=MfTIm3WVNY-Uc5yVvfA3cobE01E8fS03w01NxE6B0qE,39177
akshare/stock_feature/stock_tfp_em.py,sha256=Y3jjZ758AlCvmSHr7tlT0CMk5MawbLln0cMtl1dqYMY,2481
akshare/stock_feature/stock_three_report_em.py,sha256=ld1rEctTJa8BJhCsoStI_Ejc3nMoNRdNNAf_hHma2Gc,24181
akshare/stock_feature/stock_ttm_lyr.py,sha256=ftld_a5iu7v1aKzxoY8ahCD28oogFD_l5cjAhkPt06o,1539
akshare/stock_feature/stock_us_valuation_baidu.py,sha256=UcKWeCAh7CPc43ivJOi2DVXKa6cZ4KPATORgAdbC4h8,1964
akshare/stock_feature/stock_value_em.py,sha256=RA842dkeChSEoS3yN9fiGxS3eDzYjeUdrpXbnteyzZY,2576
akshare/stock_feature/stock_yjbb_em.py,sha256=hQBr1aj808AdA88Y_dpuR7G1mb487hcRamD31UZus-s,4689
akshare/stock_feature/stock_yjyg_cninfo.py,sha256=KM0O5rHBkVAxDl4dmA_WAgqBWJMuaMLoQ2PyJ-VPBi4,2889
akshare/stock_feature/stock_yjyg_em.py,sha256=IJBzUMWAs7gTOUDDniIi_leUwkLuZYQGNUqx4ErhYtU,12184
akshare/stock_feature/stock_yzxdr_em.py,sha256=-16KDPtBDXkbHRs7aNAyPy35XurDj7LIcbWAtmgvP64,3219
akshare/stock_feature/stock_zdhtmx_em.py,sha256=xCRa0jHgTAeo4XYNom7_d_94OQJbMDiSnGky8mdethE,4472
akshare/stock_feature/stock_zf_pg.py,sha256=nYJ1uLOBdzM_PDyq4MNeWoCTripFMAPoAiaPfhDqkcg,6343
akshare/stock_feature/stock_zh_valuation_baidu.py,sha256=oxYIHP68pFvAYyqjCvZp3a9tpczTFiWhSxZ0w4eyo7I,1904
akshare/stock_feature/stock_zh_vote_baidu.py,sha256=kRnjPskZpFySRAoTb_W2KCZwsUdo20xphU95pGzGtMQ,1768
akshare/stock_feature/stock_ztb_em.py,sha256=cKIr6SWXPkE7rdsGHJtICqP19mR8C01n4qLgZCXZAek,17961
akshare/stock_feature/ths.js,sha256=AWPkHf3L2Il1UUL0F5qDqNn1dfU0OlZBNUbMf8AmI3Y,39664
akshare/stock_fundamental/__init__.py,sha256=umtdE151dFbLfXlzWAqHHVi8yj4lNPlq1wRX1Q5CMNM,81
akshare/stock_fundamental/stock_basic_info_xq.py,sha256=fiRwYyduazpxdm6gXGyDtP1mDGpeSYMKicwZRYTD73Q,3647
akshare/stock_fundamental/stock_finance_hk_em.py,sha256=iStOF9f7e0iPx3p6qmXdFOBDc7Ikn3LR-p_NGh9jC8g,7017
akshare/stock_fundamental/stock_finance_sina.py,sha256=bjYE4ahnP5S8db7KrAizaJx97t-KauHKc-2aRcC2pm8,32562
akshare/stock_fundamental/stock_finance_ths.py,sha256=zun4gc8CB_R7UOiOoVeQwrae3Ysr2UEH9SlJbPigfaI,26889
akshare/stock_fundamental/stock_finance_us_em.py,sha256=k5bWGOLi48jK48bmEdU6y8KcdAm2gNpa-P-T0WUjqdE,10531
akshare/stock_fundamental/stock_gbjg_em.py,sha256=g3F81zP8qXUaBatBZ2R-KMUnLUY5Bp7NMsMRzqmyvbs,3667
akshare/stock_fundamental/stock_hold.py,sha256=hiJx2i3hCW7Kl7kMs4Kh1QNvsg-sIUORvgQaeGjOB-Y,5472
akshare/stock_fundamental/stock_ipo_declare.py,sha256=MkhYAgMnjlcrQcFQrCOl4_Bhn8BLJszz_J2l7ctHzmQ,3184
akshare/stock_fundamental/stock_ipo_review.py,sha256=WieUOEfP-7evF9MJy8kawhfaADPoZ0nn1tIJkfInUz4,3933
akshare/stock_fundamental/stock_ipo_ths.py,sha256=1KKWDxAAhnE8k7uR6JglcYgPxZ2W-B0iiHrm8jsjmVI,4064
akshare/stock_fundamental/stock_ipo_tutor.py,sha256=l2RdNgivJWS0Coiu4cRjsGjHPijGutUrqSjGxpM-cxo,3300
akshare/stock_fundamental/stock_kcb_detail_sse.py,sha256=U2w4wUuOTnavqNEmOdQbTZfnEkDdSs91s82YdA6rwNQ,941
akshare/stock_fundamental/stock_kcb_sse.py,sha256=cDCBlCm7PJB1zA9XISpkd2FqzAJnhkfbp21au8Mliy8,1536
akshare/stock_fundamental/stock_notice.py,sha256=y2vge3ghhQY9j67kVB1GeIC-Qt1WjXrl8tKonBojptc,6349
akshare/stock_fundamental/stock_profit_forecast_em.py,sha256=_ZlWkyz-FswlICbjk_YiHjRwrlLftm_piQIPFkZMrjE,5701
akshare/stock_fundamental/stock_profit_forecast_hk_etnet.py,sha256=U0A5oRquM_a4Uz92e17ZPM8h-4_le6Q5N4bFi1yV9Fw,5462
akshare/stock_fundamental/stock_profit_forecast_ths.py,sha256=8fzPGyBcxWSvoa7UZke9bDn7P0neSKrkjHAehVgLHJM,4682
akshare/stock_fundamental/stock_recommend.py,sha256=50sdN8zYzBQHkVowSjuyMYgqGMTJe8tB8NXu50jrOXw,4617
akshare/stock_fundamental/stock_register_em.py,sha256=ZFIbslaBcY1Y52vxAyoe8zGOQDKYiQDoKzN3_n8IWyw,18339
akshare/stock_fundamental/stock_restricted_em.py,sha256=e5G3oiZBf9d_a8quX5nLzn3RggeF4yX3j-h3nAZBRmA,13378
akshare/stock_fundamental/stock_zygc.py,sha256=hLgtZmQa4hBif_Ap8gmB2Yf_-EAe3qB_UIPhkIi2-qk,2751
akshare/stock_fundamental/stock_zyjs_ths.py,sha256=5aniSf9Wp-j0fsCna9dBU8SA2M4CHTpN-GABUv6YWUM,1538
akshare/tool/__init__.py,sha256=RMTf1bT5EOE3ttWpn3hGu1LtUmsVxDoa0W7W0gXHOy8,81
akshare/tool/trade_date_hist.py,sha256=o9021QHdOEVucjynFl0jLEi1PEMlNxvDKnMsFSwRfqg,1431
akshare/utils/__init__.py,sha256=HbKUP2vZApbeK2PTZVO_m-6kAUymfDwm2yv3Kr4R_1A,81
akshare/utils/cons.py,sha256=PFZndkG3lMW1Qhg-wqcZmSowFXwQUsYYCLZT4s1Xkwc,225
akshare/utils/context.py,sha256=Hl4kPUzQ1CecRzu5JvTKpTpiMLfzAzYzG7F5hktlsCQ,934
akshare/utils/demjson.py,sha256=xT0fcUkDVWkjLquX0rQIkCmpjSueFup0TeXvM_eilGU,250248
akshare/utils/func.py,sha256=iqIAkPK6Rcf1QHSAgkIJ0XiVfsfQBDTkOb3E2QAf7uc,2491
akshare/utils/multi_decrypt.py,sha256=aWoL2iEPeuXHJg8-n7OtMKixLnIhfzepACgxfrfmQB4,1657
akshare/utils/request.py,sha256=2IY3z3v4p7gibrfS7dWIEBcwl3SjST2U0vSs0_auq_4,1899
akshare/utils/token_process.py,sha256=nGtgnZGRprXJkhLXH8mcUH4TgIFwzsTOb0EaEPa0Euo,667
akshare/utils/tqdm.py,sha256=MuPNwcswkOGjwWQOMWXi9ZvQ_RmW4obCWRj2i7HM7FE,847
@@ -0,0 +1,5 @@
Wheel-Version: 1.0
Generator: setuptools (82.0.1)
Root-Is-Purelib: true
Tag: py3-none-any
@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2019-2026 Albert King
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
File diff suppressed because it is too large Load Diff
@@ -0,0 +1 @@
__version__ = "1.18.64"
@@ -0,0 +1,6 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2019/9/30 13:58
Desc:
"""
@@ -0,0 +1,107 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2024/4/25 17:20
Desc: 河北省空气质量预报信息发布系统
https://110.249.223.67/publish
每日 17 时发布
等级划分
1. 空气污染指数为0-50,空气质量级别为一级,空气质量状况属于优。此时,空气质量令人满意,基本无空气污染,各类人群可正常活动。
2. 空气污染指数为51-100,空气质量级别为二级,空气质量状况属于良。此时空气质量可接受,但某些污染物可能对极少数异常敏感人群健康有较弱影响,建议极少数异常敏感人群应减少户外活动。
3. 空气污染指数为101-150,空气质量级别为三级,空气质量状况属于轻度污染。此时,易感人群症状有轻度加剧,健康人群出现刺激症状。建议儿童、老年人及心脏病、呼吸系统疾病患者应减少长时间、高强度的户外锻炼。
4. 空气污染指数为151-200,空气质量级别为四级,空气质量状况属于中度污染。此时,进一步加剧易感人群症状,可能对健康人群心脏、呼吸系统有影响,建议疾病患者避免长时间、高强度的户外锻练,一般人群适量减少户外运动。
5. 空气污染指数为201-300,空气质量级别为五级,空气质量状况属于重度污染。此时,心脏病和肺病患者症状显著加剧,运动耐受力降低,健康人群普遍出现症状,建议儿童、老年人和心脏病、肺病患者应停留在室内,停止户外运动,一般人群减少户外运动。
6. 空气污染指数大于300,空气质量级别为六级,空气质量状况属于严重污染。此时,健康人群运动耐受力降低,有明显强烈症状,提前出现某些疾病,建议儿童、老年人和病人应当留在室内,避免体力消耗,一般人群应避免户外活动。
发布单位:河北省环境应急与重污染天气预警中心 技术支持:中国科学院大气物理研究所 中科三清科技有限公司
"""
import pandas as pd
import requests
from bs4 import BeautifulSoup
def air_quality_hebei() -> pd.DataFrame:
"""
河北省空气质量预报信息发布系统-空气质量预报, 未来 6 天
http://218.11.10.130:8080/#/application/home
:return: city = "", 返回所有地区的数据; city="唐山市", 返回唐山市的数据
:rtype: pandas.DataFrame
"""
url = "http://218.11.10.130:8080/api/hour/130000.xml"
r = requests.get(url)
soup = BeautifulSoup(r.content, features="xml")
data = []
cities = soup.find_all("City")
for city in cities:
pointers = city.find_all("Pointer")
for pointer in pointers:
row = {
"City": city.Name.text if city.Name else None,
"Region": pointer.Region.text if pointer.Region else None,
"Station": pointer.Name.text if pointer.Name else None,
"DateTime": pointer.DataTime.text if pointer.DataTime else None,
"AQI": pointer.AQI.text if pointer.AQI else None,
"Level": pointer.Level.text if pointer.Level else None,
"MaxPoll": pointer.MaxPoll.text if pointer.MaxPoll else None,
"Longitude": pointer.CLng.text if pointer.CLng else None,
"Latitude": pointer.CLat.text if pointer.CLat else None,
}
polls = pointer.find_all("Poll")
for poll in polls:
poll_name = poll.Name.text if poll.Name else None
poll_value = poll.Value.text if poll.Value else None
row[f"{poll_name}_Value"] = poll_value
row[f"{poll_name}_IAQI"] = poll.IAQI.text if poll.IAQI else None
data.append(row)
df = pd.DataFrame(data)
numeric_columns = ["AQI", "Longitude", "Latitude"] + [
col for col in df.columns if col.endswith("_Value") or col.endswith("_IAQI")
]
for col in numeric_columns:
df[col] = pd.to_numeric(df[col], errors="coerce")
column_names = {
"City": "城市",
"Region": "区域",
"Station": "监测点",
"DateTime": "时间",
"Level": "空气质量等级",
"MaxPoll": "首要污染物",
"Longitude": "经度",
"Latitude": "纬度",
"SO2_Value": "二氧化硫_浓度",
"SO2_IAQI": "二氧化硫_IAQI",
"CO_Value": "一氧化碳_浓度",
"CO_IAQI": "一氧化碳_IAQI",
"NO2_Value": "二氧化氮_浓度",
"NO2_IAQI": "二氧化氮_IAQI",
"O3-1H_Value": "臭氧1小时_浓度",
"O3-1H_IAQI": "臭氧1小时_IAQI",
"O3-8H_Value": "臭氧8小时_浓度",
"O3-8H_IAQI": "臭氧8小时_IAQI",
"PM2.5_Value": "PM2.5_浓度",
"PM2.5_IAQI": "PM2.5_IAQI",
"PM10_Value": "PM10_浓度",
"PM10_IAQI": "PM10_IAQI",
}
df = df.rename(columns=column_names)
basic_columns = [
"城市",
"区域",
"监测点",
"时间",
"AQI",
"空气质量等级",
"首要污染物",
"经度",
"纬度",
]
pollutant_columns = [col for col in df.columns if col not in basic_columns]
df = df[basic_columns + sorted(pollutant_columns)]
return df
if __name__ == "__main__":
air_quality_hebei_df = air_quality_hebei()
print(air_quality_hebei_df)
@@ -0,0 +1,294 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2024/4/2 22:40
Desc: 真气网-空气质量
https://www.zq12369.com/environment.php
空气质量在线监测分析平台的空气质量数据
https://www.aqistudy.cn/
"""
import json
import os
import re
from io import StringIO
import pandas as pd
import requests
from py_mini_racer import MiniRacer
from akshare.utils import demjson
def _get_js_path(name: str = None, module_file: str = None) -> str:
"""
获取 JS 文件的路径(从模块所在目录查找)
:param name: 文件名
:type name: str
:param module_file: 模块路径
:type module_file: str
:return: 路径
:rtype: str
"""
module_folder = os.path.abspath(os.path.dirname(os.path.dirname(module_file)))
module_json_path = os.path.join(module_folder, "air", name)
return module_json_path
def _get_file_content(file_name: str = "crypto.js") -> str:
"""
获取 JS 文件的内容
:param file_name: JS 文件名
:type file_name: str
:return: 文件内容
:rtype: str
"""
setting_file_name = file_name
setting_file_path = _get_js_path(setting_file_name, __file__)
with open(setting_file_path) as f:
file_data = f.read()
return file_data
def has_month_data(href):
"""
Deal with href node
:param href: href
:type href: str
:return: href result
:rtype: str
"""
return href and re.compile("monthdata.php").search(href)
def air_city_table() -> pd.DataFrame:
"""
真气网-空气质量历史数据查询-全部城市列表
https://www.zq12369.com/environment.php?date=2019-06-05&tab=rank&order=DESC&type=DAY#rank
:return: 城市映射
:rtype: pandas.DataFrame
"""
url = "https://www.zq12369.com/environment.php"
date = "2020-05-01"
temp_df = None
if len(date.split("-")) == 3:
params = {
"date": date,
"tab": "rank",
"order": "DESC",
"type": "DAY",
}
r = requests.get(url, params=params)
temp_df = pd.read_html(StringIO(r.text))[1].iloc[1:, :]
del temp_df["降序"]
temp_df.reset_index(inplace=True)
temp_df["index"] = temp_df.index + 1
temp_df.columns = [
"序号",
"省份",
"城市",
"AQI",
"空气质量",
"PM2.5浓度",
"首要污染物",
]
temp_df["AQI"] = pd.to_numeric(temp_df["AQI"])
return temp_df
def air_quality_watch_point(
city: str = "杭州", start_date: str = "20220408", end_date: str = "20220409"
) -> pd.DataFrame:
"""
真气网-监测点空气质量-细化到具体城市的每个监测点
指定之间段之间的空气质量数据
https://www.zq12369.com/
:param city: 调用 ak.air_city_table() 接口获取
:type city: str
:param start_date: e.g., "20190327"
:type start_date: str
:param end_date: e.g., ""20200327""
:type end_date: str
:return: 指定城市指定日期区间的观测点空气质量
:rtype: pandas.DataFrame
"""
start_date = "-".join([start_date[:4], start_date[4:6], start_date[6:]])
end_date = "-".join([end_date[:4], end_date[4:6], end_date[6:]])
url = "https://www.zq12369.com/api/zhenqiapi.php"
file_data = _get_file_content(file_name="crypto.js")
ctx = MiniRacer()
ctx.eval(file_data)
method = "GETCITYPOINTAVG"
city_param = ctx.call("encode_param", city)
payload = {
"appId": "a01901d3caba1f362d69474674ce477f",
"method": ctx.call("encode_param", method),
"city": city_param,
"startTime": ctx.call("encode_param", start_date),
"endTime": ctx.call("encode_param", end_date),
"secret": ctx.call("encode_secret", method, city_param, start_date, end_date),
}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/81.0.4044.122 Safari/537.36"
}
r = requests.post(url, data=payload, headers=headers)
data_text = r.text
data_json = demjson.decode(ctx.call("decode_result", data_text))
temp_df = pd.DataFrame(data_json["rows"])
return temp_df
def air_quality_hist(
city: str = "杭州",
period: str = "day",
start_date: str = "20190327",
end_date: str = "20200427",
) -> pd.DataFrame:
"""
真气网-空气历史数据
https://www.zq12369.com/
:param city: 调用 ak.air_city_table() 接口获取所有城市列表
:type city: str
:param period: "hour": 每小时一个数据, 由于数据量比较大, 下载较慢; "day": 每天一个数据; "month": 每个月一个数据
:type period: str
:param start_date: e.g., "20190327"
:type start_date: str
:param end_date: e.g., "20200327"
:type end_date: str
:return: 指定城市和数据频率下在指定时间段内的空气质量数据
:rtype: pandas.DataFrame
"""
start_date = "-".join([start_date[:4], start_date[4:6], start_date[6:]])
end_date = "-".join([end_date[:4], end_date[4:6], end_date[6:]])
url = "https://www.zq12369.com/api/newzhenqiapi.php"
file_data = _get_file_content(file_name="outcrypto.js")
ctx = MiniRacer()
ctx.eval(file_data)
app_id = "4f0e3a273d547ce6b7147bfa7ceb4b6e"
method = "CETCITYPERIOD"
timestamp = ctx.eval("timestamp = new Date().getTime()")
p_text = json.dumps(
{
"city": city,
"endTime": f"{end_date} 23:45:39",
"startTime": f"{start_date} 00:00:00",
"type": period.upper(),
},
ensure_ascii=False,
indent=None,
).replace(' "', '"')
secret = ctx.call("hex_md5", app_id + method + str(timestamp) + "WEB" + p_text)
payload = {
"appId": "4f0e3a273d547ce6b7147bfa7ceb4b6e",
"method": "CETCITYPERIOD",
"timestamp": int(timestamp),
"clienttype": "WEB",
"object": {
"city": city,
"type": period.upper(),
"startTime": f"{start_date} 00:00:00",
"endTime": f"{end_date} 23:45:39",
},
"secret": secret,
}
need = (
json.dumps(payload, ensure_ascii=False, indent=None, sort_keys=False)
.replace(' "', '"')
.replace("\\", "")
.replace('p": ', 'p":')
.replace('t": ', 't":')
)
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)"
"Chrome/100.0.4896.75 Safari/537.36",
"X-Requested-With": "XMLHttpRequest",
}
params = {"param": ctx.call("encode_param", need)}
r = requests.post(url, data=params, headers=headers)
temp_text = ctx.call("decryptData", r.text)
data_json = demjson.decode(ctx.call("b.decode", temp_text))
temp_df = pd.DataFrame(data_json["result"]["data"]["rows"])
temp_df.index = temp_df["time"]
del temp_df["time"]
temp_df = temp_df.astype(float, errors="ignore")
return temp_df
def air_quality_rank(date: str = "") -> pd.DataFrame:
"""
真气网-168 城市 AQI 排行榜
https://www.zq12369.com/environment.php?date=2020-03-12&tab=rank&order=DESC&type=DAY#rank
:param date: "": 当前时刻空气质量排名; "20200312": 当日空气质量排名; "202003": 当月空气质量排名; "2019": 当年空气质量排名;
:type date: str
:return: 指定 date 类型的空气质量排名数据
:rtype: pandas.DataFrame
"""
if len(date) == 4:
date = date
elif len(date) == 6:
date = "-".join([date[:4], date[4:6]])
elif date == "":
date = "实时"
else:
date = "-".join([date[:4], date[4:6], date[6:]])
url = "https://www.zq12369.com/environment.php"
if len(date.split("-")) == 3:
params = {
"date": date,
"tab": "rank",
"order": "DESC",
"type": "DAY",
}
r = requests.get(url, params=params)
return pd.read_html(StringIO(r.text))[1].iloc[1:, :]
elif len(date.split("-")) == 2:
params = {
"month": date,
"tab": "rank",
"order": "DESC",
"type": "MONTH",
}
r = requests.get(url, params=params)
return pd.read_html(StringIO(r.text))[2].iloc[1:, :]
elif len(date.split("-")) == 1 and date != "实时":
params = {
"year": date,
"tab": "rank",
"order": "DESC",
"type": "YEAR",
}
r = requests.get(url, params=params)
return pd.read_html(StringIO(r.text))[3].iloc[1:, :]
if date == "实时":
params = {
"tab": "rank",
"order": "DESC",
"type": "MONTH",
}
r = requests.get(url, params=params)
return pd.read_html(StringIO(r.text))[0].iloc[1:, :]
if __name__ == "__main__":
air_city_table_df = air_city_table()
print(air_city_table_df)
air_quality_watch_point_df = air_quality_watch_point(
city="杭州", start_date="20220408", end_date="20220409"
)
print(air_quality_watch_point_df)
air_quality_hist_df = air_quality_hist(
city="北京",
period="day",
start_date="20220801",
end_date="20240402",
)
print(air_quality_hist_df)
air_quality_rank_df = air_quality_rank()
print(air_quality_rank_df)
@@ -0,0 +1,413 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2019/11/25 20:45
Desc: 空气质量接口配置文件
"""
city_chinese_list = [
"北京",
"重庆",
"福州",
"广州",
"杭州",
"昆明",
"南昌",
"南京",
"南宁",
"南通",
"宁波",
"上海",
"深圳",
"苏州",
"徐州",
"银川",
]
city_english_list = [
"beijing",
"chongqing",
"foochow",
"guangzhou",
"hangzhou",
"kunming",
"nanchang",
"nanjing",
"nanning",
"nantong",
"ningbo",
"shanghai",
"shenzhen",
"suzhou",
"xuzhou",
"yinchuan",
]
city_code_dict = {
"北京": "110000",
"天津": "120000",
"石家庄": "130100",
"唐山": "130200",
"秦皇岛": "130300",
"邯郸": "130400",
"邢台": "130500",
"保定": "130600",
"承德": "130800",
"沧州": "130900",
"廊坊": "131000",
"衡水": "131100",
"张家口": "131200",
"太原": "140100",
"大同": "140200",
"阳泉": "140300",
"长治": "140400",
"晋城": "140500",
"朔州": "140600",
"晋中": "140700",
"运城": "140800",
"忻州": "140900",
"临汾": "141000",
"吕梁": "141100",
"呼和浩特": "150100",
"包头": "150200",
"乌海": "150300",
"赤峰": "150400",
"通辽": "150500",
"鄂尔多斯": "150600",
"呼伦贝尔": "150700",
"巴彦淖尔": "150800",
"乌兰察布": "150900",
"兴安盟": "152200",
"锡林郭勒盟": "152500",
"阿拉善盟": "152900",
"沈阳": "210100",
"大连": "210200",
"瓦房店": "210281",
"鞍山": "210300",
"抚顺": "210400",
"本溪": "210500",
"丹东": "210600",
"锦州": "210700",
"营口": "210800",
"阜新": "210900",
"辽阳": "211000",
"盘锦": "211100",
"铁岭": "211200",
"朝阳": "211300",
"葫芦岛": "211400",
"长春": "220100",
"吉林": "220200",
"四平": "220300",
"辽源": "220400",
"通化": "220500",
"白山": "220600",
"松原": "220700",
"白城": "220800",
"延边州": "222400",
"哈尔滨": "230100",
"齐齐哈尔": "230200",
"鸡西": "230300",
"鹤岗": "230400",
"双鸭山": "230500",
"大庆": "230600",
"伊春": "230700",
"佳木斯": "230800",
"七台河": "230900",
"牡丹江": "231000",
"黑河": "231100",
"绥化": "231200",
"大兴安岭地区": "232700",
"上海": "310000",
"南京": "320100",
"无锡": "320200",
"江阴": "320281",
"宜兴": "320282",
"徐州": "320300",
"常州": "320400",
"溧阳": "320481",
"金坛": "320482",
"苏州": "320500",
"常熟": "320581",
"张家港": "320582",
"昆山": "320583",
"吴江": "320584",
"太仓": "320585",
"南通": "320600",
"海门": "320684",
"连云港": "320700",
"淮安": "320800",
"盐城": "320900",
"扬州": "321000",
"镇江": "321100",
"句容": "321183",
"泰州": "321200",
"宿迁": "321300",
"杭州": "330100",
"富阳": "330183",
"临安": "330185",
"宁波": "330200",
"温州": "330300",
"嘉兴": "330400",
"湖州": "330500",
"诸暨": "330681",
"金华": "330700",
"义乌": "330782",
"衢州": "330800",
"舟山": "330900",
"台州": "331000",
"丽水": "331100",
"绍兴": "331300",
"合肥": "340100",
"芜湖": "340200",
"蚌埠": "340300",
"淮南": "340400",
"马鞍山": "340500",
"淮北": "340600",
"铜陵": "340700",
"安庆": "340800",
"黄山": "341000",
"滁州": "341100",
"阜阳": "341200",
"宿州": "341300",
"六安": "341500",
"亳州": "341600",
"池州": "341700",
"宣城": "341800",
"福州": "350100",
"厦门": "350200",
"莆田": "350300",
"三明": "350400",
"泉州": "350500",
"漳州": "350600",
"南平": "350700",
"龙岩": "350800",
"宁德": "350900",
"南昌": "360100",
"景德镇": "360200",
"萍乡": "360300",
"九江": "360400",
"新余": "360500",
"鹰潭": "360600",
"赣州": "360700",
"吉安": "360800",
"宜春": "360900",
"抚州": "361000",
"上饶": "361100",
"济南": "370100",
"章丘": "370181",
"青岛": "370200",
"胶州": "370281",
"即墨": "370282",
"平度": "370283",
"胶南": "370284",
"莱西": "370285",
"淄博": "370300",
"枣庄": "370400",
"东营": "370500",
"烟台": "370600",
"莱州": "370683",
"蓬莱": "370684",
"招远": "370685",
"潍坊": "370700",
"寿光": "370783",
"济宁": "370800",
"泰安": "370900",
"威海": "371000",
"文登": "371081",
"荣成": "371082",
"乳山": "371083",
"日照": "371100",
"莱芜": "371200",
"临沂": "371300",
"德州": "371400",
"聊城": "371500",
"滨州": "371600",
"菏泽": "371700",
"郑州": "410100",
"开封": "410200",
"洛阳": "410300",
"平顶山": "410400",
"安阳": "410500",
"鹤壁": "410600",
"新乡": "410700",
"焦作": "410800",
"濮阳": "410900",
"许昌": "411000",
"漯河": "411100",
"三门峡": "411200",
"南阳": "411300",
"商丘": "411400",
"信阳": "411500",
"周口": "411600",
"驻马店": "411700",
"武汉": "420100",
"黄石": "420200",
"十堰": "420300",
"宜昌": "420500",
"襄阳": "420600",
"鄂州": "420700",
"荆门": "420800",
"孝感": "420900",
"荆州": "421000",
"黄冈": "421100",
"咸宁": "421200",
"随州": "421300",
"恩施州": "422800",
"长沙": "430100",
"株洲": "430200",
"湘潭": "430300",
"衡阳": "430400",
"邵阳": "430500",
"岳阳": "430600",
"常德": "430700",
"张家界": "430800",
"益阳": "430900",
"郴州": "431000",
"永州": "431100",
"怀化": "431200",
"娄底": "431300",
"湘西州": "433100",
"广州": "440100",
"韶关": "440200",
"深圳": "440300",
"珠海": "440400",
"汕头": "440500",
"佛山": "440600",
"江门": "440700",
"湛江": "440800",
"茂名": "440900",
"肇庆": "441200",
"惠州": "441300",
"梅州": "441400",
"汕尾": "441500",
"河源": "441600",
"阳江": "441700",
"清远": "441800",
"东莞": "441900",
"中山": "442000",
"潮州": "445100",
"揭阳": "445200",
"云浮": "445300",
"南宁": "450100",
"柳州": "450200",
"桂林": "450300",
"梧州": "450400",
"北海": "450500",
"防城港": "450600",
"钦州": "450700",
"贵港": "450800",
"玉林": "450900",
"百色": "451000",
"贺州": "451100",
"河池": "451200",
"来宾": "451300",
"崇左": "451400",
"海口": "460100",
"三亚": "460200",
"重庆": "500000",
"成都": "510100",
"自贡": "510300",
"攀枝花": "510400",
"泸州": "510500",
"德阳": "510600",
"绵阳": "510700",
"广元": "510800",
"遂宁": "510900",
"内江": "511000",
"乐山": "511100",
"南充": "511300",
"眉山": "511400",
"宜宾": "511500",
"广安": "511600",
"达州": "511700",
"雅安": "511800",
"巴中": "511900",
"资阳": "512000",
"阿坝州": "513200",
"甘孜州": "513300",
"凉山州": "513400",
"贵阳": "520100",
"六盘水": "520200",
"遵义": "520300",
"安顺": "520400",
"铜仁地区": "522200",
"黔西南州": "522300",
"毕节": "522400",
"黔东南州": "522600",
"黔南州": "522700",
"昆明": "530100",
"曲靖": "530300",
"玉溪": "530400",
"保山": "530500",
"昭通": "530600",
"丽江": "530700",
"普洱": "530800",
"临沧": "530900",
"红河州": "532522",
"文山州": "532621",
"西双版纳州": "532801",
"大理州": "532901",
"德宏州": "533103",
"怒江州": "533300",
"迪庆州": "533421",
"拉萨": "540100",
"昌都": "542100",
"山南": "542200",
"日喀则": "542300",
"那曲地区": "542400",
"阿里地区": "542500",
"林芝": "542600",
"西安": "610100",
"铜川": "610200",
"宝鸡": "610300",
"咸阳": "610400",
"渭南": "610500",
"延安": "610600",
"汉中": "610700",
"榆林": "610800",
"安康": "610900",
"商洛": "611000",
"兰州": "620100",
"嘉峪关": "620200",
"金昌": "620300",
"白银": "620400",
"天水": "620500",
"武威": "620600",
"张掖": "620700",
"平凉": "620800",
"酒泉": "620900",
"庆阳": "621000",
"定西": "621100",
"陇南": "621200",
"临夏州": "622900",
"甘南州": "623000",
"西宁": "630100",
"海东地区": "632100",
"海北州": "632200",
"黄南州": "632300",
"海南州": "632500",
"果洛州": "632600",
"玉树州": "632700",
"海西州": "632800",
"银川": "640100",
"石嘴山": "640200",
"吴忠": "640300",
"固原": "640400",
"中卫": "640500",
"乌鲁木齐": "650100",
"克拉玛依": "650200",
"吐鲁番地区": "652100",
"哈密地区": "652200",
"昌吉州": "652300",
"博州": "652700",
"库尔勒": "652800",
"阿克苏地区": "652900",
"克州": "653000",
"喀什地区": "653100",
"和田地区": "653200",
"伊犁哈萨克州": "654000",
"塔城地区": "654200",
"阿勒泰地区": "654300",
"石河子": "659001",
"五家渠": "659004",
}
@@ -0,0 +1,139 @@
function Base64() {
_keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", this.encode = function(a) {
var c, d, e, f, g, h, i, b = "",
j = 0;
for (a = _utf8_encode(a); j < a.length;) c = a.charCodeAt(j++), d = a.charCodeAt(j++), e = a.charCodeAt(j++), f = c >> 2, g = (3 & c) << 4 | d >> 4, h = (15 & d) << 2 | e >> 6, i = 63 & e, isNaN(d) ? h = i = 64 : isNaN(e) && (i = 64), b = b + _keyStr.charAt(f) + _keyStr.charAt(g) + _keyStr.charAt(h) + _keyStr.charAt(i);
return b
}, this.decode = function(a) {
var c, d, e, f, g, h, i, b = "",
j = 0;
for (a = a.replace(/[^A-Za-z0-9\+\/\=]/g, ""); j < a.length;) f = _keyStr.indexOf(a.charAt(j++)), g = _keyStr.indexOf(a.charAt(j++)), h = _keyStr.indexOf(a.charAt(j++)), i = _keyStr.indexOf(a.charAt(j++)), c = f << 2 | g >> 4, d = (15 & g) << 4 | h >> 2, e = (3 & h) << 6 | i, b += String.fromCharCode(c), 64 != h && (b += String.fromCharCode(d)), 64 != i && (b += String.fromCharCode(e));
return b = _utf8_decode(b)
}, _utf8_encode = function(a) {
var b, c, d;
for (a = a.replace(/\r\n/g, "\n"), b = "", c = 0; c < a.length; c++) d = a.charCodeAt(c), 128 > d ? b += String.fromCharCode(d) : d > 127 && 2048 > d ? (b += String.fromCharCode(192 | d >> 6), b += String.fromCharCode(128 | 63 & d)) : (b += String.fromCharCode(224 | d >> 12), b += String.fromCharCode(128 | 63 & d >> 6), b += String.fromCharCode(128 | 63 & d));
return b
}, _utf8_decode = function(a) {
for (var b = "", c = 0, d = c1 = c2 = 0; c < a.length;) d = a.charCodeAt(c), 128 > d ? (b += String.fromCharCode(d), c++) : d > 191 && 224 > d ? (c2 = a.charCodeAt(c + 1), b += String.fromCharCode((31 & d) << 6 | 63 & c2), c += 2) : (c2 = a.charCodeAt(c + 1), c3 = a.charCodeAt(c + 2), b += String.fromCharCode((15 & d) << 12 | (63 & c2) << 6 | 63 & c3), c += 3);
return b
}
}
function hex_md5(a) {
return binl2hex(core_md5(str2binl(a), a.length * chrsz))
}
function b64_md5(a) {
return binl2b64(core_md5(str2binl(a), a.length * chrsz))
}
function str_md5(a) {
return binl2str(core_md5(str2binl(a), a.length * chrsz))
}
function hex_hmac_md5(a, b) {
return binl2hex(core_hmac_md5(a, b))
}
function b64_hmac_md5(a, b) {
return binl2b64(core_hmac_md5(a, b))
}
function str_hmac_md5(a, b) {
return binl2str(core_hmac_md5(a, b))
}
function md5_vm_test() {
return "900150983cd24fb0d6963f7d28e17f72" == hex_md5("abc")
}
function core_md5(a, b) {
var c, d, e, f, g, h, i, j, k;
for (a[b >> 5] |= 128 << b % 32, a[(b + 64 >>> 9 << 4) + 14] = b, c = 1732584193, d = -271733879, e = -1732584194, f = 271733878, g = 0; g < a.length; g += 16) h = c, i = d, j = e, k = f, c = md5_ff(c, d, e, f, a[g + 0], 7, -680876936), f = md5_ff(f, c, d, e, a[g + 1], 12, -389564586), e = md5_ff(e, f, c, d, a[g + 2], 17, 606105819), d = md5_ff(d, e, f, c, a[g + 3], 22, -1044525330), c = md5_ff(c, d, e, f, a[g + 4], 7, -176418897), f = md5_ff(f, c, d, e, a[g + 5], 12, 1200080426), e = md5_ff(e, f, c, d, a[g + 6], 17, -1473231341), d = md5_ff(d, e, f, c, a[g + 7], 22, -45705983), c = md5_ff(c, d, e, f, a[g + 8], 7, 1770035416), f = md5_ff(f, c, d, e, a[g + 9], 12, -1958414417), e = md5_ff(e, f, c, d, a[g + 10], 17, -42063), d = md5_ff(d, e, f, c, a[g + 11], 22, -1990404162), c = md5_ff(c, d, e, f, a[g + 12], 7, 1804603682), f = md5_ff(f, c, d, e, a[g + 13], 12, -40341101), e = md5_ff(e, f, c, d, a[g + 14], 17, -1502002290), d = md5_ff(d, e, f, c, a[g + 15], 22, 1236535329), c = md5_gg(c, d, e, f, a[g + 1], 5, -165796510), f = md5_gg(f, c, d, e, a[g + 6], 9, -1069501632), e = md5_gg(e, f, c, d, a[g + 11], 14, 643717713), d = md5_gg(d, e, f, c, a[g + 0], 20, -373897302), c = md5_gg(c, d, e, f, a[g + 5], 5, -701558691), f = md5_gg(f, c, d, e, a[g + 10], 9, 38016083), e = md5_gg(e, f, c, d, a[g + 15], 14, -660478335), d = md5_gg(d, e, f, c, a[g + 4], 20, -405537848), c = md5_gg(c, d, e, f, a[g + 9], 5, 568446438), f = md5_gg(f, c, d, e, a[g + 14], 9, -1019803690), e = md5_gg(e, f, c, d, a[g + 3], 14, -187363961), d = md5_gg(d, e, f, c, a[g + 8], 20, 1163531501), c = md5_gg(c, d, e, f, a[g + 13], 5, -1444681467), f = md5_gg(f, c, d, e, a[g + 2], 9, -51403784), e = md5_gg(e, f, c, d, a[g + 7], 14, 1735328473), d = md5_gg(d, e, f, c, a[g + 12], 20, -1926607734), c = md5_hh(c, d, e, f, a[g + 5], 4, -378558), f = md5_hh(f, c, d, e, a[g + 8], 11, -2022574463), e = md5_hh(e, f, c, d, a[g + 11], 16, 1839030562), d = md5_hh(d, e, f, c, a[g + 14], 23, -35309556), c = md5_hh(c, d, e, f, a[g + 1], 4, -1530992060), f = md5_hh(f, c, d, e, a[g + 4], 11, 1272893353), e = md5_hh(e, f, c, d, a[g + 7], 16, -155497632), d = md5_hh(d, e, f, c, a[g + 10], 23, -1094730640), c = md5_hh(c, d, e, f, a[g + 13], 4, 681279174), f = md5_hh(f, c, d, e, a[g + 0], 11, -358537222), e = md5_hh(e, f, c, d, a[g + 3], 16, -722521979), d = md5_hh(d, e, f, c, a[g + 6], 23, 76029189), c = md5_hh(c, d, e, f, a[g + 9], 4, -640364487), f = md5_hh(f, c, d, e, a[g + 12], 11, -421815835), e = md5_hh(e, f, c, d, a[g + 15], 16, 530742520), d = md5_hh(d, e, f, c, a[g + 2], 23, -995338651), c = md5_ii(c, d, e, f, a[g + 0], 6, -198630844), f = md5_ii(f, c, d, e, a[g + 7], 10, 1126891415), e = md5_ii(e, f, c, d, a[g + 14], 15, -1416354905), d = md5_ii(d, e, f, c, a[g + 5], 21, -57434055), c = md5_ii(c, d, e, f, a[g + 12], 6, 1700485571), f = md5_ii(f, c, d, e, a[g + 3], 10, -1894986606), e = md5_ii(e, f, c, d, a[g + 10], 15, -1051523), d = md5_ii(d, e, f, c, a[g + 1], 21, -2054922799), c = md5_ii(c, d, e, f, a[g + 8], 6, 1873313359), f = md5_ii(f, c, d, e, a[g + 15], 10, -30611744), e = md5_ii(e, f, c, d, a[g + 6], 15, -1560198380), d = md5_ii(d, e, f, c, a[g + 13], 21, 1309151649), c = md5_ii(c, d, e, f, a[g + 4], 6, -145523070), f = md5_ii(f, c, d, e, a[g + 11], 10, -1120210379), e = md5_ii(e, f, c, d, a[g + 2], 15, 718787259), d = md5_ii(d, e, f, c, a[g + 9], 21, -343485551), c = safe_add(c, h), d = safe_add(d, i), e = safe_add(e, j), f = safe_add(f, k);
return Array(c, d, e, f)
}
function md5_cmn(a, b, c, d, e, f) {
return safe_add(bit_rol(safe_add(safe_add(b, a), safe_add(d, f)), e), c)
}
function md5_ff(a, b, c, d, e, f, g) {
return md5_cmn(b & c | ~b & d, a, b, e, f, g)
}
function md5_gg(a, b, c, d, e, f, g) {
return md5_cmn(b & d | c & ~d, a, b, e, f, g)
}
function md5_hh(a, b, c, d, e, f, g) {
return md5_cmn(b ^ c ^ d, a, b, e, f, g)
}
function md5_ii(a, b, c, d, e, f, g) {
return md5_cmn(c ^ (b | ~d), a, b, e, f, g)
}
function core_hmac_md5(a, b) {
var d, e, f, g, c = str2binl(a);
for (c.length > 16 && (c = core_md5(c, a.length * chrsz)), d = Array(16), e = Array(16), f = 0; 16 > f; f++) d[f] = 909522486 ^ c[f], e[f] = 1549556828 ^ c[f];
return g = core_md5(d.concat(str2binl(b)), 512 + b.length * chrsz), core_md5(e.concat(g), 640)
}
function safe_add(a, b) {
var c = (65535 & a) + (65535 & b),
d = (a >> 16) + (b >> 16) + (c >> 16);
return d << 16 | 65535 & c
}
function bit_rol(a, b) {
return a << b | a >>> 32 - b
}
function str2binl(a) {
var d, b = Array(),
c = (1 << chrsz) - 1;
for (d = 0; d < a.length * chrsz; d += chrsz) b[d >> 5] |= (a.charCodeAt(d / chrsz) & c) << d % 32;
return b
}
function binl2str(a) {
var d, b = "",
c = (1 << chrsz) - 1;
for (d = 0; d < 32 * a.length; d += chrsz) b += String.fromCharCode(a[d >> 5] >>> d % 32 & c);
return b
}
function binl2hex(a) {
var d, b = hexcase ? "0123456789ABCDEF" : "0123456789abcdef",
c = "";
for (d = 0; d < 4 * a.length; d++) c += b.charAt(15 & a[d >> 2] >> 8 * (d % 4) + 4) + b.charAt(15 & a[d >> 2] >> 8 * (d % 4));
return c
}
function binl2b64(a) {
var d, e, f, b = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
c = "";
for (d = 0; d < 4 * a.length; d += 3)
for (e = (255 & a[d >> 2] >> 8 * (d % 4)) << 16 | (255 & a[d + 1 >> 2] >> 8 * ((d + 1) % 4)) << 8 | 255 & a[d + 2 >> 2] >> 8 * ((d + 2) % 4), f = 0; 4 > f; f++) c += 8 * d + 6 * f > 32 * a.length ? b64pad : b.charAt(63 & e >> 6 * (3 - f));
return c
}
function encode_param(a) {
var b = new Base64;
return b.encode(a)
}
function encode_secret() {
var b, a = appId;
for (b = 0; b < arguments.length; b++) a += arguments[b];
return a = a.replace(/\s/g, ""), hex_md5(a)
}
function decode_result(a) {
var b = new Base64;
return b.decode(b.decode(b.decode(a)))
}
var hexcase = 0,
b64pad = "",
chrsz = 8,
appId = "a01901d3caba1f362d69474674ce477f";
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,112 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2024/4/29 16:00
Desc: 日出和日落数据
https://www.timeanddate.com
"""
from io import StringIO
import pandas as pd
import requests
def sunrise_city_list() -> list:
"""
查询日出与日落数据的城市列表
https://www.timeanddate.com/astronomy/china
:return: 所有可以获取的数据的城市列表
:rtype: list
"""
url = "https://www.timeanddate.com/astronomy/china"
r = requests.get(url)
city_list = []
china_city_one_df = pd.read_html(StringIO(r.text))[1]
china_city_two_df = pd.read_html(StringIO(r.text))[2]
city_list.extend([item.lower() for item in china_city_one_df.iloc[:, 0].tolist()])
city_list.extend([item.lower() for item in china_city_one_df.iloc[:, 3].tolist()])
city_list.extend([item.lower() for item in china_city_one_df.iloc[:, 6].tolist()])
city_list.extend([item.lower() for item in china_city_two_df.iloc[:, 0].tolist()])
city_list.extend([item.lower() for item in china_city_two_df.iloc[:, 1].tolist()])
city_list.extend([item.lower() for item in china_city_two_df.iloc[:, 2].tolist()])
city_list.extend([item.lower() for item in china_city_two_df.iloc[:, 3].tolist()])
city_list.extend(
[item.lower() for item in china_city_two_df.iloc[:, 4].dropna().tolist()]
)
return city_list
def sunrise_daily(date: str = "20240428", city: str = "beijing") -> pd.DataFrame:
"""
每日日出日落数据
https://www.timeanddate.com/astronomy/china/shaoxing
:param date: 需要查询的日期, e.g., “20200428”
:type date: str
:param city: 需要查询的城市; 注意输入的格式, e.g., "北京", "上海"
:type city: str
:return: 返回指定日期指定地区的日出日落数据
:rtype: pandas.DataFrame
"""
import urllib3
urllib3.disable_warnings()
if city in sunrise_city_list():
year = date[:4]
month = date[4:6]
url = f"https://www.timeanddate.com/sun/china/{city}?month={month}&year={year}"
r = requests.get(url, verify=False)
table = pd.read_html(StringIO(r.text), header=2)[1]
month_df = table.iloc[:-1,]
day_df = month_df[
month_df.iloc[:, 0].astype(str).str.zfill(2) == date[6:]
].copy()
day_df.index = pd.to_datetime([date] * len(day_df), format="%Y%m%d")
day_df.reset_index(inplace=True)
day_df.rename(columns={"index": "date"}, inplace=True)
day_df["date"] = pd.to_datetime(day_df["date"]).dt.date
return day_df
else:
raise "请输入正确的城市名称"
def sunrise_monthly(date: str = "20240428", city: str = "beijing") -> pd.DataFrame:
"""
每个指定 date 所在月份的每日日出日落数据, 如果当前月份未到月底, 则以预测值填充
https://www.timeanddate.com/astronomy/china/shaoxing
:param date: 需要查询的日期, 这里用来指定 date 所在的月份; e.g., “20200428”
:type date: str
:param city: 需要查询的城市; 注意输入的格式, e.g., "北京", "上海"
:type city: str
:return: 指定 date 所在月份的每日日出日落数据
:rtype: pandas.DataFrame
"""
import urllib3
urllib3.disable_warnings()
if city in sunrise_city_list():
year = date[:4]
month = date[4:6]
url = f"https://www.timeanddate.com/sun/china/{city}?month={month}&year={year}"
r = requests.get(url)
table = pd.read_html(StringIO(r.text), header=2)[1]
month_df = table.iloc[:-1,].copy()
month_df.index = [date[:-2]] * len(month_df)
month_df.reset_index(inplace=True)
month_df.rename(
columns={
"index": "date",
},
inplace=True,
)
return month_df
else:
raise "请输入正确的城市名称"
if __name__ == "__main__":
sunrise_daily_df = sunrise_daily(date="20240428", city="beijing")
print(sunrise_daily_df)
sunrise_monthly_df = sunrise_monthly(date="20240428", city="beijing")
print(sunrise_monthly_df)
@@ -0,0 +1,6 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2019/11/12 14:51
Desc:
"""
@@ -0,0 +1,12 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2019/11/14 20:32
Desc: 学术板块配置文件
"""
# EPU
epu_home_url = "http://www.policyuncertainty.com/index.html"
# FF-Factor
ff_home_url = "http://mba.tuck.dartmouth.edu/pages/faculty/ken.french/data_library.html"
@@ -0,0 +1,60 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2024/1/20 22:00
Desc: 经济政策不确定性指数
https://www.policyuncertainty.com/index.html
"""
import pandas as pd
def article_epu_index(symbol: str = "China") -> pd.DataFrame:
"""
经济政策不确定性指数
https://www.policyuncertainty.com/index.html
:param symbol: 指定的国家名称, e.g. “China”
:type symbol: str
:return: 经济政策不确定性指数数据
:rtype: pandas.DataFrame
"""
# 切勿修改 http 否则会读取不到 csv 文件
if symbol == "China New":
symbol = "SCMP_China"
if symbol == "China":
symbol = "SCMP_China"
if symbol == "USA":
symbol = "US"
if symbol == "Hong Kong":
symbol = "HK"
epu_df = pd.read_excel(
io=f"http://www.policyuncertainty.com/media/{symbol}_EPU_Data_Annotated.xlsx",
engine="openpyxl",
)
return epu_df
if symbol in ["Germany", "France", "Italy"]: # 欧洲
symbol = "Europe"
if symbol == "South Korea":
symbol = "Korea"
if symbol == "Spain New":
symbol = "Spain"
if symbol in ["Ireland", "Chile", "Colombia", "Netherlands", "Singapore", "Sweden"]:
epu_df = pd.read_excel(
io=f"http://www.policyuncertainty.com/media/{symbol}_Policy_Uncertainty_Data.xlsx",
engine="openpyxl",
)
return epu_df
if symbol == "Greece":
epu_df = pd.read_excel(
io=f"http://www.policyuncertainty.com/media/FKT_{symbol}_Policy_Uncertainty_Data.xlsx",
engine="openpyxl",
)
return epu_df
url = f"http://www.policyuncertainty.com/media/{symbol}_Policy_Uncertainty_Data.csv"
epu_df = pd.read_csv(url)
return epu_df
if __name__ == "__main__":
article_epu_index_df = article_epu_index(symbol="China")
print(article_epu_index_df)
@@ -0,0 +1,166 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2024/1/20 22:30
Desc: FF-data-library
https://mba.tuck.dartmouth.edu/pages/faculty/ken.french/data_library.html
"""
from io import StringIO
import pandas as pd
import requests
from akshare.article.cons import ff_home_url
def article_ff_crr() -> pd.DataFrame:
"""
FF多因子模型
https://mba.tuck.dartmouth.edu/pages/faculty/ken.french/data_library.html
:return: FF多因子模型单一表格
:rtype: pandas.DataFrame
"""
res = requests.get(ff_home_url)
# first table
list_index = (
pd.read_html(StringIO(res.text), header=0, index_col=0)[4]
.iloc[2, :]
.index.tolist()
)
list_0 = [
item
for item in pd.read_html(StringIO(res.text), header=0, index_col=0)[4]
.iloc[0, :]
.iloc[0]
.split(" ")
if item != ""
]
list_1 = [
item
for item in pd.read_html(StringIO(res.text), header=0, index_col=0)[4]
.iloc[0, :]
.iloc[1]
.split(" ")
if item != ""
]
list_2 = [
item
for item in pd.read_html(StringIO(res.text), header=0, index_col=0)[4]
.iloc[0, :]
.iloc[2]
.split(" ")
if item != ""
]
list_0.insert(0, "-")
list_1.insert(0, "-")
list_2.insert(0, "-")
temp_columns = (
pd.read_html(StringIO(res.text), header=0)[4]
.iloc[:, 0]
.str.split(" ", expand=True)
.T[0]
.dropna()
.tolist()
)
table_one = pd.DataFrame(
[list_0, list_1, list_2], index=list_index, columns=temp_columns
).T
# second table
list_index = (
pd.read_html(StringIO(res.text), header=0, index_col=0)[4]
.iloc[1, :]
.index.tolist()
)
list_0 = [
item
for item in pd.read_html(StringIO(res.text), header=0, index_col=0)[4]
.iloc[1, :]
.iloc[0]
.split(" ")
if item != ""
]
list_1 = [
item
for item in pd.read_html(StringIO(res.text), header=0, index_col=0)[4]
.iloc[1, :]
.iloc[1]
.split(" ")
if item != ""
]
list_2 = [
item
for item in pd.read_html(StringIO(res.text), header=0, index_col=0)[4]
.iloc[1, :]
.iloc[2]
.split(" ")
if item != ""
]
list_0.insert(0, "-")
list_1.insert(0, "-")
list_2.insert(0, "-")
temp_columns = (
pd.read_html(StringIO(res.text), header=0)[4]
.iloc[:, 0]
.str.split(" ", expand=True)
.T[1]
.dropna()
.tolist()
)
table_two = pd.DataFrame(
[list_0, list_1, list_2], index=list_index, columns=temp_columns
).T
# third table
df = pd.read_html(StringIO(res.text), header=0, index_col=0)[4].iloc[2, :]
name_list = (
pd.read_html(StringIO(res.text), header=0)[4]
.iloc[:, 0]
.str.split(r" ", expand=True)
.iloc[2, :]
.tolist()
)
value_list_0 = df.iloc[0].split(" ")
value_list_0.insert(0, "-")
value_list_0.insert(1, "-")
value_list_0.insert(8, "-")
value_list_0.insert(15, "-")
value_list_1 = df.iloc[1].split(" ")
value_list_1.insert(0, "-")
value_list_1.insert(1, "-")
value_list_1.insert(8, "-")
value_list_1.insert(15, "-")
value_list_2 = df.iloc[2].split(" ")
value_list_2.insert(0, "-")
value_list_2.insert(1, "-")
value_list_2.insert(8, "-")
value_list_2.insert(15, "-")
name_list.remove("Small Growth Big Value")
name_list.insert(5, "Small Growth")
name_list.insert(6, "Big Value")
temp_list = [item for item in name_list if "Portfolios" not in item]
temp_list.insert(0, "Fama/French Research Portfolios")
temp_list.insert(1, "Size and Book-to-Market Portfolios")
temp_list.insert(8, "Size and Operating Profitability Portfolios")
temp_list.insert(15, "Size and Investment Portfolios")
temp_df = pd.DataFrame([temp_list, value_list_0, value_list_1, value_list_2]).T
temp_df.index = temp_df.iloc[:, 0]
temp_df = temp_df.iloc[:, 1:]
# concat
all_df = pd.DataFrame()
all_df = pd.concat([all_df, table_one])
all_df = pd.concat([all_df, table_two])
temp_df.columns = table_two.columns
all_df = pd.concat([all_df, temp_df])
all_df.reset_index(inplace=True)
all_df.rename(columns={"index": "item"}, inplace=True)
return all_df
if __name__ == "__main__":
article_ff_crr_df = article_ff_crr()
print(article_ff_crr_df)
@@ -0,0 +1,46 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2020/4/10 19:58
Desc: Economic Research from Federal Reserve Bank of St. Louis
https://research.stlouisfed.org/econ/mccracken/fred-databases/
FRED-MD and FRED-QD are large macroeconomic databases designed for the empirical analysis of “big data.” The datasets of monthly and quarterly observations mimic the coverage of datasets already used in the literature, but they add three appealing features. They are updated in real-time through the FRED database. They are publicly accessible, facilitating the replication of empirical work. And they relieve the researcher of the task of incorporating data changes and revisions (a task accomplished by the data desk at the Federal Reserve Bank of St. Louis).
"""
import pandas as pd
def fred_md(date: str = "2020-01") -> pd.DataFrame:
"""
The accompanying paper shows that factors extracted from the FRED-MD dataset share the same predictive content as those based on the various vintages of the so-called Stock-Watson data. In addition, it suggests that diffusion indexes constructed as the partial sum of the factor estimates can potentially be useful for the study of business cycle chronology.
:param date: e.g., "2020-03"; from "2015-01" to now
:type date: str
:return: Monthly Data
:rtype: pandas.DataFrame
"""
url = (
f"https://s3.amazonaws.com/files.fred.stlouisfed.org/fred-md/monthly/{date}.csv"
)
temp_df = pd.read_csv(url)
return temp_df
def fred_qd(date: str = "2020-01") -> pd.DataFrame:
"""
FRED-QD is a quarterly frequency companion to FRED-MD. It is designed to emulate the dataset used in "Disentangling the Channels of the 2007-2009 Recession" by Stock and Watson (2012, NBER WP No. 18094) but also contains several additional series. Comments or suggestions are welcome.
:param date: e.g., "2020-03"; from "2015-01" to now
:type date: str
:return: Quarterly Data
:rtype: pandas.DataFrame
"""
url = f"https://s3.amazonaws.com/files.fred.stlouisfed.org/fred-md/quarterly/{date}.csv"
temp_df = pd.read_csv(url)
return temp_df
if __name__ == "__main__":
fred_md_df = fred_md(date="2023-03")
print(fred_md_df)
fred_qd_df = fred_qd(date="2023-03")
print(fred_qd_df)
@@ -0,0 +1,191 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2024/1/20 20:51
Desc: 修大成主页-Risk Lab-Realized Volatility; Oxford-Man Institute of Quantitative Finance Realized Library
"""
import json
import pandas as pd
import requests
import urllib3
from bs4 import BeautifulSoup
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
def article_oman_rv(symbol: str = "FTSE", index: str = "rk_th2") -> pd.DataFrame:
"""
Oxford-Man Institute of Quantitative Finance Realized Library 的数据
:param symbol: str ['AEX', 'AORD', 'BFX', 'BSESN', 'BVLG', 'BVSP', 'DJI', 'FCHI', 'FTMIB', 'FTSE', 'GDAXI', 'GSPTSE', 'HSI', 'IBEX', 'IXIC', 'KS11', 'KSE', 'MXX', 'N225', 'NSEI', 'OMXC20', 'OMXHPI', 'OMXSPI', 'OSEAX', 'RUT', 'SMSI', 'SPX', 'SSEC', 'SSMI', 'STI', 'STOXX50E']
:param index: str 指标 ['medrv', 'rk_twoscale', 'bv', 'rv10', 'rv5', 'rk_th2', 'rv10_ss', 'rsv', 'rv5_ss', 'bv_ss', 'rk_parzen', 'rsv_ss']
:return: pandas.DataFrame
The Oxford-Man Institute's "realised library" contains daily non-parametric measures of how volatility financial assets or indexes were in the past. Each day's volatility measure depends solely on financial data from that day. They are driven by the use of the latest innovations in econometric modelling and theory to design them, while we draw our high frequency data from the Thomson Reuters DataScope Tick History database. Realised measures are not volatility forecasts. However, some researchers use these measures as an input into forecasting models. The aim of this line of research is to make financial markets more transparent by exposing how volatility changes through time.
This Library is used as the basis of some of our own research, which effects its scope, and is made available here to encourage the more widespread exploitation of these methods. It is given 'as is' and solely for informational purposes, please read the disclaimer.
The volatility data can be visually explored. We make the complete up-to-date dataset available for download. Lists of assets covered and realized measures available are also available.
| Symbol | Name | Earliest Available | Latest Available |
|-----------|-------------------------------------------|--------------------|-------------------|
| .AEX | AEX index | January 03, 2000 | November 28, 2019 |
| .AORD | All Ordinaries | January 04, 2000 | November 28, 2019 |
| .BFX | Bell 20 Index | January 03, 2000 | November 28, 2019 |
| .BSESN | S&P BSE Sensex | January 03, 2000 | November 28, 2019 |
| .BVLG | PSI All-Share Index | October 15, 2012 | November 28, 2019 |
| .BVSP | BVSP BOVESPA Index | January 03, 2000 | November 28, 2019 |
| .DJI | Dow Jones Industrial Average | January 03, 2000 | November 27, 2019 |
| .FCHI | CAC 40 | January 03, 2000 | November 28, 2019 |
| .FTMIB | FTSE MIB | June 01, 2009 | November 28, 2019 |
| .FTSE | FTSE 100 | January 04, 2000 | November 28, 2019 |
| .GDAXI | DAX | January 03, 2000 | November 28, 2019 |
| .GSPTSE | S&P/TSX Composite index | May 02, 2002 | November 28, 2019 |
| .HSI | HANG SENG Index | January 03, 2000 | November 28, 2019 |
| .IBEX | IBEX 35 Index | January 03, 2000 | November 28, 2019 |
| .IXIC | Nasdaq 100 | January 03, 2000 | November 27, 2019 |
| .KS11 | Korea Composite Stock Price Index (KOSPI) | January 04, 2000 | November 28, 2019 |
| .KSE | Karachi SE 100 Index | January 03, 2000 | November 28, 2019 |
| .MXX | IPC Mexico | January 03, 2000 | November 28, 2019 |
| .N225 | Nikkei 225 | February 02, 2000 | November 28, 2019 |
| .NSEI | NIFTY 50 | January 03, 2000 | November 28, 2019 |
| .OMXC20 | OMX Copenhagen 20 Index | October 03, 2005 | November 28, 2019 |
| .OMXHPI | OMX Helsinki All Share Index | October 03, 2005 | November 28, 2019 |
| .OMXSPI | OMX Stockholm All Share Index | October 03, 2005 | November 28, 2019 |
| .OSEAX | Oslo Exchange All-share Index | September 03, 2001 | November 28, 2019 |
| .RUT | Russel 2000 | January 03, 2000 | November 27, 2019 |
| .SMSI | Madrid General Index | July 04, 2005 | November 28, 2019 |
| .SPX | S&P 500 Index | January 03, 2000 | November 27, 2019 |
| .SSEC | Shanghai Composite Index | January 04, 2000 | November 28, 2019 |
| .SSMI | Swiss Stock Market Index | January 04, 2000 | November 28, 2019 |
| .STI | Straits Times Index | January 03, 2000 | November 28, 2019 |
| .STOXX50E | EURO STOXX 50 | January 03, 2000 | November 28, 2019 |
"""
url = "https://realized.oxford-man.ox.ac.uk/theme/js/visualization-data.js?20191111113154"
res = requests.get(url)
soup = BeautifulSoup(res.text, "lxml")
soup_text = soup.find("p").get_text()
data_json = json.loads(soup_text[soup_text.find("{") : soup_text.rfind("};") + 1])
date_list = data_json[f".{symbol}"]["dates"]
temp_df = pd.DataFrame([date_list, data_json[f".{symbol}"][index]["data"]]).T
temp_df.index = pd.to_datetime(temp_df.iloc[:, 0], unit="ms")
temp_df = temp_df.iloc[:, 1]
temp_df.index.name = "date"
temp_df.name = f"{symbol}-{index}"
return temp_df
def article_oman_rv_short(symbol: str = "FTSE") -> pd.DataFrame:
"""
Oxford-Man Institute of Quantitative Finance Realized Library 的数据
:param symbol: str FTSE: FTSE 100, GDAXI: DAX, RUT: Russel 2000, SPX: S&P 500 Index, STOXX50E: EURO STOXX 50, SSEC: Shanghai Composite Index, N225: Nikkei 225
:return: pandas.DataFrame
The Oxford-Man Institute's "realised library" contains daily non-parametric measures of how volatility financial assets or indexes were in the past. Each day's volatility measure depends solely on financial data from that day. They are driven by the use of the latest innovations in econometric modelling and theory to design them, while we draw our high frequency data from the Thomson Reuters DataScope Tick History database. Realised measures are not volatility forecasts. However, some researchers use these measures as an input into forecasting models. The aim of this line of research is to make financial markets more transparent by exposing how volatility changes through time.
This Library is used as the basis of some of our own research, which effects its scope, and is made available here to encourage the more widespread exploitation of these methods. It is given 'as is' and solely for informational purposes, please read the disclaimer.
The volatility data can be visually explored. We make the complete up-to-date dataset available for download. Lists of assets covered and realized measures available are also available.
"""
url = "https://realized.oxford-man.ox.ac.uk/theme/js/front-page-chart.js"
headers = {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
"Cache-Control": "no-cache",
"Connection": "keep-alive",
"Host": "realized.oxford-man.ox.ac.uk",
"Pragma": "no-cache",
"Referer": "https://realized.oxford-man.ox.ac.uk/?from=groupmessage&isappinstalled=0",
"Sec-Fetch-Mode": "no-cors",
"Sec-Fetch-Site": "same-origin",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36",
}
res = requests.get(url, headers=headers, verify=False)
soup = BeautifulSoup(res.text, "lxml")
soup_text = soup.find("p").get_text()
data_json = json.loads(soup_text[soup_text.find("{") : soup_text.rfind("}") + 1])
temp_df = pd.DataFrame(data_json[f".{symbol}"]["data"])
temp_df.index = pd.to_datetime(temp_df.iloc[:, 0], unit="ms")
temp_df = temp_df.iloc[:, 1]
temp_df.index.name = "date"
temp_df.name = f"{symbol}"
return temp_df
def article_rlab_rv(symbol: str = "39693") -> pd.DataFrame:
"""
修大成主页-Risk Lab-Realized Volatility
:param symbol: str 股票代码
:return: pandas.DataFrame
1996-01-02 0.000000
1996-01-04 0.000000
1996-01-05 0.000000
1996-01-09 0.000000
1996-01-10 0.000000
...
2019-11-04 0.175107
2019-11-05 0.185112
2019-11-06 0.210373
2019-11-07 0.240808
2019-11-08 0.199549
Name: RV, Length: 5810, dtype: float64
Website
https://dachxiu.chicagobooth.edu/
Objective
We provide up-to-date daily annualized realized volatilities for individual stocks, ETFs, and future contracts, which are estimated from high-frequency data. We are in the process of incorporating equities from global markets.
Data
We collect trades at their highest frequencies available (up to every millisecond for US equities after 2007), and clean them using the prevalent national best bid and offer (NBBO) that are available up to every second. The mid-quotes are calculated based on the NBBOs, so their highest sampling frequencies are also up to every second.
Methodology
We provide quasi-maximum likelihood estimates of volatility (QMLE) based on moving-average models MA(q), using non-zero returns of transaction prices (or mid-quotes if available) sampled up to their highest frequency available, for days with at least 12 observations. We select the best model (q) using Akaike Information Criterion (AIC). For comparison, we report realized volatility (RV) estimates using 5-minute and 15-minute subsampled returns.
References
1. “When Moving-Average Models Meet High-Frequency Data: Uniform Inference on Volatility”, by Rui Da and Dacheng Xiu. 2017.
2. “Quasi-Maximum Likelihood Estimation of Volatility with High Frequency Data”, by Dacheng Xiu. Journal of Econometrics, 159 (2010), 235-250.
3. “How Often to Sample A Continuous-time Process in the Presence of Market Microstructure Noise”, by Yacine Aït-Sahalia, Per Mykland, and Lan Zhang. Review of Financial Studies, 18 (2005), 351416.
4. “The Distribution of Exchange Rate Volatility”, by Torben Andersen, Tim Bollerslev, Francis X. Diebold, and Paul Labys. Journal of the American Statistical Association, 96 (2001), 42-55.
5. “Econometric Analysis of Realized Volatility and Its Use in Estimating Stochastic Volatility Models”, by Ole E BarndorffNielsen and Neil Shephard. Journal of the Royal Statistical Society: Series B, 64 (2002), 253-280.
"""
print("由于服务器在国外, 请稍后, 如果访问失败, 请使用代理工具")
url = "https://dachxiu.chicagobooth.edu/data.php"
payload = {"ticker": symbol}
res = requests.get(url, params=payload, verify=False)
soup = BeautifulSoup(res.text, "lxml")
title_fore = (
pd.DataFrame(soup.find("p").get_text().split(symbol)).iloc[0, 0].strip()
)
title_list = (
pd.DataFrame(soup.find("p").get_text().split(symbol))
.iloc[1, 0]
.strip()
.split("\n")
)
title_list.insert(0, title_fore)
temp_df = pd.DataFrame(soup.find("p").get_text().split(symbol)).iloc[2:, :]
temp_df = temp_df.iloc[:, 0].str.split(" ", expand=True)
temp_df = temp_df.iloc[:, 1:]
temp_df.iloc[:, -1] = temp_df.iloc[:, -1].str.replace(r"\n", "")
temp_df.reset_index(inplace=True)
temp_df.index = pd.to_datetime(temp_df.iloc[:, 1], format="%Y%m%d", errors="coerce")
temp_df = temp_df.iloc[:, 1:]
data_se = temp_df.iloc[:, 1]
data_se.name = "RV"
temp_df = data_se.astype("float", errors="ignore")
temp_df.index.name = "date"
return temp_df
if __name__ == "__main__":
article_rlab_rv_df = article_rlab_rv(symbol="39693")
print(article_rlab_rv_df)
article_oman_rv_short_df = article_oman_rv_short(symbol="FTSE")
print(article_oman_rv_short_df)
article_oman_rv_df = article_oman_rv(symbol="FTSE", index="rk_th2")
print(article_oman_rv_df)
@@ -0,0 +1,6 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2019/11/7 14:06
Desc:
"""
@@ -0,0 +1,189 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2025/2/4 23:00
Desc: 中国银行保险监督管理委员会-首页-政务信息-行政处罚-银保监分局本级-XXXX行政处罚信息公开表
https://www.nfra.gov.cn/cn/view/pages/ItemList.html?itemPId=923&itemId=4115&itemUrl=ItemListRightList.html&itemName=%E9%93%B6%E4%BF%9D%E7%9B%91%E5%88%86%E5%B1%80%E6%9C%AC%E7%BA%A7&itemsubPId=931&itemsubPName=%E8%A1%8C%E6%94%BF%E5%A4%84%E7%BD%9A#2
提取 具体页面 html 页面的 json 接口
https://www.nfra.gov.cn/cn/static/data/DocInfo/SelectByDocId/data_docId=881446.json
2020 新接口
"""
import warnings
from io import StringIO
import pandas as pd
import requests
from tqdm import tqdm
from akshare.bank.cons import cbirc_headers_without_cookie_2020
def bank_fjcf_total_num(item: str = "分局本级") -> int:
"""
首页-政务信息-行政处罚-银保监分局本级 总页数
https://www.nfra.gov.cn/cn/view/pages/ItemList.html?itemPId=923&itemId=4115&itemUrl=ItemListRightList.html&itemName=%E9%93%B6%E4%BF%9D%E7%9B%91%E5%88%86%E5%B1%80%E6%9C%AC%E7%BA%A7&itemsubPId=931
:param item: choice of {"机关", "本级", "分局本级"}
:type item: str
:return: 总页数
:rtype: int
"""
item_id_list = {
"机关": "4113",
"本级": "4114",
"分局本级": "4115",
}
cbirc_headers = cbirc_headers_without_cookie_2020.copy()
main_url = "https://www.nfra.gov.cn/cbircweb/DocInfo/SelectDocByItemIdAndChild"
params = {
"itemId": item_id_list[item],
"pageSize": "18",
"pageIndex": "1",
}
res = requests.get(main_url, params=params, headers=cbirc_headers)
return int(res.json()["data"]["total"])
def bank_fjcf_total_page(item: str = "分局本级", begin: int = 1) -> int:
"""
获取首页-政务信息-行政处罚-银保监分局本级的总页数
https://www.nfra.gov.cn/cn/view/pages/ItemList.html?itemPId=923&itemId=4115&itemUrl=ItemListRightList.html&itemName=%E9%93%B6%E4%BF%9D%E7%9B%91%E5%88%86%E5%B1%80%E6%9C%AC%E7%BA%A7&itemsubPId=931
:param item: choice of {"机关", "本级", "分局本级"}
:type item: str
:param begin: 开始页数
:type begin: str
:return: 总页数
:rtype: int
"""
item_id_list = {
"机关": "4113",
"本级": "4114",
"分局本级": "4115",
}
cbirc_headers = cbirc_headers_without_cookie_2020.copy()
main_url = "https://www.nfra.gov.cn/cbircweb/DocInfo/SelectDocByItemIdAndChild"
params = {
"itemId": item_id_list[item],
"pageSize": "18",
"pageIndex": str(begin),
}
res = requests.get(main_url, params=params, headers=cbirc_headers)
if res.json()["data"]["total"] / 18 > int(res.json()["data"]["total"] / 18):
total_page = int(res.json()["data"]["total"] / 18) + 1
return total_page
def bank_fjcf_page_url(
page: int = 5, item: str = "分局本级", begin: int = 1
) -> pd.DataFrame:
"""
获取 首页-政务信息-行政处罚-银保监分局本级-每一页的 json 数据
:param page: 需要获取前 page 页的内容, 总页数请通过 ak.bank_fjcf_total_page() 获取
:type page: int
:param item: choice of {"机关", "本级", "分局本级"}
:type item: str
:param begin: 开始页数
:type begin: str
:return: 需要的字段
:rtype: pandas.DataFrame
"""
item_id_list = {
"机关": "4113",
"本级": "4114",
"分局本级": "4115",
}
cbirc_headers = cbirc_headers_without_cookie_2020.copy()
main_url = "https://www.nfra.gov.cn/cbircweb/DocInfo/SelectDocByItemIdAndChild"
temp_df = pd.DataFrame()
for i_page in tqdm(range(begin, page + begin), leave=False):
params = {
"itemId": item_id_list[item],
"pageSize": "18",
"pageIndex": str(i_page),
}
res = requests.get(main_url, params=params, headers=cbirc_headers)
temp_df = pd.concat([temp_df, pd.DataFrame(res.json()["data"]["rows"])])
return temp_df[
["docId", "docSubtitle", "publishDate", "docFileUrl", "docTitle", "generaltype"]
]
def bank_fjcf_table_detail(
page: int = 5, item: str = "分局本级", begin: int = 1
) -> pd.DataFrame:
"""
获取 首页-政务信息-行政处罚-银保监分局本级-XXXX行政处罚信息公开表 数据
:param page: 需要获取前 page 页的内容, 总页数请通过 ak.bank_fjcf_total_page() 获取
:type page: int
:param item: choice of {"机关", "本级", "分局本级"}
:type item: str
:param begin: 开始页面
:type begin: int
:return: 返回所有行政处罚信息公开表的集合, 按第一页到最后一页的顺序排列
:rtype: pandas.DataFrame
"""
id_list = bank_fjcf_page_url(page=page, item=item, begin=begin)["docId"]
big_df = pd.DataFrame()
for item in id_list:
url = f"https://www.nfra.gov.cn/cn/static/data/DocInfo/SelectByDocId/data_docId={item}.json"
res = requests.get(url)
try:
table_list = pd.read_html(StringIO(res.json()["data"]["docClob"]))[0]
if table_list.shape[1] == 2:
table_list = table_list.iloc[:, 1].values.tolist()
else:
table_list = table_list.iloc[:, 3:].values.tolist()
# 部分旧表缺少字段,所以填充
if len(table_list) == 7:
table_list.insert(2, pd.NA)
table_list.insert(3, pd.NA)
table_list.insert(4, pd.NA)
elif len(table_list) == 8:
table_list.insert(1, pd.NA)
table_list.insert(2, pd.NA)
elif len(table_list) == 9:
table_list.insert(2, pd.NA)
elif len(table_list) == 11:
table_list = table_list[2:]
table_list.insert(2, pd.NA)
else:
print(
f"{item} 异常,请通过 https://www.nfra.gov.cn/cn/view/pages/ItemDetail.html?docId={item} 查看"
)
continue
# 部分会变成嵌套列表, 这里还原
table_list = [
item[0] if isinstance(item, list) else item for item in table_list
]
table_list.append(str(item))
table_list.append(res.json()["data"]["publishDate"])
table_df = pd.DataFrame(table_list)
table_df.columns = ["内容"]
big_df = pd.concat(objs=[big_df, table_df.T], ignore_index=True)
# 解决有些页面缺少字段的问题, 都放到 try 里面
except: # noqa: E722
warnings.warn(f"{item} 不是表格型数据,将跳过采集")
continue
if big_df.empty:
return pd.DataFrame()
big_df.columns = [
"行政处罚决定书文号",
"姓名",
"单位", # 20200108 新增
"单位名称",
"主要负责人姓名",
"主要违法违规事实(案由)",
"行政处罚依据",
"行政处罚决定",
"作出处罚决定的机关名称",
"作出处罚决定的日期",
"处罚ID",
"处罚公布日期",
]
return big_df
if __name__ == "__main__":
bank_fjcf_table_detail_df = bank_fjcf_table_detail(page=1, item="机关", begin=1)
print(bank_fjcf_table_detail_df)
@@ -0,0 +1,32 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2023/4/3 21:06
Desc: 银保监会配置文件
"""
cbirc_headers_without_cookie_2020 = {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
"Cache-Control": "no-cache",
"Connection": "keep-alive",
"Host": "www.nfra.gov.cn",
"Pragma": "no-cache",
"Referer": "http://www.nfra.gov.cn/cn/view/pages/ItemList.html?itemPId=923&itemId=4115&itemUrl=ItemListRightList.html&itemName=%E9%93%B6%E4%BF%9D%E7%9B%91%E5%88%86%E5%B1%80%E6%9C%AC%E7%BA%A7&itemsubPId=931&itemsubPName=%E8%A1%8C%E6%94%BF%E5%A4%84%E7%BD%9A",
"X-Requested-With": "XMLHttpRequest",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36",
}
cbirc_headers_without_cookie_2019 = {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
"Cache-Control": "no-cache",
"Connection": "keep-alive",
"Host": "www.nfra.gov.cn",
"Pragma": "no-cache",
"Referer": "http://www.nfra.gov.cn/cn/list/9103/910305/ybjjcf/1.html",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36",
}
@@ -0,0 +1,6 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2019/9/30 13:58
Desc:
"""
@@ -0,0 +1,234 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2025/4/5 17:30
Desc: 东方财富网-行情中心-债券市场-质押式回购
https://quote.eastmoney.com/center/gridlist.html#bond_sz_buyback
"""
import pandas as pd
import requests
def bond_sh_buy_back_em() -> pd.DataFrame:
"""
东方财富网-行情中心-债券市场-上证质押式回购
https://quote.eastmoney.com/center/gridlist.html#bond_sh_buyback
:return: 上证质押式回购
:rtype: pandas.DataFrame
"""
url = "https://push2.eastmoney.com/api/qt/clist/get"
params = {
"np": "1",
"fltt": "1",
"invt": "2",
"fs": "m:1+b:MK0356",
"fields": "f12,f13,f14,f1,f2,f4,f3,f152,f17,f18,f15,f16,f5,f6",
"fid": "f6",
"pn": "1",
"pz": "20",
"po": "1",
"dect": "1",
"wbp2u": "|0|0|0|web",
}
r = requests.get(url, params=params)
data_json = r.json()
temp_df = pd.DataFrame(data_json["data"]["diff"])
temp_df.reset_index(inplace=True)
temp_df["index"] = temp_df["index"] + 1
temp_df.rename(
columns={
"index": "序号",
"f2": "最新价",
"f3": "涨跌幅",
"f4": "涨跌额",
"f5": "成交量",
"f6": "成交额",
"f12": "代码",
"f14": "名称",
"f15": "最高",
"f16": "最低",
"f17": "今开",
"f18": "昨收",
},
inplace=True,
)
temp_df = temp_df[
[
"序号",
"代码",
"名称",
"最新价",
"涨跌额",
"涨跌幅",
"今开",
"最高",
"最低",
"昨收",
"成交量",
"成交额",
]
]
temp_df["最新价"] = pd.to_numeric(temp_df["最新价"], errors="coerce") / 1000
temp_df["涨跌幅"] = pd.to_numeric(temp_df["涨跌幅"], errors="coerce") / 100
temp_df["涨跌额"] = pd.to_numeric(temp_df["涨跌额"], errors="coerce") / 1000
temp_df["今开"] = pd.to_numeric(temp_df["今开"], errors="coerce") / 1000
temp_df["最高"] = pd.to_numeric(temp_df["最高"], errors="coerce") / 1000
temp_df["最低"] = pd.to_numeric(temp_df["最低"], errors="coerce") / 1000
temp_df["昨收"] = pd.to_numeric(temp_df["昨收"], errors="coerce") / 1000
temp_df["成交量"] = pd.to_numeric(temp_df["成交量"], errors="coerce")
temp_df["成交额"] = pd.to_numeric(temp_df["成交额"], errors="coerce")
return temp_df
def bond_sz_buy_back_em() -> pd.DataFrame:
"""
东方财富网-行情中心-债券市场-深证质押式回购
https://quote.eastmoney.com/center/gridlist.html#bond_sz_buyback
:return: 深证质押式回购
:rtype: pandas.DataFrame
"""
url = "https://push2.eastmoney.com/api/qt/clist/get"
params = {
"np": "1",
"fltt": "1",
"invt": "2",
"fs": "m:0+b:MK0356",
"fields": "f12,f13,f14,f1,f2,f4,f3,f152,f17,f18,f15,f16,f5,f6",
"fid": "f6",
"pn": "1",
"pz": "20",
"po": "1",
"dect": "1",
"wbp2u": "|0|0|0|web",
}
r = requests.get(url, params=params)
data_json = r.json()
temp_df = pd.DataFrame(data_json["data"]["diff"])
temp_df.reset_index(inplace=True)
temp_df["index"] = temp_df["index"] + 1
temp_df.rename(
columns={
"index": "序号",
"f2": "最新价",
"f3": "涨跌幅",
"f4": "涨跌额",
"f5": "成交量",
"f6": "成交额",
"f12": "代码",
"f14": "名称",
"f15": "最高",
"f16": "最低",
"f17": "今开",
"f18": "昨收",
},
inplace=True,
)
temp_df = temp_df[
[
"序号",
"代码",
"名称",
"最新价",
"涨跌额",
"涨跌幅",
"今开",
"最高",
"最低",
"昨收",
"成交量",
"成交额",
]
]
temp_df["最新价"] = pd.to_numeric(temp_df["最新价"], errors="coerce") / 1000
temp_df["涨跌幅"] = pd.to_numeric(temp_df["涨跌幅"], errors="coerce") / 100
temp_df["涨跌额"] = pd.to_numeric(temp_df["涨跌额"], errors="coerce") / 1000
temp_df["今开"] = pd.to_numeric(temp_df["今开"], errors="coerce") / 1000
temp_df["最高"] = pd.to_numeric(temp_df["最高"], errors="coerce") / 1000
temp_df["最低"] = pd.to_numeric(temp_df["最低"], errors="coerce") / 1000
temp_df["昨收"] = pd.to_numeric(temp_df["昨收"], errors="coerce") / 1000
temp_df["成交量"] = pd.to_numeric(temp_df["成交量"], errors="coerce")
temp_df["成交额"] = pd.to_numeric(temp_df["成交额"], errors="coerce")
return temp_df
def bond_buy_back_hist_em(symbol: str = "204001"):
"""
东方财富网-行情中心-债券市场-质押式回购-历史数据
https://quote.eastmoney.com/center/gridlist.html#bond_sh_buyback
:param symbol: 质押式回购代码
:type symbol: str
:return: 历史数据
:rtype: pandas.DataFrame
"""
if symbol.startswith("1"):
market_id = "0"
else:
market_id = "1"
url = "https://push2his.eastmoney.com/api/qt/stock/kline/get"
params = {
"secid": f"{market_id}.{symbol}",
"klt": "101",
"fqt": "1",
"lmt": "10000",
"end": "20500000",
"iscca": "1",
"fields1": "f1,f2,f3,f4,f5,f6,f7,f8",
"fields2": "f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61,f62,f63,f64",
"forcect": "1",
}
r = requests.get(url, params=params)
data_json = r.json()
temp_df = pd.DataFrame([item.split(",") for item in data_json["data"]["klines"]])
temp_df.columns = [
"日期",
"开盘",
"收盘",
"最高",
"最低",
"成交量",
"成交额",
"-",
"-",
"-",
"-",
"-",
"-",
"-",
]
temp_df = temp_df[
[
"日期",
"开盘",
"收盘",
"最高",
"最低",
"成交量",
"成交额",
]
]
temp_df["日期"] = pd.to_datetime(temp_df["日期"], errors="coerce").dt.date
temp_df["开盘"] = pd.to_numeric(temp_df["开盘"], errors="coerce")
temp_df["收盘"] = pd.to_numeric(temp_df["收盘"], errors="coerce")
temp_df["最高"] = pd.to_numeric(temp_df["最高"], errors="coerce")
temp_df["最低"] = pd.to_numeric(temp_df["最低"], errors="coerce")
temp_df["成交量"] = pd.to_numeric(temp_df["成交量"], errors="coerce")
temp_df["成交额"] = pd.to_numeric(temp_df["成交额"], errors="coerce")
return temp_df
if __name__ == "__main__":
bond_sh_buy_back_em_df = bond_sh_buy_back_em()
print(bond_sh_buy_back_em_df)
bond_sz_buy_back_em_df = bond_sz_buy_back_em()
print(bond_sz_buy_back_em_df)
bond_buy_back_hist_em_df = bond_buy_back_hist_em(symbol="204001")
print(bond_buy_back_hist_em_df)
bond_buy_back_hist_em_df = bond_buy_back_hist_em(symbol="131810")
print(bond_buy_back_hist_em_df)
@@ -0,0 +1,58 @@
# -*- coding:utf-8 -*-
# !/usr/bin/env python
"""
Date: 2023/9/12 16:50
Desc: 新浪财经-债券-可转债
https://money.finance.sina.com.cn/bond/info/sz128039.html
"""
from io import StringIO
import pandas as pd
import requests
def bond_cb_profile_sina(symbol: str = "sz128039") -> pd.DataFrame:
"""
新浪财经-债券-可转债-详情资料
https://money.finance.sina.com.cn/bond/info/sz128039.html
:param symbol: 带市场标识的转债代码
:type symbol: str
:return: 可转债-详情资料
:rtype: pandas.DataFrame
"""
url = f"https://money.finance.sina.com.cn/bond/info/{symbol}.html"
r = requests.get(url)
temp_df = pd.read_html(StringIO(r.text))[0]
temp_df.columns = ["item", "value"]
return temp_df
def bond_cb_summary_sina(symbol: str = "sh155255") -> pd.DataFrame:
"""
新浪财经-债券-可转债-债券概况
https://money.finance.sina.com.cn/bond/quotes/sh155255.html
:param symbol: 带市场标识的转债代码
:type symbol: str
:return: 可转债-债券概况
:rtype: pandas.DataFrame
"""
url = f"https://money.finance.sina.com.cn/bond/quotes/{symbol}.html"
r = requests.get(url)
temp_df = pd.read_html(StringIO(r.text))[10]
part1 = temp_df.iloc[:, 0:2].copy()
part1.columns = ["item", "value"]
part2 = temp_df.iloc[:, 2:4].copy()
part2.columns = ["item", "value"]
part3 = temp_df.iloc[:, 4:6].copy()
part3.columns = ["item", "value"]
big_df = pd.concat(objs=[part1, part2, part3], ignore_index=True)
return big_df
if __name__ == "__main__":
bond_cb_profile_sina_df = bond_cb_profile_sina(symbol="sz128039")
print(bond_cb_profile_sina_df)
bond_cb_summary_sina_df = bond_cb_summary_sina(symbol="sh155255")
print(bond_cb_summary_sina_df)
@@ -0,0 +1,93 @@
# -*- coding:utf-8 -*-
# !/usr/bin/env python
"""
Date: 2024/8/14 11:30
Desc: 同花顺-数据中心-可转债
https://data.10jqka.com.cn/ipo/bond/
"""
import pandas as pd
import requests
def bond_zh_cov_info_ths() -> pd.DataFrame:
"""
同花顺-数据中心-可转债
https://data.10jqka.com.cn/ipo/bond/
:return: 可转债行情
:rtype: pandas.DataFrame
"""
url = "https://data.10jqka.com.cn/ipo/kzz/"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/89.0.4389.90 Safari/537.36",
}
r = requests.get(url, headers=headers)
data_json = r.json()
temp_df = pd.DataFrame(data_json["list"])
temp_df.rename(
columns={
"sub_date": "申购日期",
"bond_code": "债券代码",
"bond_name": "债券简称",
"code": "正股代码",
"name": "正股简称",
"sub_code": "申购代码",
"share_code": "原股东配售码",
"sign_date": "中签公布日",
"plan_total": "计划发行量",
"issue_total": "实际发行量",
"issue_price": "-",
"success_rate": "中签率",
"listing_date": "上市日期",
"expire_date": "到期时间",
"price": "转股价格",
"quota": "每股获配额",
"number": "中签号",
"market_id": "-",
"stock_market_id": "-",
},
inplace=True,
)
temp_df = temp_df[
[
"债券代码",
"债券简称",
"申购日期",
"申购代码",
"原股东配售码",
"每股获配额",
"计划发行量",
"实际发行量",
"中签公布日",
"中签号",
"上市日期",
"正股代码",
"正股简称",
"转股价格",
"到期时间",
"中签率",
]
]
temp_df["申购日期"] = pd.to_datetime(
temp_df["申购日期"], format="%Y-%m-%d", errors="coerce"
).dt.date
temp_df["中签公布日"] = pd.to_datetime(
temp_df["中签公布日"], format="%Y-%m-%d", errors="coerce"
).dt.date
temp_df["上市日期"] = pd.to_datetime(
temp_df["上市日期"], format="%Y-%m-%d", errors="coerce"
).dt.date
temp_df["到期时间"] = pd.to_datetime(
temp_df["到期时间"], format="%Y-%m-%d", errors="coerce"
).dt.date
temp_df["每股获配额"] = pd.to_numeric(temp_df["每股获配额"], errors="coerce")
temp_df["计划发行量"] = pd.to_numeric(temp_df["计划发行量"], errors="coerce")
temp_df["实际发行量"] = pd.to_numeric(temp_df["实际发行量"], errors="coerce")
temp_df["转股价格"] = pd.to_numeric(temp_df["转股价格"], errors="coerce")
return temp_df
if __name__ == "__main__":
bond_zh_cov_info_ths_df = bond_zh_cov_info_ths()
print(bond_zh_cov_info_ths_df)
@@ -0,0 +1,296 @@
# -*- coding:utf-8 -*-
# !/usr/bin/env python
"""
Date: 2026/4/10 19:00
Desc: 中国债券信息网-中债指数-中债指数族系-总指数-综合类指数
"""
import pandas as pd
import requests
from akshare.bond.cons import INDEX_MAPPING, PERIOD_MAPPING, INDICATOR_MAPPING
def bond_available_index_cbond():
"""
中国债券信息网-中债指数-中债指数族系 当中, 非指定期限部分
https://yield.chinabond.com.cn/cbweb-mn/indices/singleIndexQueryResult
:return: 可选项列表
:rtype: list
"""
temp_df = pd.DataFrame(list(INDEX_MAPPING.keys()))
temp_df.reset_index(inplace=True)
temp_df['index'] = temp_df['index'] + 1
temp_df.columns = ['index', 'value']
return temp_df
def bond_index_general_cbond(
index_category: str = "新综合指数", indicator: str = "全价", period: str = "总值"
):
"""
中国债券信息网-中债指数-中债指数族系
https://yield.chinabond.com.cn/cbweb-mn/indices/singleIndexQueryResult
:param index_category: see result of available_bond_index()
:type index_category: str
:param indicator: choice of {"全价", "净价", "财富", "平均市值法久期", "平均现金流法久期", "平均市值法凸性", "平均现金流法凸性", "平均现金流法到期收益率", "平均市值法到期收益率", "平均基点价值", "平均待偿期", "平均派息率", "指数上日总市值", "财富指数涨跌幅", "全价指数涨跌幅", "净价指数涨跌幅", "现券结算量"}
:type indicator: str
:param period: choice of {"总值", "1年以下", "1-3年", "3-5年", "5-7年", "7-10年", "10年以上", "0-3个月", "3-6个月", "6-9个月", "9-12个月", "0-6个月", "6-12个月"}
:type period: str
:return: 指定指数的指定指标的指定期限分段数据
:rtype: pandas.DataFrame
"""
url = "https://yield.chinabond.com.cn/cbweb-mn/indices/singleIndexQueryResult"
params = {
"indexid": INDEX_MAPPING[index_category],
"qxlxt": PERIOD_MAPPING[period],
"ltcslx": "",
"zslxt": INDICATOR_MAPPING[indicator],
"zslxt1": INDICATOR_MAPPING[indicator],
"lx": "1",
"locale": "zh_CN",
}
r = requests.post(url, params=params)
raw_json = r.json()
key_col_map = {f"{INDICATOR_MAPPING[indicator]}_{p_code}": freq_col for p_code, freq_col in
raw_json['dqcName'].items()}
data_json = {key: raw_json[key] for key in key_col_map}
temp_df = pd.DataFrame.from_dict(data_json, orient="columns")
temp_df.index = pd.to_datetime(pd.to_numeric(temp_df.index), unit="ms", utc=True).tz_convert("Asia/Shanghai")
temp_df.index.name = "date"
temp_df.rename(columns=key_col_map, inplace=True)
temp_df.reset_index(inplace=True)
temp_df.columns = ["date", "value"]
temp_df['date'] = pd.to_datetime(temp_df['date'], errors="coerce").dt.date
return temp_df
def bond_treasury_index_cbond(
indicator: str = "财富", period: str = "5Y"
) -> pd.DataFrame:
"""
中国债券信息网-中债指数-中债指数族系-总指数-综合类指数-中债-国债指数
https://yield.chinabond.com.cn/cbweb-mn/indices/single_index_query
:param indicator: choice of {"全价", "净价", "财富"}
:type indicator: str
:param period: choice of {'0-1Y', '0-3Y', '0-5Y', '0-10Y', '1-3Y', '1-5Y', '1-10Y',
'3-5Y', '5Y', '7Y', '7-10Y', '10Y', '30Y'}
:type period: str
:return: 国债指数
:rtype: pandas.DataFrame
"""
mapping = {
"0-1Y": "8a8b2cef70bc61380170be069828032b",
"0-3Y": "61f69682dc3ec18fe9664ff59308314a",
"0-5Y": "0beafb51867009998c2f4932bf22ede3",
"0-10Y": "8a8b2cef7832f8920178350801470014",
"1-3Y": "cc1cfe89b0cbd0800420a0e037026407",
"1-5Y": "7c3110e5305f9301482517066427a554",
"1-10Y": "a5d90802e3259978a027267de651106d",
"3-5Y": "8a8b2ca04bf69582014c10b60f376c77",
"5Y": "8a8b2ca03a3feea1013a44b98fc533f5",
"7Y": "2c9081e50e8767dc010e87b6e26c0080",
"7-10Y": "8a8b2c8f5a492a01015a4ac986480043",
"10Y": "8a8b2ca04b666362014b723482bc4f49",
"30Y": "8a8b2cef77b239980177b485d20a6379",
}
url = "https://yield.chinabond.com.cn/cbweb-mn/indices/singleIndexQueryResult"
params = {
"indexid": mapping[period],
"qxlxt": "00",
"ltcslx": "",
"zslxt": INDICATOR_MAPPING[indicator],
"zslxt1": INDICATOR_MAPPING[indicator],
"lx": "1",
"locale": "zh_CN",
}
r = requests.post(url, params=params)
raw_json = r.json()
key_col_map = {f"{INDICATOR_MAPPING[indicator]}_{p_code}": freq_col for p_code, freq_col in
raw_json['dqcName'].items()}
data_json = {key: raw_json[key] for key in key_col_map}
temp_df = pd.DataFrame.from_dict(data_json, orient="columns")
temp_df.index = pd.to_datetime(pd.to_numeric(temp_df.index), unit="ms", utc=True).tz_convert("Asia/Shanghai")
temp_df.index.name = "date"
temp_df.rename(columns=key_col_map, inplace=True)
temp_df.reset_index(inplace=True)
temp_df.columns = ["date", "value"]
temp_df['date'] = pd.to_datetime(temp_df['date'], errors="coerce").dt.date
return temp_df
def bond_new_composite_index_cbond(
indicator: str = "财富", period: str = "总值"
) -> pd.DataFrame:
"""
中国债券信息网-中债指数-中债指数族系-总指数-综合类指数-中债-新综合指数
https://yield.chinabond.com.cn/cbweb-mn/indices/single_index_query
:param indicator: choice of {"全价", "净价", "财富", "平均市值法久期", "平均现金流法久期", "平均市值法凸性",
"平均现金流法凸性", "平均现金流法到期收益率", "平均市值法到期收益率", "平均基点价值", "平均待偿期", "平均派息率",
"指数上日总市值", "财富指数涨跌幅", "全价指数涨跌幅", "净价指数涨跌幅", "现券结算量"}
:type indicator: str
:param period: choice of {"总值", "1年以下", "1-3年", "3-5年", "5-7年", "7-10年", "10年以上", "0-3个月",
"3-6个月", "6-9个月", "9-12个月", "0-6个月", "6-12个月"}
:type period: str
:return: 新综合指数
:rtype: pandas.DataFrame
"""
indicator_map = {
"全价": "QJZS",
"净价": "JJZS",
"财富": "CFZS",
"平均市值法久期": "PJSZFJQ",
"平均现金流法久期": "PJXJLFJQ",
"平均市值法凸性": "PJSZFTX",
"平均现金流法凸性": "PJXJLFTX",
"平均现金流法到期收益率": "PJDQSYL",
"平均市值法到期收益率": "PJSZFDQSYL",
"平均基点价值": "PJJDJZ",
"平均待偿期": "PJDCQ",
"平均派息率": "PJPXL",
"指数上日总市值": "ZSZSZ",
"财富指数涨跌幅": "CFZSZDF",
"全价指数涨跌幅": "QJZSZDF",
"净价指数涨跌幅": "JJZSZDF",
"现券结算量": "XQJSL",
}
period_map = {
"总值": "00",
"1年以下": "01",
"1-3年": "02",
"3-5年": "03",
"5-7年": "04",
"7-10年": "05",
"10年以上": "06",
"0-3个月": "07",
"3-6个月": "08",
"6-9个月": "09",
"9-12个月": "10",
"0-6个月": "11",
"6-12个月": "12",
}
url = "https://yield.chinabond.com.cn/cbweb-mn/indices/singleIndexQuery"
params = {
"indexid": "8a8b2ca0332abed20134ea76d8885831",
"": "", # noqa: F601
"qxlxt": period_map[period],
"": "", # noqa: F601
"ltcslx": "",
"": "", # noqa: F601
"zslxt": indicator_map[indicator], # noqa: F601
"": "", # noqa: F601
"zslxt": indicator_map[indicator], # noqa: F601
"": "", # noqa: F601
"lx": "1",
"": "", # noqa: F601
"locale": "",
}
r = requests.post(url, params=params)
data_json = r.json()
temp_df = pd.DataFrame.from_dict(
data_json[f"{indicator_map[indicator]}_{period_map[period]}"],
orient="index",
)
temp_df.reset_index(inplace=True)
temp_df.columns = ["date", "value"]
temp_df["date"] = temp_df["date"].astype(float)
temp_df["date"] = (
pd.to_datetime(temp_df["date"], unit="ms", errors="coerce", utc=True)
.dt.tz_convert("Asia/Shanghai")
.dt.date
)
temp_df["value"] = pd.to_numeric(temp_df["value"], errors="coerce")
return temp_df
def bond_composite_index_cbond(
indicator: str = "财富", period: str = "总值"
) -> pd.DataFrame:
"""
中国债券信息网-中债指数-中债指数族系-总指数-综合类指数-中债-综合指数
https://yield.chinabond.com.cn/cbweb-mn/indices/single_index_query
:param indicator: choice of {"全价", "净价", "财富", "平均市值法久期", "平均现金流法久期", "平均市值法凸性",
"平均现金流法凸性", "平均现金流法到期收益率", "平均市值法到期收益率", "平均基点价值", "平均待偿期", "平均派息率",
"指数上日总市值", "财富指数涨跌幅", "全价指数涨跌幅", "净价指数涨跌幅", "现券结算量"}
:type indicator: str
:param period: choice of {"总值", "1年以下", "1-3年", "3-5年", "5-7年", "7-10年", "10年以上", "0-3个月",
"3-6个月", "6-9个月", "9-12个月", "0-6个月", "6-12个月"}
:type period: str
:return: 新综合指数
:rtype: pandas.DataFrame
"""
indicator_map = {
"全价": "QJZS",
"净价": "JJZS",
"财富": "CFZS",
"平均市值法久期": "PJSZFJQ",
"平均现金流法久期": "PJXJLFJQ",
"平均市值法凸性": "PJSZFTX",
"平均现金流法凸性": "PJXJLFTX",
"平均现金流法到期收益率": "PJDQSYL",
"平均市值法到期收益率": "PJSZFDQSYL",
"平均基点价值": "PJJDJZ",
"平均待偿期": "PJDCQ",
"平均派息率": "PJPXL",
"指数上日总市值": "ZSZSZ",
"财富指数涨跌幅": "CFZSZDF",
"全价指数涨跌幅": "QJZSZDF",
"净价指数涨跌幅": "JJZSZDF",
"现券结算量": "XQJSL",
}
period_map = {
"总值": "00",
"1年以下": "01",
"1-3年": "02",
"3-5年": "03",
"5-7年": "04",
"7-10年": "05",
"10年以上": "06",
"0-3个月": "07",
"3-6个月": "08",
"6-9个月": "09",
"9-12个月": "10",
"0-6个月": "11",
"6-12个月": "12",
}
url = "https://yield.chinabond.com.cn/cbweb-mn/indices/singleIndexQuery"
params = {
"indexid": "2c90818811afed8d0111c0c672b31578",
"": "", # noqa: F601
"qxlxt": period_map[period],
"": "", # noqa: F601
"zslxt": indicator_map[indicator],
"": "", # noqa: F601
"lx": "1",
"": "", # noqa: F601
"locale": "",
}
r = requests.post(url, params=params)
data_json = r.json()
temp_df = pd.DataFrame.from_dict(
data_json[f"{indicator_map[indicator]}_{period_map[period]}"],
orient="index",
)
temp_df.reset_index(inplace=True)
temp_df.columns = ["date", "value"]
temp_df["date"] = pd.to_datetime(temp_df["date"].astype(int), errors="coerce", unit="ms").dt.date
temp_df["value"] = pd.to_numeric(temp_df["value"], errors="coerce")
return temp_df
if __name__ == "__main__":
bond_new_composite_index_cbond_df = bond_new_composite_index_cbond(
indicator="财富", period="总值"
)
print(bond_new_composite_index_cbond_df)
bond_composite_index_cbond_df = bond_composite_index_cbond(
indicator="财富", period="总值"
)
print(bond_composite_index_cbond_df)
bond_index_general_cbond_df = bond_index_general_cbond(index_category="新综合指数", indicator="全价", period="总值")
print(bond_index_general_cbond_df)
bond_treasury_index_cbond_df = bond_treasury_index_cbond(indicator="财富", period="5Y")
print(bond_treasury_index_cbond_df)
@@ -0,0 +1,190 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2024/10/1 17:00
Desc: 中国外汇交易中心暨全国银行间同业拆借中心
中国外汇交易中心暨全国银行间同业拆借中心-市场数据-债券市场行情-现券市场做市报价
中国外汇交易中心暨全国银行间同业拆借中心-市场数据-债券市场行情-现券市场成交行情
https://www.chinamoney.com.cn/chinese/mkdatabond/
"""
from io import StringIO
import pandas as pd
import requests
from akshare.bond.bond_china_money import bond_china_close_return_map
from akshare.utils.cons import headers
def bond_spot_quote() -> pd.DataFrame:
"""
中国外汇交易中心暨全国银行间同业拆借中心-市场数据-债券市场行情-现券市场做市报价
https://www.chinamoney.com.cn/chinese/mkdatabond/
:return: 现券市场做市报价
:rtype: pandas.DataFrame
"""
bond_china_close_return_map()
url = "https://www.chinamoney.com.cn/ags/ms/cm-u-md-bond/CbMktMakQuot"
payload = {
"flag": "1",
"lang": "cn",
}
r = requests.post(url=url, data=payload, headers=headers)
data_json = r.json()
temp_df = pd.DataFrame(data_json["records"])
temp_df.columns = [
"_",
"_",
"报价机构",
"_",
"_",
"_",
"债券简称",
"_",
"_",
"_",
"_",
"买入/卖出收益率",
"_",
"买入/卖出净价",
"_",
"_",
"_",
]
temp_df = temp_df[
[
"报价机构",
"债券简称",
"买入/卖出净价",
"买入/卖出收益率",
]
]
temp_df["买入净价"] = (
temp_df["买入/卖出净价"].str.split("/", expand=True).iloc[:, 0]
)
temp_df["卖出净价"] = (
temp_df["买入/卖出净价"].str.split("/", expand=True).iloc[:, 1]
)
temp_df["买入收益率"] = (
temp_df["买入/卖出收益率"].str.split("/", expand=True).iloc[:, 0]
)
temp_df["卖出收益率"] = (
temp_df["买入/卖出收益率"].str.split("/", expand=True).iloc[:, 1]
)
del temp_df["买入/卖出净价"]
del temp_df["买入/卖出收益率"]
temp_df["买入净价"] = pd.to_numeric(temp_df["买入净价"], errors="coerce")
temp_df["卖出净价"] = pd.to_numeric(temp_df["卖出净价"], errors="coerce")
temp_df["买入收益率"] = pd.to_numeric(temp_df["买入收益率"], errors="coerce")
temp_df["卖出收益率"] = pd.to_numeric(temp_df["卖出收益率"], errors="coerce")
return temp_df
def bond_spot_deal() -> pd.DataFrame:
"""
中国外汇交易中心暨全国银行间同业拆借中心-市场数据-债券市场行情-现券市场成交行情
https://www.chinamoney.com.cn/chinese/mkdatabond/
:return: 现券市场成交行情
:rtype: pandas.DataFrame
"""
url = "https://www.chinamoney.com.cn/ags/ms/cm-u-md-bond/CbtPri"
payload = {
"flag": "1",
"lang": "cn",
"bondName": "",
}
r = requests.post(url=url, data=payload, headers=headers)
data_json = r.json()
temp_df = pd.DataFrame(data_json["records"])
temp_df.columns = [
"_",
"_",
"债券简称",
"_",
"_",
"_",
"_",
"涨跌",
"_",
"_",
"_",
"加权收益率",
"成交净价",
"_",
"_",
"最新收益率",
"-",
"交易量",
"_",
"_",
"_",
"_",
]
temp_df = temp_df[
[
"债券简称",
"成交净价",
"最新收益率",
"涨跌",
"加权收益率",
"交易量",
]
]
temp_df["成交净价"] = pd.to_numeric(temp_df["成交净价"], errors="coerce")
temp_df["最新收益率"] = pd.to_numeric(temp_df["最新收益率"], errors="coerce")
temp_df["涨跌"] = pd.to_numeric(temp_df["涨跌"], errors="coerce")
temp_df["加权收益率"] = pd.to_numeric(temp_df["加权收益率"], errors="coerce")
temp_df["交易量"] = pd.to_numeric(temp_df["交易量"], errors="coerce")
return temp_df
def bond_china_yield(
start_date: str = "20200204", end_date: str = "20210124"
) -> pd.DataFrame:
"""
中国债券信息网-国债及其他债券收益率曲线
https://www.chinabond.com.cn/
https://yield.chinabond.com.cn/cbweb-pbc-web/pbc/historyQuery?startDate=2019-02-07&endDate=2020-02-04&gjqx=0&qxId=ycqx&locale=cn_ZH
注意: end_date - start_date 应该小于一年
:param start_date: 需要查询的日期, 返回在该日期之后一年内的数据
:type start_date: str
:param end_date: 需要查询的日期, 返回在该日期之前一年内的数据
:type end_date: str
:return: 返回在指定日期之间之前一年内的数据
:rtype: pandas.DataFrame
"""
url = "https://yield.chinabond.com.cn/cbweb-pbc-web/pbc/historyQuery"
params = {
"startDate": "-".join([start_date[:4], start_date[4:6], start_date[6:]]),
"endDate": "-".join([end_date[:4], end_date[4:6], end_date[6:]]),
"gjqx": "0",
"qxId": "ycqx",
"locale": "cn_ZH",
}
res = requests.get(url, params=params, headers=headers)
data_text = res.text.replace("&nbsp", "")
data_df = pd.read_html(StringIO(data_text), header=0)[1]
data_df["日期"] = pd.to_datetime(data_df["日期"], errors="coerce").dt.date
data_df["3月"] = pd.to_numeric(data_df["3月"], errors="coerce")
data_df["6月"] = pd.to_numeric(data_df["6月"], errors="coerce")
data_df["1年"] = pd.to_numeric(data_df["1年"], errors="coerce")
data_df["3年"] = pd.to_numeric(data_df["3年"], errors="coerce")
data_df["5年"] = pd.to_numeric(data_df["5年"], errors="coerce")
data_df["7年"] = pd.to_numeric(data_df["7年"], errors="coerce")
data_df["10年"] = pd.to_numeric(data_df["10年"], errors="coerce")
data_df["30年"] = pd.to_numeric(data_df["30年"], errors="coerce")
data_df.sort_values(by="日期", inplace=True)
data_df.reset_index(inplace=True, drop=True)
return data_df
if __name__ == "__main__":
bond_spot_quote_df = bond_spot_quote()
print(bond_spot_quote_df)
bond_spot_deal_df = bond_spot_deal()
print(bond_spot_deal_df)
bond_china_yield_df = bond_china_yield(start_date="20210201", end_date="20220201")
print(bond_china_yield_df)
@@ -0,0 +1,390 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2024/6/27 16:00
Desc: 收盘收益率曲线历史数据
https://www.chinamoney.com.cn/chinese/bkcurvclosedyhis/?bondType=CYCC000&reference=1
"""
from functools import lru_cache
import pandas as pd
import requests
from akshare.utils.tqdm import get_tqdm
def __bond_register_service() -> requests.Session:
"""
将服务注册到网站中,则该 IP 在 24 小时内可以直接访问
https://www.chinamoney.com.cn
:return: 访问过的 Session
:rtype: requests.Session
"""
session = requests.Session()
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/108.0.0.0 Safari/537.36",
}
session.get(
url="https://www.chinamoney.com.cn/chinese/bkcurvclosedyhis/?bondType=CYCC000&reference=1",
headers=headers,
)
cookies_dict = session.cookies.get_dict()
cookies_str = "; ".join(f"{k}={v}" for k, v in cookies_dict.items())
# 此处需要通过未访问的游览器,首次打开
# https://www.chinamoney.com.cn/chinese/bkcurvclosedyhis/?bondType=CYCC000&reference=1
# 页面进行人工获取
data = {"key": "TThwSjc2NWkzV0VSOVRzOA=="}
headers = {
"Accept": "application/json, text/javascript, */*; q=0.01",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "en",
"Cache-Control": "no-cache",
"Connection": "keep-alive",
"Content-Length": "22",
"Cookie": cookies_str,
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"Host": "www.chinamoney.com.cn",
"Origin": "https://www.chinamoney.com.cn",
"Pragma": "no-cache",
"Referer": "https://www.chinamoney.com.cn/chinese/bkcurvclosedyhis/?bondType=CYCC000&reference=1",
"Sec-Fetch-Dest": "empty",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Site": "same-origin",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/108.0.0.0 Safari/537.36",
"X-Requested-With": "XMLHttpRequest",
}
session.post(
url="https://www.chinamoney.com.cn/dqs/rest/cm-u-rbt/apply",
data=data,
headers=headers,
)
# 20231127 新增部分 https://github.com/akfamily/akshare/issues/4299
cookies_dict = session.cookies.get_dict()
cookies_str = "; ".join(f"{k}={v}" for k, v in cookies_dict.items())
headers = {
"Accept": "application/json, text/javascript, /; q=0.01",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "en",
"Connection": "keep-alive",
"Content-Length": "0",
"Cookie": cookies_str,
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"Host": "www.chinamoney.com.cn",
"Origin": "https://www.chinamoney.com.cn",
"Referer": "https://www.chinamoney.com.cn/chinese/bkcurvclosedyhis/?bondType=CYCC000&reference=1",
"Sec-Fetch-Dest": "empty",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Site": "same-origin",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/108.0.0.0 Safari/537.36",
"X-Requested-With": "XMLHttpRequest",
}
session.post(
url="https://www.chinamoney.com.cn/lss/rest/cm-s-account/getSessionUser",
headers=headers,
)
return session
@lru_cache()
def bond_china_close_return_map() -> pd.DataFrame:
"""
收盘收益率曲线历史数据
https://www.chinamoney.com.cn/chinese/bkcurvclosedyhis/?bondType=CYCC000&reference=1
:return: 收盘收益率曲线历史数据
:rtype: pandas.DataFrame
"""
headers = {
"Accept": "application/json, text/javascript, */*; q=0.01",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
"Cache-Control": "no-cache",
"Connection": "keep-alive",
"Content-Length": "0",
"Host": "www.chinamoney.com.cn",
"Origin": "https://www.chinamoney.com.cn",
"Pragma": "no-cache",
"Referer": "https://www.chinamoney.com.cn/chinese/bkcurvclosedyhis/?bondType=CYCC000&reference=1",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/108.0.0.0 Safari/537.36",
"X-Requested-With": "XMLHttpRequest",
}
url = "https://www.chinamoney.com.cn/ags/ms/cm-u-bk-currency/ClsYldCurvCurvGO"
try:
r = requests.get(url, headers=headers)
data_json = r.json()
except: # noqa: E722
session = __bond_register_service()
r = session.get(url, headers=headers)
data_json = r.json()
temp_df = pd.DataFrame(data_json["records"])
return temp_df
def bond_china_close_return(
symbol: str = "国债",
period: str = "1",
start_date: str = "20231101",
end_date: str = "20231101",
) -> pd.DataFrame:
"""
收盘收益率曲线历史数据
https://www.chinamoney.com.cn/chinese/bkcurvclosedyhis/?bondType=CYCC000&reference=1
:param symbol: 需要获取的指标
:type period: choice of {'0.1', '0.5', '1'}
:param period: 期限间隔
:type symbol: str
:param start_date: 开始日期, 结束日期和开始日期不要超过 1 个月
:type start_date: str
:param end_date: 结束日期, 结束日期和开始日期不要超过 1 个月
:type end_date: str
:return: 收盘收益率曲线历史数据
:rtype: pandas.DataFrame
"""
name_code_df = bond_china_close_return_map()
symbol_code = name_code_df[name_code_df["cnLabel"] == symbol]["value"].values[0]
url = "https://www.chinamoney.com.cn/ags/ms/cm-u-bk-currency/ClsYldCurvHis"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/108.0.0.0 Safari/537.36",
}
params = {
"lang": "CN",
"reference": "1,2,3",
"bondType": symbol_code,
"startDate": "-".join([start_date[:4], start_date[4:6], start_date[6:]]),
"endDate": "-".join([end_date[:4], end_date[4:6], end_date[6:]]),
"termId": period,
"pageNum": "1",
"pageSize": "50",
}
r = requests.get(url, params=params, headers=headers)
data_json = r.json()
temp_df = pd.DataFrame(data_json["records"])
del temp_df["newDateValue"]
temp_df.columns = [
"日期",
"期限",
"到期收益率",
"即期收益率",
"远期收益率",
]
temp_df = temp_df[
[
"日期",
"期限",
"到期收益率",
"即期收益率",
"远期收益率",
]
]
temp_df["日期"] = pd.to_datetime(temp_df["日期"], errors="coerce").dt.date
temp_df["期限"] = pd.to_numeric(temp_df["期限"], errors="coerce")
temp_df["到期收益率"] = pd.to_numeric(temp_df["到期收益率"], errors="coerce")
temp_df["即期收益率"] = pd.to_numeric(temp_df["即期收益率"], errors="coerce")
temp_df["远期收益率"] = pd.to_numeric(temp_df["远期收益率"], errors="coerce")
return temp_df
def macro_china_swap_rate(
start_date: str = "20231101", end_date: str = "20231204"
) -> pd.DataFrame:
"""
FR007 利率互换曲线历史数据; 只能获取近一年的数据
https://www.chinamoney.com.cn/chinese/bkcurvfxhis/?cfgItemType=72&curveType=FR007
:param start_date: 开始日期, 开始和结束日期不得超过一个月
:type start_date: str
:param end_date: 结束日期, 开始和结束日期不得超过一个月
:type end_date: str
:return: FR007利率互换曲线历史数据
:rtype: pandas.DataFrame
"""
bond_china_close_return_map()
start_date = "-".join([start_date[:4], start_date[4:6], start_date[6:]])
end_date = "-".join([end_date[:4], end_date[4:6], end_date[6:]])
url = "https://www.chinamoney.com.cn/ags/ms/cm-u-bk-shibor/IfccHis"
params = {
"cfgItemType": "72",
"interestRateType": "0",
"startDate": start_date,
"endDate": end_date,
"bidAskType": "",
"lang": "CN",
"quoteTime": "全部",
"pageSize": "5000",
"pageNum": "1",
}
headers = {
"Accept": "application/json, text/javascript, */*; q=0.01",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
"Cache-Control": "no-cache",
"Connection": "keep-alive",
"Content-Length": "0",
"Host": "www.chinamoney.com.cn",
"Origin": "https://www.chinamoney.com.cn",
"Pragma": "no-cache",
"Referer": "https://www.chinamoney.com.cn/chinese/bkcurvfxhis/?cfgItemType=72&curveType=FR007",
"sec-ch-ua": '"Google Chrome";v="107", "Chromium";v="107", "Not=A?Brand";v="24"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"Windows"',
"Sec-Fetch-Dest": "empty",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Site": "same-origin",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/107.0.0.0 Safari/537.36",
"X-Requested-With": "XMLHttpRequest",
}
r = requests.post(url, data=params, headers=headers)
data_json = r.json()
temp_df = pd.DataFrame(data_json["records"])
temp_df.columns = [
"日期",
"_",
"_",
"时刻",
"_",
"_",
"_",
"_",
"_",
"价格类型",
"_",
"曲线名称",
"_",
"_",
"_",
"_",
"data",
]
price_df = pd.DataFrame([item for item in temp_df["data"]])
price_df.columns = [
"1M",
"3M",
"6M",
"9M",
"1Y",
"2Y",
"3Y",
"4Y",
"5Y",
"7Y",
"10Y",
]
big_df = pd.concat(objs=[temp_df, price_df], axis=1)
big_df = big_df[
[
"日期",
"曲线名称",
"时刻",
"价格类型",
"1M",
"3M",
"6M",
"9M",
"1Y",
"2Y",
"3Y",
"4Y",
"5Y",
"7Y",
"10Y",
]
]
big_df["日期"] = pd.to_datetime(big_df["日期"], errors="coerce").dt.date
big_df["1M"] = pd.to_numeric(big_df["1M"], errors="coerce")
big_df["3M"] = pd.to_numeric(big_df["3M"], errors="coerce")
big_df["6M"] = pd.to_numeric(big_df["6M"], errors="coerce")
big_df["9M"] = pd.to_numeric(big_df["9M"], errors="coerce")
big_df["1Y"] = pd.to_numeric(big_df["1Y"], errors="coerce")
big_df["2Y"] = pd.to_numeric(big_df["2Y"], errors="coerce")
big_df["3Y"] = pd.to_numeric(big_df["3Y"], errors="coerce")
big_df["4Y"] = pd.to_numeric(big_df["4Y"], errors="coerce")
big_df["5Y"] = pd.to_numeric(big_df["5Y"], errors="coerce")
big_df["7Y"] = pd.to_numeric(big_df["7Y"], errors="coerce")
big_df["10Y"] = pd.to_numeric(big_df["10Y"], errors="coerce")
big_df.sort_values(["日期"], inplace=True, ignore_index=True)
return big_df
def macro_china_bond_public() -> pd.DataFrame:
"""
中国-债券信息披露-债券发行
https://www.chinamoney.com.cn/chinese/xzjfx/
:return: 债券发行
:rtype: pandas.DataFrame
"""
bond_china_close_return_map()
url = "https://www.chinamoney.com.cn/ags/ms/cm-u-bond-an/bnBondEmit"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/107.0.0.0 Safari/537.36",
}
payload = {
"enty": "",
"bondType": "",
"bondNameCode": "",
"leadUnderwriter": "",
"pageNo": "1",
"pageSize": "10",
"limit": "1",
}
r = requests.post(url, data=payload, headers=headers)
data_json = r.json()
total_page = int(data_json["data"]["pageTotalSize"]) + 1
big_df = pd.DataFrame()
tqdm = get_tqdm()
for page in tqdm(range(1, total_page), leave=False):
payload.update({"pageNo": page})
r = requests.post(url, data=payload, headers=headers)
data_json = r.json()
temp_df = pd.DataFrame(data_json["records"])
big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
big_df.columns = [
"债券全称",
"债券类型",
"-",
"发行日期",
"-",
"计息方式",
"-",
"债券期限",
"-",
"债券评级",
"-",
"价格",
"计划发行量",
]
big_df = big_df[
[
"债券全称",
"债券类型",
"发行日期",
"计息方式",
"价格",
"债券期限",
"计划发行量",
"债券评级",
]
]
big_df["价格"] = pd.to_numeric(big_df["价格"], errors="coerce")
big_df["计划发行量"] = pd.to_numeric(big_df["计划发行量"], errors="coerce")
return big_df
if __name__ == "__main__":
bond_china_close_return_df = bond_china_close_return(
symbol="同业存单(AAA)", period="1", start_date="20240607", end_date="20240607"
)
print(bond_china_close_return_df)
macro_china_swap_rate_df = macro_china_swap_rate(
start_date="20251010", end_date="20251208"
)
print(macro_china_swap_rate_df)
macro_china_bond_public_df = macro_china_bond_public()
print(macro_china_bond_public_df)
@@ -0,0 +1,344 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2025/5/16 19:00
Desc: 债券-集思录-可转债
集思录:https://www.jisilu.cn/data/cbnew/#cb
"""
from io import StringIO
import pandas as pd
import requests
import time
from akshare.utils import demjson
def bond_cb_index_jsl() -> pd.DataFrame:
"""
首页-可转债-集思录可转债等权指数
https://www.jisilu.cn/web/data/cb/index
:return: 集思录可转债等权指数
:rtype: pandas.DataFrame
"""
url = "https://www.jisilu.cn/webapi/cb/index_history/"
r = requests.get(url)
data_dict = demjson.decode(r.text)["data"]
temp_df = pd.DataFrame(data_dict)
return temp_df
def bond_cb_jsl(cookie: str = None) -> pd.DataFrame:
"""
集思录可转债
https://www.jisilu.cn/data/cbnew/#cb
:param cookie: 输入获取到的游览器 cookie
:type cookie: str
:return: 集思录可转债
:rtype: pandas.DataFrame
"""
url = "https://www.jisilu.cn/data/cbnew/cb_list_new/"
headers = {
"accept": "application/json, text/javascript, */*; q=0.01",
"accept-encoding": "gzip, deflate, br",
"accept-language": "zh-CN,zh;q=0.9,en;q=0.8",
"cache-control": "no-cache",
"content-length": "220",
"content-type": "application/x-www-form-urlencoded; charset=UTF-8",
"cookie": cookie,
"origin": "https://www.jisilu.cn",
"pragma": "no-cache",
"referer": "https://www.jisilu.cn/data/cbnew/",
"sec-ch-ua": '" Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"',
"sec-ch-ua-mobile": "?0",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-origin",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/91.0.4472.164 Safari/537.36",
"x-requested-with": "XMLHttpRequest",
}
params = {
"___jsl": f"LST___t={int(time.time() * 1000)}",
}
payload = {
"fprice": "",
"tprice": "",
"curr_iss_amt": "",
"volume": "",
"svolume": "",
"premium_rt": "",
"ytm_rt": "",
"market": "",
"rating_cd": "",
"is_search": "N",
"market_cd[]": "shmb", # noqa: F601
"market_cd[]": "shkc", # noqa: F601
"market_cd[]": "szmb", # noqa: F601
"market_cd[]": "szcy", # noqa: F601
"btype": "",
"listed": "Y",
"qflag": "N",
"sw_cd": "",
"bond_ids": "",
"rp": "50",
}
r = requests.post(url, params=params, json=payload, headers=headers)
data_json = r.json()
temp_df = pd.DataFrame([item["cell"] for item in data_json["rows"]])
temp_df.rename(
columns={
"bond_id": "代码",
"bond_nm": "转债名称",
"price": "现价",
"increase_rt": "涨跌幅",
"stock_id": "正股代码",
"stock_nm": "正股名称",
"sprice": "正股价",
"sincrease_rt": "正股涨跌",
"pb": "正股PB",
"convert_price": "转股价",
"convert_value": "转股价值",
"premium_rt": "转股溢价率",
"dblow": "双低",
"rating_cd": "债券评级",
"put_convert_price": "回售触发价",
"force_redeem_price": "强赎触发价",
"convert_amt_ratio": "转债占比",
"maturity_dt": "到期时间",
"year_left": "剩余年限",
"curr_iss_amt": "剩余规模",
"volume": "成交额",
"turnover_rt": "换手率",
"ytm_rt": "到期税前收益",
},
inplace=True,
)
temp_df = temp_df[
[
"代码",
"转债名称",
"现价",
"涨跌幅",
"正股代码",
"正股名称",
"正股价",
"正股涨跌",
"正股PB",
"转股价",
"转股价值",
"转股溢价率",
"债券评级",
"回售触发价",
"强赎触发价",
"转债占比",
"到期时间",
"剩余年限",
"剩余规模",
"成交额",
"换手率",
"到期税前收益",
"双低",
]
]
temp_df["到期时间"] = pd.to_datetime(temp_df["到期时间"], errors="coerce").dt.date
temp_df["现价"] = pd.to_numeric(temp_df["现价"], errors="coerce")
temp_df["涨跌幅"] = pd.to_numeric(temp_df["涨跌幅"], errors="coerce")
temp_df["正股价"] = pd.to_numeric(temp_df["正股价"], errors="coerce")
temp_df["正股涨跌"] = pd.to_numeric(temp_df["正股涨跌"], errors="coerce")
temp_df["正股PB"] = pd.to_numeric(temp_df["正股PB"], errors="coerce")
temp_df["转股价"] = pd.to_numeric(temp_df["转股价"], errors="coerce")
temp_df["转股价值"] = pd.to_numeric(temp_df["转股价值"], errors="coerce")
temp_df["转股溢价率"] = pd.to_numeric(temp_df["转股溢价率"], errors="coerce")
temp_df["回售触发价"] = pd.to_numeric(temp_df["回售触发价"], errors="coerce")
temp_df["强赎触发价"] = pd.to_numeric(temp_df["强赎触发价"], errors="coerce")
temp_df["转债占比"] = pd.to_numeric(temp_df["转债占比"], errors="coerce")
temp_df["剩余年限"] = pd.to_numeric(temp_df["剩余年限"], errors="coerce")
temp_df["剩余规模"] = pd.to_numeric(temp_df["剩余规模"], errors="coerce")
temp_df["成交额"] = pd.to_numeric(temp_df["成交额"], errors="coerce")
temp_df["换手率"] = pd.to_numeric(temp_df["换手率"], errors="coerce")
temp_df["到期税前收益"] = pd.to_numeric(temp_df["到期税前收益"], errors="coerce")
return temp_df
def bond_cb_redeem_jsl() -> pd.DataFrame:
"""
集思录可转债-强赎
https://www.jisilu.cn/data/cbnew/#redeem
:return: 集思录可转债-强赎
:rtype: pandas.DataFrame
"""
url = "https://www.jisilu.cn/data/cbnew/redeem_list/"
headers = {
"Accept": "application/json, text/javascript, */*; q=0.01",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
"Cache-Control": "no-cache",
"Connection": "keep-alive",
"Content-Length": "5",
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"Host": "www.jisilu.cn",
"Origin": "https://www.jisilu.cn",
"Pragma": "no-cache",
"Referer": "https://www.jisilu.cn/data/cbnew/",
"sec-ch-ua": '" Not A;Brand";v="99", "Chromium";v="101", "Google Chrome";v="101"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"Windows"',
"Sec-Fetch-Dest": "empty",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Site": "same-origin",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/101.0.4951.67 Safari/537.36",
"X-Requested-With": "XMLHttpRequest",
}
params = {
"___jsl": "LST___t=1653394005966",
}
payload = {
"rp": "50",
}
r = requests.post(url, params=params, json=payload, headers=headers)
data_json = r.json()
temp_df = pd.DataFrame([item["cell"] for item in data_json["rows"]])
temp_df.rename(
columns={
"bond_id": "代码",
"bond_nm": "名称",
"price": "现价",
"stock_id": "正股代码",
"stock_nm": "正股名称",
"margin_flg": "-",
"btype": "-",
"orig_iss_amt": "规模",
"curr_iss_amt": "剩余规模",
"convert_dt": "转股起始日",
"convert_price": "转股价",
"next_put_dt": "-",
"redeem_dt": "-",
"force_redeem": "-",
"redeem_flag": "-",
"redeem_price": "-",
"redeem_price_ratio": "强赎触发比",
"real_force_redeem_price": "强赎价",
"redeem_remain_days": "-",
"redeem_real_days": "-",
"redeem_total_days": "-",
"recount_dt": "-",
"redeem_count_days": "-",
"redeem_tc": "强赎条款",
"sprice": "正股价",
"delist_dt": "最后交易日",
"maturity_dt": "到期日",
"redeem_icon": "强赎状态",
"redeem_orders": "-",
"at_maturity": "-",
"redeem_count": "强赎天计数",
"after_next_put_dt": "-",
"force_redeem_price": "强赎触发价",
},
inplace=True,
)
temp_df = temp_df[
[
"代码",
"名称",
"现价",
"正股代码",
"正股名称",
"规模",
"剩余规模",
"转股起始日",
"最后交易日",
"到期日",
"转股价",
"强赎触发比",
"强赎触发价",
"正股价",
"强赎价",
"强赎天计数",
"强赎条款",
"强赎状态",
]
]
temp_df["现价"] = pd.to_numeric(temp_df["现价"], errors="coerce")
temp_df["规模"] = pd.to_numeric(temp_df["规模"], errors="coerce")
temp_df["剩余规模"] = pd.to_numeric(temp_df["剩余规模"], errors="coerce")
temp_df["转股起始日"] = pd.to_datetime(
temp_df["转股起始日"], errors="coerce"
).dt.date
temp_df["最后交易日"] = pd.to_datetime(
temp_df["最后交易日"], errors="coerce"
).dt.date
temp_df["到期日"] = pd.to_datetime(temp_df["到期日"], errors="coerce").dt.date
temp_df["转股价"] = pd.to_numeric(temp_df["转股价"], errors="coerce")
temp_df["强赎触发比"] = pd.to_numeric(
temp_df["强赎触发比"].str.strip("%"), errors="coerce"
)
temp_df["强赎触发价"] = pd.to_numeric(temp_df["强赎触发价"], errors="coerce")
temp_df["正股价"] = pd.to_numeric(temp_df["正股价"], errors="coerce")
temp_df["强赎价"] = pd.to_numeric(temp_df["强赎价"], errors="coerce")
temp_df["强赎天计数"] = temp_df["强赎天计数"].replace(
r"^.*?(\d{1,2}\/\d{1,2} \| \d{1,2}).*?$", r"\1", regex=True
)
temp_df["强赎状态"] = temp_df["强赎状态"].map(
{
"R": "已公告强赎",
"O": "公告要强赎",
"G": "公告不强赎",
"B": "已满足强赎条件",
"": "",
}
)
return temp_df
def bond_cb_adj_logs_jsl(symbol: str = "128013") -> pd.DataFrame:
"""
集思录-可转债转股价-调整记录
https://www.jisilu.cn/data/cbnew/#cb
:param symbol: 可转债代码
:type symbol: str
:return: 转股价调整记录
:rtype: pandas.DataFrame
"""
url = f"https://www.jisilu.cn/data/cbnew/adj_logs/?bond_id={symbol}"
r = requests.get(url)
data_text = r.text
if "</table>" not in data_text:
# 1. 该可转债没有转股价调整记录,服务端返回文本 '暂无数据'
# 2. 无效可转债代码,服务端返回 {"timestamp":1639565628,"isError":1,"msg":"无效代码格式"}
# 以上两种情况,返回空的 DataFrame
return pd.DataFrame()
else:
temp_df = pd.read_html(StringIO(data_text), parse_dates=True)[0]
temp_df.columns = [item.replace(" ", "") for item in temp_df.columns]
temp_df["下修前转股价"] = pd.to_numeric(
temp_df["下修前转股价"], errors="coerce"
)
temp_df["下修后转股价"] = pd.to_numeric(
temp_df["下修后转股价"], errors="coerce"
)
temp_df["下修底价"] = pd.to_numeric(temp_df["下修底价"], errors="coerce")
temp_df["股东大会日"] = pd.to_datetime(
temp_df["股东大会日"], format="%Y-%m-%d", errors="coerce"
).dt.date
temp_df["新转股价生效日期"] = pd.to_datetime(
temp_df["新转股价生效日期"], format="%Y-%m-%d", errors="coerce"
).dt.date
return temp_df
if __name__ == "__main__":
bond_cb_index_jsl_df = bond_cb_index_jsl()
print(bond_cb_index_jsl_df)
bond_cb_jsl_df = bond_cb_jsl(cookie="")
print(bond_cb_jsl_df)
bond_cb_redeem_jsl_df = bond_cb_redeem_jsl()
print(bond_cb_redeem_jsl_df)
bond_cb_adj_logs_jsl_df = bond_cb_adj_logs_jsl(symbol="128013")
print(bond_cb_adj_logs_jsl_df)
@@ -0,0 +1,147 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2025/4/5 17:00
Desc: 东方财富网-数据中心-经济数据-中美国债收益率
https://data.eastmoney.com/cjsj/zmgzsyl.html
"""
import pandas as pd
import requests
from akshare.utils.tqdm import get_tqdm
def bond_zh_us_rate(start_date: str = "19901219") -> pd.DataFrame:
"""
东方财富网-数据中心-经济数据-中美国债收益率
https://data.eastmoney.com/cjsj/zmgzsyl.html
:param start_date: 开始统计时间
:type start_date: str
:return: 中美国债收益率
:rtype: pandas.DataFrame
"""
url = "https://datacenter.eastmoney.com/api/data/get"
params = {
"type": "RPTA_WEB_TREASURYYIELD",
"sty": "ALL",
"st": "SOLAR_DATE",
"sr": "-1",
"token": "894050c76af8597a853f5b408b759f5d",
"p": "1",
"ps": "500",
"pageNo": "1",
"pageNum": "1",
}
r = requests.get(url, params=params)
data_json = r.json()
total_page = data_json["result"]["pages"]
big_df = pd.DataFrame()
tqdm = get_tqdm()
for page in tqdm(range(1, total_page + 1), leave=False):
params = {
"type": "RPTA_WEB_TREASURYYIELD",
"sty": "ALL",
"st": "SOLAR_DATE",
"sr": "-1",
"token": "894050c76af8597a853f5b408b759f5d",
"p": page,
"ps": "500",
"pageNo": page,
"pageNum": page,
}
r = requests.get(url, params=params)
data_json = r.json()
temp_df = pd.DataFrame(data_json["result"]["data"])
for col in temp_df.columns:
if temp_df[col].isnull().all(): # 检查列是否包含 None 或 NaN
temp_df[col] = pd.to_numeric(temp_df[col], errors="coerce")
if big_df.empty:
big_df = temp_df
else:
big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
temp_date_list = pd.to_datetime(big_df["SOLAR_DATE"]).dt.date.to_list()
if pd.to_datetime(start_date) in pd.date_range(
temp_date_list[-1], temp_date_list[0]
):
break
big_df.rename(
columns={
"SOLAR_DATE": "日期",
"EMM00166462": "中国国债收益率5年",
"EMM00166466": "中国国债收益率10年",
"EMM00166469": "中国国债收益率30年",
"EMM00588704": "中国国债收益率2年",
"EMM01276014": "中国国债收益率10年-2年",
"EMG00001306": "美国国债收益率2年",
"EMG00001308": "美国国债收益率5年",
"EMG00001310": "美国国债收益率10年",
"EMG00001312": "美国国债收益率30年",
"EMG01339436": "美国国债收益率10年-2年",
"EMM00000024": "中国GDP年增率",
"EMG00159635": "美国GDP年增率",
},
inplace=True,
)
big_df = big_df[
[
"日期",
"中国国债收益率2年",
"中国国债收益率5年",
"中国国债收益率10年",
"中国国债收益率30年",
"中国国债收益率10年-2年",
"中国GDP年增率",
"美国国债收益率2年",
"美国国债收益率5年",
"美国国债收益率10年",
"美国国债收益率30年",
"美国国债收益率10年-2年",
"美国GDP年增率",
]
]
big_df["日期"] = pd.to_datetime(big_df["日期"], errors="coerce")
big_df["中国国债收益率2年"] = pd.to_numeric(
big_df["中国国债收益率2年"], errors="coerce"
)
big_df["中国国债收益率5年"] = pd.to_numeric(
big_df["中国国债收益率5年"], errors="coerce"
)
big_df["中国国债收益率10年"] = pd.to_numeric(
big_df["中国国债收益率10年"], errors="coerce"
)
big_df["中国国债收益率30年"] = pd.to_numeric(
big_df["中国国债收益率30年"], errors="coerce"
)
big_df["中国国债收益率10年-2年"] = pd.to_numeric(
big_df["中国国债收益率10年-2年"], errors="coerce"
)
big_df["中国GDP年增率"] = pd.to_numeric(big_df["中国GDP年增率"], errors="coerce")
big_df["美国国债收益率2年"] = pd.to_numeric(
big_df["美国国债收益率2年"], errors="coerce"
)
big_df["美国国债收益率5年"] = pd.to_numeric(
big_df["美国国债收益率5年"], errors="coerce"
)
big_df["美国国债收益率10年"] = pd.to_numeric(
big_df["美国国债收益率10年"], errors="coerce"
)
big_df["美国国债收益率30年"] = pd.to_numeric(
big_df["美国国债收益率30年"], errors="coerce"
)
big_df["美国国债收益率10年-2年"] = pd.to_numeric(
big_df["美国国债收益率10年-2年"], errors="coerce"
)
big_df["美国GDP年增率"] = pd.to_numeric(big_df["美国GDP年增率"], errors="coerce")
big_df.sort_values("日期", inplace=True)
big_df.set_index(["日期"], inplace=True)
big_df = big_df[pd.to_datetime(start_date) :]
big_df.reset_index(inplace=True)
big_df["日期"] = pd.to_datetime(big_df["日期"]).dt.date
return big_df
if __name__ == "__main__":
bond_zh_us_rate_df = bond_zh_us_rate(start_date="19901219")
print(bond_zh_us_rate_df)
@@ -0,0 +1,104 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2026/2/4 17:00
Desc: 新浪财经-债券-中国/美国国债收益率
https://vip.stock.finance.sina.com.cn/mkt/#hs_z
"""
import pandas as pd
import requests
def bond_gb_zh_sina(symbol: str = "中国10年期国债") -> pd.DataFrame:
"""
新浪财经-债券-中国国债收益率行情数据
https://stock.finance.sina.com.cn/forex/globalbd/cn10yt.html
:param symbol: choice of {"中国1年期国债", "中国2年期国债", "中国3年期国债", "中国5年期国债", "中国7年期国债", "中国10年期国债", "中国15年期国债", "中国20年期国债", "中国30年期国债"}
:type symbol: str
:return: 中国国债收益率行情数据
:rtype: pandas.DataFrame
"""
symbol_map = {
"中国1年期国债": "CN1YT",
"中国2年期国债": "CN2YT",
"中国3年期国债": "CN3YT",
"中国5年期国债": "CN5YT",
"中国7年期国债": "CN7YT",
"中国10年期国债": "CN10YT",
"中国15年期国债": "CN15YT",
"中国20年期国债": "CN20YT",
"中国30年期国债": "CN30YT",
}
url = f"https://bond.finance.sina.com.cn/hq/gb/daily?symbol={symbol_map[symbol]}"
r = requests.get(url)
data_json = r.json()
temp_df = pd.DataFrame(data_json["result"]["data"])
temp_df.columns = [
"date",
"open",
"high",
"low",
"close",
"volume",
]
temp_df["date"] = pd.to_datetime(temp_df["date"], errors="coerce").dt.date
temp_df["open"] = pd.to_numeric(temp_df["open"], errors="coerce")
temp_df["high"] = pd.to_numeric(temp_df["high"], errors="coerce")
temp_df["low"] = pd.to_numeric(temp_df["low"], errors="coerce")
temp_df["close"] = pd.to_numeric(temp_df["close"], errors="coerce")
temp_df["volume"] = pd.to_numeric(temp_df["volume"], errors="coerce")
return temp_df
def bond_gb_us_sina(symbol: str = "美国10年期国债") -> pd.DataFrame:
"""
新浪财经-债券-美国国债收益率行情数据
https://stock.finance.sina.com.cn/forex/globalbd/cn10yt.html
:param symbol: choice of {"美国1月期国债", "美国2月期国债", "美国3月期国债", "美国4月期国债", "美国6月期国债", "美国1年期国债", "美国2年期国债", "美国3年期国债", "美国5年期国债", "美国7年期国债", "美国10年期国债", "美国20年期国债", "美国30年期国债"}
:type symbol: str
:return: 美国国债收益率行情数据
:rtype: pandas.DataFrame
"""
symbol_map = {
"美国1月期国债": "US1MT",
"美国2月期国债": "US2MT",
"美国3月期国债": "US3MT",
"美国4月期国债": "US4MT",
"美国6月期国债": "US6MT",
"美国1年期国债": "US1YT",
"美国2年期国债": "US2YT",
"美国3年期国债": "US3YT",
"美国5年期国债": "US5YT",
"美国7年期国债": "US7YT",
"美国10年期国债": "US10YT",
"美国20年期国债": "US20YT",
"美国30年期国债": "US30YT",
}
url = f"https://bond.finance.sina.com.cn/hq/gb/daily?symbol={symbol_map[symbol]}"
r = requests.get(url)
data_json = r.json()
temp_df = pd.DataFrame(data_json["result"]["data"])
temp_df.columns = [
"date",
"open",
"high",
"low",
"close",
"volume",
]
temp_df["date"] = pd.to_datetime(temp_df["date"], errors="coerce").dt.date
temp_df["open"] = pd.to_numeric(temp_df["open"], errors="coerce")
temp_df["high"] = pd.to_numeric(temp_df["high"], errors="coerce")
temp_df["low"] = pd.to_numeric(temp_df["low"], errors="coerce")
temp_df["close"] = pd.to_numeric(temp_df["close"], errors="coerce")
temp_df["volume"] = pd.to_numeric(temp_df["volume"], errors="coerce")
return temp_df
if __name__ == "__main__":
bond_gb_zh_sina_df = bond_gb_zh_sina(symbol="中国10年期国债")
print(bond_gb_zh_sina_df)
bond_gb_us_sina_df = bond_gb_us_sina(symbol="美国10年期国债")
print(bond_gb_us_sina_df)
@@ -0,0 +1,231 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2024/5/10 14:00
Desc: 中国外汇交易中心暨全国银行间同业拆借中心
https://www.chinamoney.com.cn/chinese/scsjzqxx/
"""
import functools
import pandas as pd
import requests
from akshare.bond.bond_china import bond_china_close_return_map
from akshare.utils.tqdm import get_tqdm
@functools.lru_cache()
def bond_info_cm_query(symbol: str = "评级等级") -> pd.DataFrame:
"""
中国外汇交易中心暨全国银行间同业拆借中心-查询相关指标的参数
https://www.chinamoney.com.cn/chinese/scsjzqxx/
:param symbol: choice of {"主承销商", "债券类型", "息票类型", "发行年份", "评级等级"}
:type symbol: str
:return: 查询相关指标的参数
:rtype: pandas.DataFrame
"""
bond_china_close_return_map()
if symbol == "主承销商":
url = "https://www.chinamoney.com.cn/ags/ms/cm-u-bond-md/EntyFullNameSearchCondition"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/109.0.0.0 Safari/537.36"
}
r = requests.post(url, headers=headers)
data_json = r.json()
temp_df = pd.DataFrame(data_json["data"]["enty"])
temp_df.columns = ["code", "name"]
temp_df = temp_df[["name", "code"]]
return temp_df
else:
symbol_map = {
"债券类型": "bondType",
"息票类型": "couponType",
"发行年份": "issueYear",
"评级等级": "bondRtngShrt",
}
url = "https://www.chinamoney.com.cn/ags/ms/cm-u-bond-md/BondBaseInfoSearchCondition"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/109.0.0.0 Safari/537.36"
}
r = requests.post(url, headers=headers)
data_json = r.json()
temp_df = pd.DataFrame(data_json["data"][f"{symbol_map[symbol]}"])
if temp_df.shape[1] == 1:
temp_df.columns = ["name"]
temp_df["code"] = temp_df["name"]
temp_df.columns = ["code", "name"]
temp_df = temp_df[["name", "code"]]
return temp_df
@functools.lru_cache()
def bond_info_cm(
bond_name: str = "",
bond_code: str = "",
bond_issue: str = "",
bond_type: str = "",
coupon_type: str = "",
issue_year: str = "",
underwriter: str = "",
grade: str = "",
) -> pd.DataFrame:
"""
中国外汇交易中心暨全国银行间同业拆借中心-数据-债券信息-信息查询
https://www.chinamoney.com.cn/chinese/scsjzqxx/
:param bond_name: 债券名称
:type bond_name: str
:param bond_code: 债券代码
:type bond_code: str
:param bond_issue: 发行人/受托机构
:type bond_issue: str
:param bond_type: 债券类型
:type bond_type: str
:param coupon_type: 息票类型
:type coupon_type: str
:param issue_year: 发行年份
:type issue_year: str
:param underwriter: 主承销商
:type underwriter: str
:param grade: 评级等级
:type grade: str
:return: 信息查询结果
:rtype: pandas.DataFrame
"""
bond_china_close_return_map()
if bond_type:
bond_type_df = bond_info_cm_query(symbol="债券类型")
bond_type_df_value = bond_type_df[bond_type_df["name"] == bond_type][
"code"
].values[0]
else:
bond_type_df_value = ""
if coupon_type:
coupon_type_df = bond_info_cm_query(symbol="息票类型")
coupon_type_df_value = coupon_type_df[coupon_type_df["name"] == coupon_type][
"code"
].values[0]
else:
coupon_type_df_value = ""
if underwriter:
underwriter_df = bond_info_cm_query(symbol="主承销商")
underwriter_value = underwriter_df[underwriter_df["name"] == underwriter][
"code"
].values[0]
else:
underwriter_value = ""
url = "https://www.chinamoney.com.cn/ags/ms/cm-u-bond-md/BondMarketInfoList2"
payload = {
"pageNo": "1",
"pageSize": "15",
"bondName": bond_name,
"bondCode": bond_code,
"issueEnty": bond_issue,
"bondType": bond_type_df_value if bond_type_df_value else "",
"bondSpclPrjctVrty": "",
"couponType": coupon_type_df_value if coupon_type_df_value else "",
"issueYear": issue_year,
"entyDefinedCode": underwriter_value if underwriter_value else "",
"rtngShrt": grade,
}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/109.0.0.0 Safari/537.36"
}
r = requests.post(url, data=payload, headers=headers)
data_json = r.json()
total_page = data_json["data"]["pageTotal"]
big_df = pd.DataFrame()
tqdm = get_tqdm()
for page in tqdm(range(1, total_page + 1), leave=False):
payload.update({"pageNo": page})
r = requests.post(url, data=payload, headers=headers)
data_json = r.json()
temp_df = pd.DataFrame(data_json["data"]["resultList"])
big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
big_df.rename(
columns={
"bondDefinedCode": "查询代码",
"bondName": "债券简称",
"bondCode": "债券代码",
"issueStartDate": "发行日期",
"issueEndDate": "-",
"bondTypeCode": "-",
"bondType": "债券类型",
"entyFullName": "发行人/受托机构",
"entyDefinedCode": "-",
"debtRtng": "最新债项评级",
"isin": "-",
"inptTp": "-",
},
inplace=True,
)
big_df = big_df[
[
"债券简称",
"债券代码",
"发行人/受托机构",
"债券类型",
"发行日期",
"最新债项评级",
"查询代码",
]
]
return big_df
@functools.lru_cache()
def bond_info_detail_cm(symbol: str = "淮安农商行CDSD2022021012") -> pd.DataFrame:
"""
中国外汇交易中心暨全国银行间同业拆借中心-数据-债券信息-信息查询-债券详情
https://www.chinamoney.com.cn/chinese/zqjc/?bondDefinedCode=egfjh08154
:param symbol: 债券简称
:type symbol: str
:return: 债券详情
:rtype: pandas.DataFrame
"""
bond_china_close_return_map()
url = "https://www.chinamoney.com.cn/ags/ms/cm-u-bond-md/BondDetailInfo"
inner_bond_info_cm_df = bond_info_cm(bond_name=symbol)
bond_code = inner_bond_info_cm_df["查询代码"].values[0]
payload = {"bondDefinedCode": bond_code}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/109.0.0.0 Safari/537.36",
"host": "www.chinamoney.com.cn",
"origin": "https://www.chinamoney.com.cn",
"referer": "https://www.chinamoney.com.cn/chinese/zqjc/?bondDefinedCode=egfjh08154",
}
r = requests.post(url, data=payload, headers=headers)
data_json = r.json()
data_dict = data_json["data"]["bondBaseInfo"]
if data_dict["creditRateEntyList"]:
del data_dict["creditRateEntyList"]
if data_dict["exerciseInfoList"]:
del data_dict["exerciseInfoList"]
temp_df = pd.DataFrame.from_dict(data_dict, orient="index")
temp_df.reset_index(inplace=True)
temp_df.columns = ["name", "value"]
return temp_df
if __name__ == "__main__":
bond_info_cm_df = bond_info_cm(
bond_name="",
bond_code="",
bond_issue="",
bond_type="短期融资券",
coupon_type="零息式",
issue_year="2019",
grade="A-1",
underwriter="重庆农村商业银行股份有限公司",
)
print(bond_info_cm_df)
bond_info_detail_cm_df = bond_info_detail_cm(symbol="19渝机电CP002")
print(bond_info_detail_cm_df)
@@ -0,0 +1,574 @@
# -*- coding:utf-8 -*-
# !/usr/bin/env python
"""
Date: 2024/6/19 22:00
Desc: 巨潮资讯-数据中心-专题统计-债券报表-债券发行
http://webapi.cninfo.com.cn/#/thematicStatistics
"""
import pandas as pd
import requests
import py_mini_racer
from akshare.datasets import get_ths_js
def _get_file_content_cninfo(file: str = "cninfo.js") -> str:
"""
获取 JS 文件的内容
:param file: JS 文件名
:type file: str
:return: 文件内容
:rtype: str
"""
setting_file_path = get_ths_js(file)
with open(setting_file_path, encoding="utf-8") as f:
file_data = f.read()
return file_data
def bond_treasure_issue_cninfo(
start_date: str = "20210910", end_date: str = "20211109"
) -> pd.DataFrame:
"""
巨潮资讯-数据中心-专题统计-债券报表-债券发行-国债发行
http://webapi.cninfo.com.cn/#/thematicStatistics
:param start_date: 开始统计时间
:type start_date: str
:param end_date: 结束统计数据
:type end_date: str
:return: 国债发行
:rtype: pandas.DataFrame
"""
url = "http://webapi.cninfo.com.cn/api/sysapi/p_sysapi1120"
js_code = py_mini_racer.MiniRacer()
js_content = _get_file_content_cninfo("cninfo.js")
js_code.eval(js_content)
mcode = js_code.call("getResCode1")
headers = {
"Accept": "*/*",
"Accept-Enckey": mcode,
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
"Cache-Control": "no-cache",
"Content-Length": "0",
"Host": "webapi.cninfo.com.cn",
"Origin": "http://webapi.cninfo.com.cn",
"Pragma": "no-cache",
"Proxy-Connection": "keep-alive",
"Referer": "http://webapi.cninfo.com.cn/",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/93.0.4577.63 Safari/537.36",
"X-Requested-With": "XMLHttpRequest",
}
params = {
"sdate": "-".join([start_date[:4], start_date[4:6], start_date[6:]]),
"edate": "-".join([end_date[:4], end_date[4:6], end_date[6:]]),
}
r = requests.post(url, headers=headers, params=params)
data_json = r.json()
temp_df = pd.DataFrame(data_json["records"])
temp_df.rename(
columns={
"F009D": "缴款日",
"SECNAME": "债券简称",
"DECLAREDATE": "公告日期",
"F004D": "发行起始日",
"F003D": "发行终止日",
"F008N": "单位面值",
"SECCODE": "债券代码",
"F007N": "发行价格",
"F006N": "计划发行总量",
"F005N": "实际发行总量",
"F028N": "增发次数",
"BONDNAME": "债券名称",
"F014V": "发行对象",
"F002V": "交易市场",
"F013V": "发行方式",
},
inplace=True,
)
temp_df = temp_df[
[
"债券代码",
"债券简称",
"发行起始日",
"发行终止日",
"计划发行总量",
"实际发行总量",
"发行价格",
"单位面值",
"缴款日",
"增发次数",
"交易市场",
"发行方式",
"发行对象",
"公告日期",
"债券名称",
]
]
temp_df["发行起始日"] = pd.to_datetime(
temp_df["发行起始日"], errors="coerce"
).dt.date
temp_df["发行终止日"] = pd.to_datetime(
temp_df["发行终止日"], errors="coerce"
).dt.date
temp_df["缴款日"] = pd.to_datetime(temp_df["缴款日"], errors="coerce").dt.date
temp_df["公告日期"] = pd.to_datetime(temp_df["公告日期"], errors="coerce").dt.date
temp_df["计划发行总量"] = pd.to_numeric(temp_df["计划发行总量"], errors="coerce")
temp_df["实际发行总量"] = pd.to_numeric(temp_df["实际发行总量"], errors="coerce")
temp_df["发行价格"] = pd.to_numeric(temp_df["发行价格"], errors="coerce")
temp_df["单位面值"] = pd.to_numeric(temp_df["单位面值"], errors="coerce")
temp_df["增发次数"] = pd.to_numeric(temp_df["增发次数"], errors="coerce")
return temp_df
def bond_local_government_issue_cninfo(
start_date: str = "20210911", end_date: str = "20211110"
) -> pd.DataFrame:
"""
巨潮资讯-数据中心-专题统计-债券报表-债券发行-地方债发行
http://webapi.cninfo.com.cn/#/thematicStatistics
:param start_date: 开始统计时间
:type start_date: str
:param end_date: 开始统计时间
:type end_date: str
:return: 地方债发行
:rtype: pandas.DataFrame
"""
url = "http://webapi.cninfo.com.cn/api/sysapi/p_sysapi1121"
js_code = py_mini_racer.MiniRacer()
js_content = _get_file_content_cninfo("cninfo.js")
js_code.eval(js_content)
mcode = js_code.call("getResCode1")
headers = {
"Accept": "*/*",
"Accept-Enckey": mcode,
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
"Cache-Control": "no-cache",
"Content-Length": "0",
"Host": "webapi.cninfo.com.cn",
"Origin": "http://webapi.cninfo.com.cn",
"Pragma": "no-cache",
"Proxy-Connection": "keep-alive",
"Referer": "http://webapi.cninfo.com.cn/",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/93.0.4577.63 Safari/537.36",
"X-Requested-With": "XMLHttpRequest",
}
params = {
"sdate": "-".join([start_date[:4], start_date[4:6], start_date[6:]]),
"edate": "-".join([end_date[:4], end_date[4:6], end_date[6:]]),
}
r = requests.post(url, headers=headers, params=params)
data_json = r.json()
temp_df = pd.DataFrame(data_json["records"])
temp_df.rename(
columns={
"F009D": "缴款日",
"SECNAME": "债券简称",
"DECLAREDATE": "公告日期",
"F004D": "发行起始日",
"F003D": "发行终止日",
"F008N": "单位面值",
"SECCODE": "债券代码",
"F007N": "发行价格",
"F006N": "计划发行总量",
"F005N": "实际发行总量",
"F028N": "增发次数",
"BONDNAME": "债券名称",
"F014V": "发行对象",
"F002V": "交易市场",
"F013V": "发行方式",
},
inplace=True,
)
temp_df = temp_df[
[
"债券代码",
"债券简称",
"发行起始日",
"发行终止日",
"计划发行总量",
"实际发行总量",
"发行价格",
"单位面值",
"缴款日",
"增发次数",
"交易市场",
"发行方式",
"发行对象",
"公告日期",
"债券名称",
]
]
temp_df["发行起始日"] = pd.to_datetime(
temp_df["发行起始日"], errors="coerce"
).dt.date
temp_df["发行终止日"] = pd.to_datetime(
temp_df["发行终止日"], errors="coerce"
).dt.date
temp_df["缴款日"] = pd.to_datetime(temp_df["缴款日"], errors="coerce").dt.date
temp_df["公告日期"] = pd.to_datetime(temp_df["公告日期"], errors="coerce").dt.date
temp_df["计划发行总量"] = pd.to_numeric(temp_df["计划发行总量"], errors="coerce")
temp_df["实际发行总量"] = pd.to_numeric(temp_df["实际发行总量"], errors="coerce")
temp_df["发行价格"] = pd.to_numeric(temp_df["发行价格"], errors="coerce")
temp_df["单位面值"] = pd.to_numeric(temp_df["单位面值"], errors="coerce")
temp_df["增发次数"] = pd.to_numeric(temp_df["增发次数"], errors="coerce")
return temp_df
def bond_corporate_issue_cninfo(
start_date: str = "20210911", end_date: str = "20211110"
) -> pd.DataFrame:
"""
巨潮资讯-数据中心-专题统计-债券报表-债券发行-企业债发行
http://webapi.cninfo.com.cn/#/thematicStatistics
:param start_date: 开始统计时间
:type start_date: str
:param end_date: 开始统计时间
:type end_date: str
:return: 企业债发行
:rtype: pandas.DataFrame
"""
url = "http://webapi.cninfo.com.cn/api/sysapi/p_sysapi1122"
js_code = py_mini_racer.MiniRacer()
js_content = _get_file_content_cninfo("cninfo.js")
js_code.eval(js_content)
mcode = js_code.call("getResCode1")
headers = {
"Accept": "*/*",
"Accept-Enckey": mcode,
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
"Cache-Control": "no-cache",
"Content-Length": "0",
"Host": "webapi.cninfo.com.cn",
"Origin": "http://webapi.cninfo.com.cn",
"Pragma": "no-cache",
"Proxy-Connection": "keep-alive",
"Referer": "http://webapi.cninfo.com.cn/",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/93.0.4577.63 Safari/537.36",
"X-Requested-With": "XMLHttpRequest",
}
params = {
"sdate": "-".join([start_date[:4], start_date[4:6], start_date[6:]]),
"edate": "-".join([end_date[:4], end_date[4:6], end_date[6:]]),
}
r = requests.post(url, headers=headers, params=params)
data_json = r.json()
temp_df = pd.DataFrame(data_json["records"])
temp_df.rename(
columns={
"SECNAME": "债券简称",
"DECLAREDATE": "公告日期",
"F004D": "交易所网上发行终止日",
"F003D": "交易所网上发行起始日",
"F008N": "发行面值",
"SECCODE": "债券代码",
"F007N": "发行价格",
"F006N": "实际发行总量",
"F005N": "计划发行总量",
"F022N": "最小认购单位",
"F017V": "承销方式",
"F052N": "最低认购额",
"F015V": "发行范围",
"BONDNAME": "债券名称",
"F014V": "发行对象",
"F013V": "发行方式",
"F023V": "募资用途说明",
},
inplace=True,
)
temp_df = temp_df[
[
"债券代码",
"债券简称",
"公告日期",
"交易所网上发行起始日",
"交易所网上发行终止日",
"计划发行总量",
"实际发行总量",
"发行面值",
"发行价格",
"发行方式",
"发行对象",
"发行范围",
"承销方式",
"最小认购单位",
"募资用途说明",
"最低认购额",
"债券名称",
]
]
temp_df["公告日期"] = pd.to_datetime(temp_df["公告日期"], errors="coerce").dt.date
temp_df["交易所网上发行起始日"] = pd.to_datetime(
temp_df["交易所网上发行起始日"], errors="coerce"
).dt.date
temp_df["交易所网上发行终止日"] = pd.to_datetime(
temp_df["交易所网上发行终止日"], errors="coerce"
).dt.date
temp_df["计划发行总量"] = pd.to_numeric(temp_df["计划发行总量"], errors="coerce")
temp_df["实际发行总量"] = pd.to_numeric(temp_df["实际发行总量"], errors="coerce")
temp_df["发行面值"] = pd.to_numeric(temp_df["发行面值"], errors="coerce")
temp_df["发行价格"] = pd.to_numeric(temp_df["发行价格"], errors="coerce")
temp_df["最小认购单位"] = pd.to_numeric(temp_df["最小认购单位"], errors="coerce")
temp_df["最低认购额"] = pd.to_numeric(temp_df["最低认购额"], errors="coerce")
return temp_df
def bond_cov_issue_cninfo(
start_date: str = "20210913", end_date: str = "20211112"
) -> pd.DataFrame:
"""
巨潮资讯-数据中心-专题统计-债券报表-债券发行-可转债发行
http://webapi.cninfo.com.cn/#/thematicStatistics
:param start_date: 开始统计时间
:type start_date: str
:param end_date: 开始统计时间
:type end_date: str
:return: 可转债发行
:rtype: pandas.DataFrame
"""
url = "http://webapi.cninfo.com.cn/api/sysapi/p_sysapi1123"
js_code = py_mini_racer.MiniRacer()
js_content = _get_file_content_cninfo("cninfo.js")
js_code.eval(js_content)
mcode = js_code.call("getResCode1")
headers = {
"Accept": "*/*",
"Accept-Enckey": mcode,
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
"Cache-Control": "no-cache",
"Content-Length": "0",
"Host": "webapi.cninfo.com.cn",
"Origin": "http://webapi.cninfo.com.cn",
"Pragma": "no-cache",
"Proxy-Connection": "keep-alive",
"Referer": "http://webapi.cninfo.com.cn/",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/93.0.4577.63 Safari/537.36",
"X-Requested-With": "XMLHttpRequest",
}
params = {
"sdate": "-".join([start_date[:4], start_date[4:6], start_date[6:]]),
"edate": "-".join([end_date[:4], end_date[4:6], end_date[6:]]),
}
r = requests.post(url, headers=headers, params=params)
data_json = r.json()
temp_df = pd.DataFrame(data_json["records"])
temp_df.rename(
columns={
"F029D": "发行起始日",
"SECNAME": "债券简称",
"F027D": "转股开始日期",
"F003D": "发行终止日",
"F007N": "发行面值",
"F053D": "转股终止日期",
"F005N": "计划发行总量",
"F051D": "网上申购日期",
"F026N": "初始转股价格",
"F066N": "网上申购数量下限",
"F052N": "发行价格",
"BONDNAME": "债券名称",
"F014V": "发行对象",
"F002V": "交易市场",
"F032V": "网上申购简称",
"F086V": "转股代码",
"DECLAREDATE": "公告日期",
"F028D": "债权登记日",
"F004D": "优先申购日",
"F068D": "网上申购中签结果公告日及退款日",
"F054D": "优先申购缴款日",
"F008N": "网上申购数量上限",
"SECCODE": "债券代码",
"F006N": "实际发行总量",
"F067N": "网上申购单位",
"F065N": "配售价格",
"F017V": "承销方式",
"F015V": "发行范围",
"F013V": "发行方式",
"F021V": "募资用途说明",
"F031V": "网上申购代码",
},
inplace=True,
)
temp_df = temp_df[
[
"债券代码",
"债券简称",
"公告日期",
"发行起始日",
"发行终止日",
"计划发行总量",
"实际发行总量",
"发行面值",
"发行价格",
"发行方式",
"发行对象",
"发行范围",
"承销方式",
"募资用途说明",
"初始转股价格",
"转股开始日期",
"转股终止日期",
"网上申购日期",
"网上申购代码",
"网上申购简称",
"网上申购数量上限",
"网上申购数量下限",
"网上申购单位",
"网上申购中签结果公告日及退款日",
"优先申购日",
"配售价格",
"债权登记日",
"优先申购缴款日",
"转股代码",
"交易市场",
"债券名称",
]
]
temp_df["公告日期"] = pd.to_datetime(temp_df["公告日期"], errors="coerce").dt.date
temp_df["发行起始日"] = pd.to_datetime(
temp_df["发行起始日"], errors="coerce"
).dt.date
temp_df["发行终止日"] = pd.to_datetime(
temp_df["发行终止日"], errors="coerce"
).dt.date
temp_df["转股开始日期"] = pd.to_datetime(
temp_df["转股开始日期"], errors="coerce"
).dt.date
temp_df["转股终止日期"] = pd.to_datetime(
temp_df["转股终止日期"], errors="coerce"
).dt.date
temp_df["转股终止日期"] = pd.to_datetime(
temp_df["转股终止日期"], errors="coerce"
).dt.date
temp_df["网上申购日期"] = pd.to_datetime(
temp_df["网上申购日期"], errors="coerce"
).dt.date
temp_df["网上申购中签结果公告日及退款日"] = pd.to_datetime(
temp_df["网上申购中签结果公告日及退款日"], errors="coerce"
).dt.date
temp_df["债权登记日"] = pd.to_datetime(
temp_df["债权登记日"], errors="coerce"
).dt.date
temp_df["优先申购日"] = pd.to_datetime(
temp_df["优先申购日"], errors="coerce"
).dt.date
temp_df["优先申购缴款日"] = pd.to_datetime(
temp_df["优先申购缴款日"], errors="coerce"
).dt.date
temp_df["计划发行总量"] = pd.to_numeric(temp_df["计划发行总量"], errors="coerce")
temp_df["实际发行总量"] = pd.to_numeric(temp_df["实际发行总量"], errors="coerce")
temp_df["发行面值"] = pd.to_numeric(temp_df["发行面值"], errors="coerce")
temp_df["发行价格"] = pd.to_numeric(temp_df["发行价格"], errors="coerce")
temp_df["初始转股价格"] = pd.to_numeric(temp_df["初始转股价格"], errors="coerce")
temp_df["网上申购数量上限"] = pd.to_numeric(
temp_df["网上申购数量上限"], errors="coerce"
)
temp_df["网上申购数量下限"] = pd.to_numeric(
temp_df["网上申购数量下限"], errors="coerce"
)
temp_df["网上申购单位"] = pd.to_numeric(temp_df["网上申购单位"], errors="coerce")
temp_df["配售价格"] = pd.to_numeric(temp_df["配售价格"], errors="coerce")
return temp_df
def bond_cov_stock_issue_cninfo() -> pd.DataFrame:
"""
巨潮资讯-数据中心-专题统计-债券报表-债券发行-可转债转股
http://webapi.cninfo.com.cn/#/thematicStatistics
:return: 可转债转股
:rtype: pandas.DataFrame
"""
url = "http://webapi.cninfo.com.cn/api/sysapi/p_sysapi1124"
js_code = py_mini_racer.MiniRacer()
js_content = _get_file_content_cninfo("cninfo.js")
js_code.eval(js_content)
mcode = js_code.call("getResCode1")
headers = {
"Accept": "*/*",
"Accept-Enckey": mcode,
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
"Cache-Control": "no-cache",
"Content-Length": "0",
"Host": "webapi.cninfo.com.cn",
"Origin": "http://webapi.cninfo.com.cn",
"Pragma": "no-cache",
"Proxy-Connection": "keep-alive",
"Referer": "http://webapi.cninfo.com.cn/",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/93.0.4577.63 Safari/537.36",
"X-Requested-With": "XMLHttpRequest",
}
r = requests.post(url, headers=headers)
data_json = r.json()
temp_df = pd.DataFrame(data_json["records"])
temp_df.rename(
columns={
"F003N": "转股价格",
"SECNAME": "债券简称",
"DECLAREDATE": "公告日期",
"F005D": "自愿转换期终止日",
"F004D": "自愿转换期起始日",
"F017V": "标的股票",
"BONDNAME": "债券名称",
"F002V": "转股简称",
"F001V": "转股代码",
"SECCODE": "债券代码",
},
inplace=True,
)
temp_df = temp_df[
[
"债券代码",
"债券简称",
"公告日期",
"转股代码",
"转股简称",
"转股价格",
"自愿转换期起始日",
"自愿转换期终止日",
"标的股票",
"债券名称",
]
]
temp_df["公告日期"] = pd.to_datetime(temp_df["公告日期"], errors="coerce").dt.date
temp_df["自愿转换期起始日"] = pd.to_datetime(
temp_df["自愿转换期起始日"], errors="coerce"
).dt.date
temp_df["自愿转换期终止日"] = pd.to_datetime(
temp_df["自愿转换期终止日"], errors="coerce"
).dt.date
temp_df["转股价格"] = pd.to_numeric(temp_df["转股价格"], errors="coerce")
return temp_df
if __name__ == "__main__":
bond_treasure_issue_cninfo_df = bond_treasure_issue_cninfo(
start_date="20210910", end_date="20211109"
)
print(bond_treasure_issue_cninfo_df)
bond_local_government_issue_cninfo_df = bond_local_government_issue_cninfo(
start_date="20210911", end_date="20211110"
)
print(bond_local_government_issue_cninfo_df)
bond_corporate_issue_cninfo_df = bond_corporate_issue_cninfo(
start_date="20210911", end_date="20211110"
)
print(bond_corporate_issue_cninfo_df)
bond_cov_issue_cninfo_df = bond_cov_issue_cninfo(
start_date="20210913", end_date="20211112"
)
print(bond_cov_issue_cninfo_df)
bond_cov_stock_issue_cninfo_df = bond_cov_stock_issue_cninfo()
print(bond_cov_stock_issue_cninfo_df)
@@ -0,0 +1,70 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2024/3/16 9:00
Desc:中国银行间市场交易商协会(https://www.nafmii.org.cn/)
孔雀开屏(http://zhuce.nafmii.org.cn/fans/publicQuery/manager)的债券基本信息数据
"""
import pandas as pd
import requests
def bond_debt_nafmii(page: str = "1") -> pd.DataFrame:
"""
中国银行间市场交易商协会-非金融企业债务融资工具注册信息系统
http://zhuce.nafmii.org.cn/fans/publicQuery/manager
:param page: 输入数字页码
:type page: int
:return: 指定 sector indicator 的数据
:rtype: pandas.DataFrame
"""
url = "http://zhuce.nafmii.org.cn/fans/publicQuery/releFileProjDataGrid"
payload = {
"regFileName": "",
"itemType": "",
"startTime": "",
"endTime": "",
"entityName": "",
"leadManager": "",
"regPrdtType": "",
"page": page,
"rows": 50,
}
payload.update({"page": page})
r = requests.post(url, data=payload)
data_json = r.json() # 数据类型为 json 格式
temp_df = pd.DataFrame(data_json["rows"])
temp_df.rename(
columns={
"firstIssueAmount": "金额",
"isReg": "注册或备案",
"regFileName": "债券名称",
"regNoticeNo": "注册通知书文号",
"regPrdtType": "品种",
"releaseTime": "更新日期",
"projPhase": "项目状态",
},
inplace=True,
)
if "注册通知书文号" not in temp_df.columns:
temp_df["注册通知书文号"] = pd.NA
temp_df = temp_df[
[
"债券名称",
"品种",
"注册或备案",
"金额",
"注册通知书文号",
"更新日期",
"项目状态",
]
]
temp_df["金额"] = pd.to_numeric(temp_df["金额"], errors="coerce")
temp_df["更新日期"] = pd.to_datetime(temp_df["更新日期"], errors="coerce").dt.date
return temp_df
if __name__ == "__main__":
bond_debt_nafmii_df = bond_debt_nafmii(page="1")
print(bond_debt_nafmii_df)
@@ -0,0 +1,92 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2022/3/5 12:55
Desc: 上登债券信息网-债券成交概览
http://bond.sse.com.cn/data/statistics/overview/turnover/
"""
from io import BytesIO
import pandas as pd
import requests
def bond_cash_summary_sse(date: str = "20210111") -> pd.DataFrame:
"""
上登债券信息网-市场数据-市场统计-市场概览-债券现券市场概览
http://bond.sse.com.cn/data/statistics/overview/bondow/
:param date: 指定日期
:type date: str
:return: 债券成交概览
:rtype: pandas.DataFrame
"""
url = "http://query.sse.com.cn/commonExcelDd.do"
headers = {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
"Referer": "http://bond.sse.com.cn/",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36",
}
params = {
"sqlId": "COMMON_SSEBOND_SCSJ_SCTJ_SCGL_ZQXQSCGL_CX_L",
"TRADE_DATE": f"{date[:4]}-{date[4:6]}-{date[6:]}",
}
r = requests.get(url, params=params, headers=headers)
temp_df = pd.read_excel(BytesIO(r.content), engine="xlrd")
temp_df.columns = [
"债券现货",
"托管只数",
"托管市值",
"托管面值",
"数据日期",
]
temp_df["托管只数"] = pd.to_numeric(temp_df["托管只数"])
temp_df["托管市值"] = pd.to_numeric(temp_df["托管市值"])
temp_df["托管面值"] = pd.to_numeric(temp_df["托管面值"])
temp_df["数据日期"] = pd.to_datetime(temp_df["数据日期"]).dt.date
return temp_df
def bond_deal_summary_sse(date: str = "20210104") -> pd.DataFrame:
"""
上登债券信息网-市场数据-市场统计-市场概览-债券成交概览
http://bond.sse.com.cn/data/statistics/overview/turnover/
:param date: 指定日期
:type date: str
:return: 债券成交概览
:rtype: pandas.DataFrame
"""
url = "http://query.sse.com.cn/commonExcelDd.do"
headers = {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
"Referer": "http://bond.sse.com.cn/",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36",
}
params = {
"sqlId": "COMMON_SSEBOND_SCSJ_SCTJ_SCGL_ZQCJGL_CX_L",
"TRADE_DATE": f"{date[:4]}-{date[4:6]}-{date[6:]}",
}
r = requests.get(url, params=params, headers=headers)
temp_df = pd.read_excel(BytesIO(r.content))
temp_df.columns = [
"债券类型",
"当日成交笔数",
"当日成交金额",
"当年成交笔数",
"当年成交金额",
"数据日期",
]
temp_df["当日成交笔数"] = pd.to_numeric(temp_df["当日成交笔数"])
temp_df["当日成交金额"] = pd.to_numeric(temp_df["当日成交金额"])
temp_df["当年成交笔数"] = pd.to_numeric(temp_df["当年成交笔数"])
temp_df["当年成交金额"] = pd.to_numeric(temp_df["当年成交金额"])
temp_df["数据日期"] = pd.to_datetime(temp_df["数据日期"]).dt.date
return temp_df
if __name__ == "__main__":
bond_cash_summary_sse_df = bond_cash_summary_sse(date="20210111")
print(bond_cash_summary_sse_df)
bond_summary_sse_df = bond_deal_summary_sse(date="20210111")
print(bond_summary_sse_df)
@@ -0,0 +1,714 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2025/7/4 15:00
Desc: 新浪财经-债券-沪深可转债-实时行情数据和历史行情数据
https://vip.stock.finance.sina.com.cn/mkt/#hskzz_z
"""
import datetime
import re
import pandas as pd
import py_mini_racer
import requests
from akshare.bond.cons import (
zh_sina_bond_hs_cov_count_url,
zh_sina_bond_hs_cov_payload,
zh_sina_bond_hs_cov_url,
zh_sina_bond_hs_cov_hist_url,
)
from akshare.stock.cons import hk_js_decode
from akshare.utils import demjson
from akshare.utils.func import fetch_paginated_data
from akshare.utils.tqdm import get_tqdm
def _get_zh_bond_hs_cov_page_count() -> int:
"""
新浪财经-行情中心-债券-沪深可转债的总页数
https://vip.stock.finance.sina.com.cn/mkt/#hskzz_z
:return: 总页数
:rtype: int
"""
params = {
"node": "hskzz_z",
}
r = requests.get(zh_sina_bond_hs_cov_count_url, params=params)
page_count = int(re.findall(re.compile(r"\d+"), r.text)[0]) / 80
if isinstance(page_count, int):
return page_count
else:
return int(page_count) + 1
def bond_zh_hs_cov_spot() -> pd.DataFrame:
"""
新浪财经-债券-沪深可转债的实时行情数据; 大量抓取容易封IP
https://vip.stock.finance.sina.com.cn/mkt/#hskzz_z
:return: 所有沪深可转债在当前时刻的实时行情数据
:rtype: pandas.DataFrame
"""
big_df = pd.DataFrame()
page_count = _get_zh_bond_hs_cov_page_count()
zh_sina_bond_hs_payload_copy = zh_sina_bond_hs_cov_payload.copy()
tqdm = get_tqdm()
for page in tqdm(range(1, page_count + 1), leave=False):
zh_sina_bond_hs_payload_copy.update({"page": page})
res = requests.get(zh_sina_bond_hs_cov_url, params=zh_sina_bond_hs_payload_copy)
data_json = demjson.decode(res.text)
big_df = pd.concat(objs=[big_df, pd.DataFrame(data_json)], ignore_index=True)
return big_df
def bond_zh_hs_cov_daily(symbol: str = "sh010107") -> pd.DataFrame:
"""
新浪财经-债券-沪深可转债的历史行情数据, 大量抓取容易封 IP
https://vip.stock.finance.sina.com.cn/mkt/#hskzz_z
:param symbol: 沪深可转债代码; e.g., sh010107
:type symbol: str
:return: 指定沪深可转债代码的日 K 线数据
:rtype: pandas.DataFrame
"""
r = requests.get(
zh_sina_bond_hs_cov_hist_url.format(
symbol, datetime.datetime.now().strftime("%Y_%m_%d")
)
)
js_code = py_mini_racer.MiniRacer()
js_code.eval(hk_js_decode)
dict_list = js_code.call(
"d", r.text.split("=")[1].split(";")[0].replace('"', "")
) # 执行js解密代码
data_df = pd.DataFrame(dict_list)
data_df["date"] = pd.to_datetime(data_df["date"]).dt.date
return data_df
def _code_id_map() -> dict:
"""
东方财富-股票和市场代码
https://quote.eastmoney.com/center/gridlist.html#hs_a_board
:return: 股票和市场代码
:rtype: dict
"""
url = "https://80.push2.eastmoney.com/api/qt/clist/get"
params = {
"pn": "1",
"pz": "100",
"po": "1",
"np": "1",
"ut": "bd1d9ddb04089700cf9c27f6f7426281",
"fltt": "2",
"invt": "2",
"fid": "f12",
"fs": "m:1 t:2,m:1 t:23",
"fields": "f3,f12",
}
temp_df = fetch_paginated_data(url, params)
temp_df["market_id"] = 1
temp_df.rename(columns={"f12": "sh_code", "market_id": "sh_id"}, inplace=True)
code_id_dict = dict(zip(temp_df["sh_code"], temp_df["sh_id"]))
params = {
"pn": "1",
"pz": "100",
"po": "1",
"np": "1",
"ut": "bd1d9ddb04089700cf9c27f6f7426281",
"fltt": "2",
"invt": "2",
"fid": "f3",
"fs": "m:0 t:6,m:0 t:80",
"fields": "f3,f12",
}
temp_df_sz = fetch_paginated_data(url, params)
temp_df_sz["sz_id"] = 0
code_id_dict.update(dict(zip(temp_df_sz["f12"], temp_df_sz["sz_id"])))
return code_id_dict
def bond_zh_hs_cov_min(
symbol: str = "sz128039",
period: str = "15",
adjust: str = "",
start_date: str = "1979-09-01 09:32:00",
end_date: str = "2222-01-01 09:32:00",
) -> pd.DataFrame:
"""
东方财富网-可转债-分时行情
https://quote.eastmoney.com/concept/sz128039.html
:param symbol: 转债代码
:type symbol: str
:param period: choice of {'1', '5', '15', '30', '60'}
:type period: str
:param adjust: choice of {'', 'qfq', 'hfq'}
:type adjust: str
:param start_date: 开始日期
:type start_date: str
:param end_date: 结束日期
:type end_date: str
:return: 分时行情
:rtype: pandas.DataFrame
"""
market_type = {"sh": "1", "sz": "0"}
if period == "1":
url = "https://push2.eastmoney.com/api/qt/stock/trends2/get"
params = {
"secid": f"{market_type[symbol[:2]]}.{symbol[2:]}",
"fields1": "f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13",
"fields2": "f51,f52,f53,f54,f55,f56,f57,f58",
"iscr": "0",
"iscca": "0",
"ut": "f057cbcbce2a86e2866ab8877db1d059",
"ndays": "1",
}
r = requests.get(url, params=params)
data_json = r.json()
temp_df = pd.DataFrame(
[item.split(",") for item in data_json["data"]["trends"]]
)
temp_df.columns = [
"时间",
"开盘",
"收盘",
"最高",
"最低",
"成交量",
"成交额",
"最新价",
]
temp_df.index = pd.to_datetime(temp_df["时间"])
temp_df = temp_df[start_date:end_date]
temp_df.reset_index(drop=True, inplace=True)
temp_df["开盘"] = pd.to_numeric(temp_df["开盘"], errors="coerce")
temp_df["收盘"] = pd.to_numeric(temp_df["收盘"], errors="coerce")
temp_df["最高"] = pd.to_numeric(temp_df["最高"], errors="coerce")
temp_df["最低"] = pd.to_numeric(temp_df["最低"], errors="coerce")
temp_df["成交量"] = pd.to_numeric(temp_df["成交量"], errors="coerce")
temp_df["成交额"] = pd.to_numeric(temp_df["成交额"], errors="coerce")
temp_df["最新价"] = pd.to_numeric(temp_df["最新价"], errors="coerce")
temp_df["时间"] = pd.to_datetime(temp_df["时间"]).astype(
str
) # show datatime here
return temp_df
else:
adjust_map = {
"": "0",
"qfq": "1",
"hfq": "2",
}
url = "https://push2his.eastmoney.com/api/qt/stock/kline/get"
params = {
"secid": f"{market_type[symbol[:2]]}.{symbol[2:]}",
"klt": period,
"fqt": adjust_map[adjust],
"lmt": "66",
"end": "20500000",
"iscca": "1",
"fields1": "f1,f2,f3,f4,f5",
"fields2": "f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61",
"ut": "7eea3edcaed734bea9cbfc24409ed989",
"forcect": "1",
}
r = requests.get(url, params=params)
data_json = r.json()
temp_df = pd.DataFrame(
[item.split(",") for item in data_json["data"]["klines"]]
)
temp_df.columns = [
"时间",
"开盘",
"收盘",
"最高",
"最低",
"成交量",
"成交额",
"振幅",
"涨跌幅",
"涨跌额",
"换手率",
]
temp_df.index = pd.to_datetime(temp_df["时间"])
temp_df = temp_df[start_date:end_date]
temp_df.reset_index(drop=True, inplace=True)
temp_df["开盘"] = pd.to_numeric(temp_df["开盘"], errors="coerce")
temp_df["收盘"] = pd.to_numeric(temp_df["收盘"], errors="coerce")
temp_df["最高"] = pd.to_numeric(temp_df["最高"], errors="coerce")
temp_df["最低"] = pd.to_numeric(temp_df["最低"], errors="coerce")
temp_df["成交量"] = pd.to_numeric(temp_df["成交量"], errors="coerce")
temp_df["成交额"] = pd.to_numeric(temp_df["成交额"], errors="coerce")
temp_df["振幅"] = pd.to_numeric(temp_df["振幅"], errors="coerce")
temp_df["涨跌幅"] = pd.to_numeric(temp_df["涨跌幅"], errors="coerce")
temp_df["涨跌额"] = pd.to_numeric(temp_df["涨跌额"], errors="coerce")
temp_df["换手率"] = pd.to_numeric(temp_df["换手率"], errors="coerce")
temp_df["时间"] = pd.to_datetime(temp_df["时间"]).astype(str)
temp_df = temp_df[
[
"时间",
"开盘",
"收盘",
"最高",
"最低",
"涨跌幅",
"涨跌额",
"成交量",
"成交额",
"振幅",
"换手率",
]
]
return temp_df
def bond_zh_hs_cov_pre_min(symbol: str = "sh113570") -> pd.DataFrame:
"""
东方财富网-可转债-分时行情-盘前
https://quote.eastmoney.com/concept/sz128039.html
:param symbol: 转债代码
:type symbol: str
:return: 分时行情-盘前
:rtype: pandas.DataFrame
"""
market_type = {"sh": "1", "sz": "0"}
url = "https://push2.eastmoney.com/api/qt/stock/trends2/get"
params = {
"fields1": "f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13",
"fields2": "f51,f52,f53,f54,f55,f56,f57,f58",
"ndays": "1",
"iscr": "1",
"iscca": "0",
"secid": f"{market_type[symbol[:2]]}.{symbol[2:]}",
}
r = requests.get(url, params=params)
data_json = r.json()
temp_df = pd.DataFrame([item.split(",") for item in data_json["data"]["trends"]])
temp_df.columns = [
"时间",
"开盘",
"收盘",
"最高",
"最低",
"成交量",
"成交额",
"最新价",
]
temp_df.index = pd.to_datetime(temp_df["时间"])
temp_df.reset_index(drop=True, inplace=True)
temp_df["开盘"] = pd.to_numeric(temp_df["开盘"], errors="coerce")
temp_df["收盘"] = pd.to_numeric(temp_df["收盘"], errors="coerce")
temp_df["最高"] = pd.to_numeric(temp_df["最高"], errors="coerce")
temp_df["最低"] = pd.to_numeric(temp_df["最低"], errors="coerce")
temp_df["成交量"] = pd.to_numeric(temp_df["成交量"], errors="coerce")
temp_df["成交额"] = pd.to_numeric(temp_df["成交额"], errors="coerce")
temp_df["最新价"] = pd.to_numeric(temp_df["最新价"], errors="coerce")
temp_df["时间"] = pd.to_datetime(temp_df["时间"]).astype(str)
return temp_df
def bond_zh_cov() -> pd.DataFrame:
"""
东方财富网-数据中心-新股数据-可转债数据
https://data.eastmoney.com/kzz/default.html
:return: 可转债数据
:rtype: pandas.DataFrame
"""
url = "https://datacenter-web.eastmoney.com/api/data/v1/get"
params = {
"sortColumns": "PUBLIC_START_DATE",
"sortTypes": "-1",
"pageSize": "500",
"pageNumber": "1",
"reportName": "RPT_BOND_CB_LIST",
"columns": "ALL",
"quoteColumns": "f2~01~CONVERT_STOCK_CODE~CONVERT_STOCK_PRICE,"
"f235~10~SECURITY_CODE~TRANSFER_PRICE,f236~10~SECURITY_CODE~TRANSFER_VALUE,"
"f2~10~SECURITY_CODE~CURRENT_BOND_PRICE,f237~10~SECURITY_CODE~TRANSFER_PREMIUM_RATIO,"
"f239~10~SECURITY_CODE~RESALE_TRIG_PRICE,f240~10~SECURITY_CODE~REDEEM_TRIG_PRICE,"
"f23~01~CONVERT_STOCK_CODE~PBV_RATIO",
"source": "WEB",
"client": "WEB",
}
r = requests.get(url, params=params)
data_json = r.json()
total_page = data_json["result"]["pages"]
big_df = pd.DataFrame()
tqdm = get_tqdm()
for page in tqdm(range(1, total_page + 1), leave=False):
params.update({"pageNumber": page})
r = requests.get(url, params=params)
data_json = r.json()
temp_df = pd.DataFrame(data_json["result"]["data"])
big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
big_df.columns = [
"债券代码",
"_",
"_",
"债券简称",
"_",
"上市时间",
"正股代码",
"_",
"信用评级",
"_",
"_",
"_",
"_",
"_",
"_",
"_",
"发行规模",
"申购上限",
"_",
"_",
"_",
"_",
"_",
"_",
"_",
"_",
"_",
"_",
"_",
"_",
"_",
"申购代码",
"_",
"申购日期",
"_",
"_",
"中签号发布日",
"原股东配售-股权登记日",
"正股简称",
"原股东配售-每股配售额",
"_",
"中签率",
"-",
"_",
"_",
"_",
"_",
"_",
"正股价",
"转股价",
"转股价值",
"债现价",
"转股溢价率",
"_",
"_",
"_",
"_",
"_",
"_",
"_",
"_",
"_",
"_",
"_",
"_",
"_",
"_",
"_",
"_",
"_",
"_",
"_",
]
big_df = big_df[
[
"债券代码",
"债券简称",
"申购日期",
"申购代码",
"申购上限",
"正股代码",
"正股简称",
"正股价",
"转股价",
"转股价值",
"债现价",
"转股溢价率",
"原股东配售-股权登记日",
"原股东配售-每股配售额",
"发行规模",
"中签号发布日",
"中签率",
"上市时间",
"信用评级",
]
]
big_df["申购上限"] = pd.to_numeric(big_df["申购上限"], errors="coerce")
big_df["正股价"] = pd.to_numeric(big_df["正股价"], errors="coerce")
big_df["转股价"] = pd.to_numeric(big_df["转股价"], errors="coerce")
big_df["转股价值"] = pd.to_numeric(big_df["转股价值"], errors="coerce")
big_df["债现价"] = pd.to_numeric(big_df["债现价"], errors="coerce")
big_df["转股溢价率"] = pd.to_numeric(big_df["转股溢价率"], errors="coerce")
big_df["原股东配售-每股配售额"] = pd.to_numeric(
big_df["原股东配售-每股配售额"], errors="coerce"
)
big_df["发行规模"] = pd.to_numeric(big_df["发行规模"], errors="coerce")
big_df["中签率"] = pd.to_numeric(big_df["中签率"], errors="coerce")
big_df["中签号发布日"] = pd.to_datetime(
big_df["中签号发布日"], errors="coerce"
).dt.date
big_df["上市时间"] = pd.to_datetime(big_df["上市时间"], errors="coerce").dt.date
big_df["申购日期"] = pd.to_datetime(big_df["申购日期"], errors="coerce").dt.date
big_df["原股东配售-股权登记日"] = pd.to_datetime(
big_df["原股东配售-股权登记日"], errors="coerce"
).dt.date
big_df["债现价"] = big_df["债现价"].fillna(100)
return big_df
def bond_cov_comparison() -> pd.DataFrame:
"""
东方财富网-行情中心-债券市场-可转债比价表
https://quote.eastmoney.com/center/fullscreenlist.html#convertible_comparison
:return: 可转债比价表数据
:rtype: pandas.DataFrame
"""
url = "https://16.push2.eastmoney.com/api/qt/clist/get"
params = {
"pn": "1",
"pz": "100",
"po": "1",
"np": "1",
"ut": "bd1d9ddb04089700cf9c27f6f7426281",
"fltt": "2",
"invt": "2",
"fid": "f243",
"fs": "b:MK0354",
"fields": "f1,f152,f2,f3,f12,f13,f14,f227,f228,f229,f230,f231,f232,f233,f234,"
"f235,f236,f237,f238,f239,f240,f241,f242,f26,f243",
}
temp_df = fetch_paginated_data(url, params)
temp_df.columns = [
"序号",
"_",
"转债最新价",
"转债涨跌幅",
"转债代码",
"_",
"转债名称",
"上市日期",
"_",
"纯债价值",
"_",
"正股最新价",
"正股涨跌幅",
"_",
"正股代码",
"_",
"正股名称",
"转股价",
"转股价值",
"转股溢价率",
"纯债溢价率",
"回售触发价",
"强赎触发价",
"到期赎回价",
"开始转股日",
"申购日期",
]
temp_df = temp_df[
[
"序号",
"转债代码",
"转债名称",
"转债最新价",
"转债涨跌幅",
"正股代码",
"正股名称",
"正股最新价",
"正股涨跌幅",
"转股价",
"转股价值",
"转股溢价率",
"纯债溢价率",
"回售触发价",
"强赎触发价",
"到期赎回价",
"纯债价值",
"开始转股日",
"上市日期",
"申购日期",
]
]
return temp_df
def bond_zh_cov_info(
symbol: str = "123121", indicator: str = "基本信息"
) -> pd.DataFrame:
"""
https://data.eastmoney.com/kzz/detail/123121.html
东方财富网-数据中心-新股数据-可转债详情
:param symbol: 可转债代码
:type symbol: str
:param indicator: choice of {"基本信息", "中签号", "筹资用途", "重要日期"}
:type indicator: str
:return: 可转债详情
:rtype: pandas.DataFrame
"""
indicator_map = {
"基本信息": "RPT_BOND_CB_LIST",
"中签号": "RPT_CB_BALLOTNUM",
"筹资用途": "RPT_BOND_BS_OPRFINVESTITEM",
"重要日期": "RPT_CB_IMPORTANTDATE",
}
url = "https://datacenter-web.eastmoney.com/api/data/v1/get"
params = {
"reportName": "RPT_BOND_CB_LIST",
"columns": "ALL",
"quoteColumns": "f2~01~CONVERT_STOCK_CODE~CONVERT_STOCK_PRICE,f235~10~SECURITY_CODE~TRANSFER_PRICE,"
"f236~10~SECURITY_CODE~TRANSFER_VALUE,f2~10~SECURITY_CODE~CURRENT_BOND_PRICE,"
"f237~10~SECURITY_CODE~TRANSFER_PREMIUM_RATIO,f239~10~SECURITY_CODE~RESALE_TRIG_PRICE,"
"f240~10~SECURITY_CODE~REDEEM_TRIG_PRICE,f23~01~CONVERT_STOCK_CODE~PBV_RATIO",
"quoteType": "0",
"source": "WEB",
"client": "WEB",
"filter": f'(SECURITY_CODE="{symbol}")',
}
if indicator == "基本信息":
params.update(
{
"reportName": indicator_map[indicator],
"quoteColumns": "f2~01~CONVERT_STOCK_CODE~CONVERT_STOCK_PRICE,f235~10~SECURITY_CODE~TRANSFER_PRICE,"
"f236~10~SECURITY_CODE~TRANSFER_VALUE,f2~10~SECURITY_CODE~CURRENT_BOND_PRICE,"
"f237~10~SECURITY_CODE~TRANSFER_PREMIUM_RATIO,f239~10~SECURITY_CODE~RESALE_TRIG_PRICE,"
"f240~10~SECURITY_CODE~REDEEM_TRIG_PRICE,f23~01~CONVERT_STOCK_CODE~PBV_RATIO",
}
)
r = requests.get(url, params=params)
data_json = r.json()
temp_df = pd.DataFrame.from_dict(data_json["result"]["data"])
return temp_df
elif indicator == "中签号":
params.update(
{
"reportName": indicator_map[indicator],
"quoteColumns": "",
}
)
r = requests.get(url, params=params)
data_json = r.json()
temp_df = pd.DataFrame.from_dict(data_json["result"]["data"])
return temp_df
elif indicator == "筹资用途":
params.update(
{
"reportName": indicator_map[indicator],
"quoteColumns": "",
"sortColumns": "SORT",
"sortTypes": "1",
}
)
r = requests.get(url, params=params)
data_json = r.json()
temp_df = pd.DataFrame.from_dict(data_json["result"]["data"])
return temp_df
elif indicator == "重要日期":
params.update(
{
"reportName": indicator_map[indicator],
"quoteColumns": "",
}
)
r = requests.get(url, params=params)
data_json = r.json()
temp_df = pd.DataFrame.from_dict(data_json["result"]["data"])
return temp_df
else:
return pd.DataFrame()
def bond_zh_cov_value_analysis(symbol: str = "113527") -> pd.DataFrame:
"""
https://data.eastmoney.com/kzz/detail/113527.html
东方财富网-数据中心-新股数据-可转债数据-价值分析-溢价率分析
:param symbol: 可转债代码
:type symbol: str
:return: 可转债价值分析
:rtype: pandas.DataFrame
"""
url = "https://datacenter-web.eastmoney.com/api/data/get"
params = {
"sty": "ALL",
"token": "894050c76af8597a853f5b408b759f5d",
"st": "date",
"sr": "1",
"source": "WEB",
"type": "RPTA_WEB_KZZ_LS",
"filter": f'(zcode="{symbol}")',
"p": "1",
"ps": "8000",
}
r = requests.get(url, params=params)
data_json = r.json()
temp_df = pd.DataFrame(data_json["result"]["data"])
temp_df.columns = [
"日期",
"-",
"-",
"转股价值",
"纯债价值",
"纯债溢价率",
"转股溢价率",
"收盘价",
"-",
"-",
"-",
"-",
"-",
]
temp_df = temp_df[
[
"日期",
"收盘价",
"纯债价值",
"转股价值",
"纯债溢价率",
"转股溢价率",
]
]
temp_df["收盘价"] = pd.to_numeric(temp_df["收盘价"], errors="coerce")
temp_df["纯债价值"] = pd.to_numeric(temp_df["纯债价值"], errors="coerce")
temp_df["转股价值"] = pd.to_numeric(temp_df["转股价值"], errors="coerce")
temp_df["纯债溢价率"] = pd.to_numeric(temp_df["纯债溢价率"], errors="coerce")
temp_df["转股溢价率"] = pd.to_numeric(temp_df["转股溢价率"], errors="coerce")
temp_df["日期"] = pd.to_datetime(temp_df["日期"], errors="coerce").dt.date
return temp_df
if __name__ == "__main__":
bond_zh_hs_cov_min_df = bond_zh_hs_cov_min(
symbol="sz128039",
period="1",
adjust="hfq",
start_date="1979-09-01 09:32:00",
end_date="2222-01-01 09:32:00",
)
print(bond_zh_hs_cov_min_df)
bond_zh_hs_cov_pre_min_df = bond_zh_hs_cov_pre_min(symbol="sz128039")
print(bond_zh_hs_cov_pre_min_df)
bond_zh_hs_cov_daily_df = bond_zh_hs_cov_daily(symbol="sz128039")
print(bond_zh_hs_cov_daily_df)
bond_zh_hs_cov_spot_df = bond_zh_hs_cov_spot()
print(bond_zh_hs_cov_spot_df)
bond_zh_cov_df = bond_zh_cov()
print(bond_zh_cov_df)
bond_cov_comparison_df = bond_cov_comparison()
print(bond_cov_comparison_df)
bond_zh_cov_info_df = bond_zh_cov_info(symbol="123121", indicator="基本信息")
print(bond_zh_cov_info_df)
bond_zh_cov_value_analysis_df = bond_zh_cov_value_analysis(symbol="113527")
print(bond_zh_cov_value_analysis_df)
@@ -0,0 +1,151 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2024/6/18 18:30
Desc: 新浪财经-债券-沪深债券-实时行情数据和历史行情数据
https://vip.stock.finance.sina.com.cn/mkt/#hs_z
"""
import datetime
import re
import pandas as pd
import requests
import py_mini_racer
from akshare.bond.cons import (
zh_sina_bond_hs_count_url,
zh_sina_bond_hs_payload,
zh_sina_bond_hs_url,
zh_sina_bond_hs_hist_url,
)
from akshare.stock.cons import hk_js_decode
from akshare.utils import demjson
from akshare.utils.tqdm import get_tqdm
def get_zh_bond_hs_page_count() -> int:
"""
行情中心首页-债券-沪深债券的总页数
https://vip.stock.finance.sina.com.cn/mkt/#hs_z
:return: 总页数
:rtype: int
"""
params = {
"node": "hs_z",
}
res = requests.get(zh_sina_bond_hs_count_url, params=params)
page_count = int(re.findall(re.compile(r"\d+"), res.text)[0]) / 80
if isinstance(page_count, int):
return page_count
else:
return int(page_count) + 1
def bond_zh_hs_spot(start_page: str = "1", end_page: str = "10") -> pd.DataFrame:
"""
新浪财经-债券-沪深债券-实时行情数据, 大量抓取容易封IP
https://vip.stock.finance.sina.com.cn/mkt/#hs_z
:param start_page: 分页起始页
:type start_page: str
:param end_page: 分页结束页
:type end_page: str
:return: 所有沪深债券在当前时刻的实时行情数据
:rtype: pandas.DataFrame
"""
page_count = get_zh_bond_hs_page_count()
page_count = int(page_count)
zh_sina_bond_hs_payload_copy = zh_sina_bond_hs_payload.copy()
tqdm = get_tqdm()
big_df = pd.DataFrame()
start_page = int(start_page)
end_page = int(end_page) + 1 if int(end_page) + 1 <= page_count else page_count
for page in tqdm(range(start_page, end_page), leave=False):
zh_sina_bond_hs_payload_copy.update({"page": page})
r = requests.get(zh_sina_bond_hs_url, params=zh_sina_bond_hs_payload_copy)
data_json = demjson.decode(r.text)
temp_df = pd.DataFrame(data_json)
big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
big_df.columns = [
"代码",
"-",
"名称",
"最新价",
"涨跌额",
"涨跌幅",
"买入",
"卖出",
"昨收",
"今开",
"最高",
"最低",
"成交量",
"成交额",
"-",
"-",
"-",
"-",
"-",
"-",
]
big_df = big_df[
[
"代码",
"名称",
"最新价",
"涨跌额",
"涨跌幅",
"买入",
"卖出",
"昨收",
"今开",
"最高",
"最低",
"成交量",
"成交额",
]
]
big_df["买入"] = pd.to_numeric(big_df["买入"], errors="coerce")
big_df["卖出"] = pd.to_numeric(big_df["卖出"], errors="coerce")
big_df["昨收"] = pd.to_numeric(big_df["昨收"], errors="coerce")
big_df["今开"] = pd.to_numeric(big_df["今开"], errors="coerce")
big_df["最高"] = pd.to_numeric(big_df["最高"], errors="coerce")
big_df["最低"] = pd.to_numeric(big_df["最低"], errors="coerce")
big_df["最新价"] = pd.to_numeric(big_df["最新价"], errors="coerce")
return big_df
def bond_zh_hs_daily(symbol: str = "sh010107") -> pd.DataFrame:
"""
新浪财经-债券-沪深债券-历史行情数据, 大量抓取容易封 IP
https://vip.stock.finance.sina.com.cn/mkt/#hs_z
:param symbol: 沪深债券代码; e.g., sh010107
:type symbol: str
:return: 指定沪深债券代码的日 K 线数据
:rtype: pandas.DataFrame
"""
r = requests.get(
zh_sina_bond_hs_hist_url.format(
symbol, datetime.datetime.now().strftime("%Y_%m_%d")
)
)
js_code = py_mini_racer.MiniRacer()
js_code.eval(hk_js_decode)
dict_list = js_code.call(
"d", r.text.split("=")[1].split(";")[0].replace('"', "")
) # 执行 js 解密代码
data_df = pd.DataFrame(dict_list)
data_df["date"] = pd.to_datetime(data_df["date"], errors="coerce").dt.date
data_df["open"] = pd.to_numeric(data_df["open"], errors="coerce")
data_df["high"] = pd.to_numeric(data_df["high"], errors="coerce")
data_df["low"] = pd.to_numeric(data_df["low"], errors="coerce")
data_df["close"] = pd.to_numeric(data_df["close"], errors="coerce")
return data_df
if __name__ == "__main__":
bond_zh_hs_spot_df = bond_zh_hs_spot(start_page="1", end_page="5")
print(bond_zh_hs_spot_df)
bond_zh_hs_daily_df = bond_zh_hs_daily(symbol="sh010107")
print(bond_zh_hs_daily_df)
@@ -0,0 +1,408 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2026/4/10 10:21
Desc: 债券配置文件
"""
INDEX_MAPPING: dict[str, str] = {
"新综合指数": "8a8b2ca0332abed20134ea76d8885831",
"高等级科技创新债券综合指数": "4d4aa3607fb4ba663b4587de4a624b24",
"长江养老年金基金债券指数": "5846dca288299ac125539d6600c07853",
"中信证券挂钩DR浮动利率政策性银行债活跃券指数": "11c92fe0df3940c3ea172bfec5126593",
"股份制商业银行同业存单指数": "1398633fe32c4076f596530652d2f9bb",
"金融高质量发展主题信用债指数": "20e35c92ef7b9a439fcaa8fce5835ea5",
"交易所国债指数": "2c9081e50e8767dc010e87a4bdd20041",
"进出口行债券总指数": "8a8b2ca054ef4e4e0154f0c515eb0002",
"市场隐含评级AA信用债指数": "8a8b2cef6ab893c2016aba4c8ee7009f",
"房地产行业信用债指数": "8a8b2cef73b68e6a0173b92f5e1774c5",
"重庆市地方政府债指数": "8a8b2cef744be6d401744ebe4e6568c2",
"甘肃省地方政府债指数": "8a8b2cef74608045017461d9115400c8",
"公司信用类科技创新债券指数": "8641b0cb4c1f39c372dbcf5516b9c615",
"长三角绿色债券指数": "8a8b2c8364aa0bb20164abfd957f000f",
"企业债AA-指数": "8a8b2ca0406a93470140800885d20b7f",
"中国高等级债券指数": "8a8b2ca047bd1dfe0147d317b62e2158",
"中高等级公司信用类债券指数": "ef82cc4ba2540191dcdce19559153a3d",
"系统重要性银行债券指数": "928c2552e9b15d784f02b13b53392d53",
"红利现金流高等级股债金波动率控制1.5%指数": "b6b0f49ce87604657e97133968cb85bc",
"中高等级粤港澳大湾区绿色债券指数": "cc2b58ce2230e6097b7b32447406c783",
"投资级公司信用债综合指数": "4e808b033318be271f9b2063693a12ef",
"中高等级绿色金融债券指数": "562d8e2d9d331c99a7a9f9fefded6907",
"高等级科技创新债券指数": "0366fa8fafe2d1b12c62e4ffe11b97fe",
"北京农商银行中高信用等级农村商业银行金融债券指数": "185bb3883f838a1fdfe60e9ca37f4b43",
"货币市场基金可投资债券指数": "2c9081e918ad26f40118e90afbee66ae",
"高信用等级债券指数": "2c9081e91da03927011dcc4fae9f6171",
"非银金融行业信用债指数": "3396aaec56be7ba3378976c9387380f3",
"商业银行无固定期限资本债券市场隐含评级AA指数": "3d75e320abd5c3440ddd156de1ee622e",
"京津冀公司信用类债券指数": "8a8b2cef6d4bc1c2016d4ca23ef4251b",
"京津冀债券综合指数": "8a8b2cef6d4bc1c2016d4caa15e8254a",
"工行关键期限国债指数": "8a8b2cef6e1ee681016e200a8aa50400",
"广东省地方政府债指数": "8a8b2cef7109a09c01710c14d2a74415",
"厦门市地方政府债指数": "8a8b2cef732135fd017322a8e7c80113",
"商业银行无固定期限资本债券AAA指数": "6b12c39d52c331dd5e3d1aabc4d9b5a6",
"粤港澳大湾区绿色债券综合指数": "7fd4e2eda73794d409e592448adb8c25",
"中高等级科技创新绿色普惠主题信用债指数": "865e39d03b6fd073781dbf1477a6cca1",
"红利自由现金流低波股债恒定比例10/90指数": "8961444e141891490cba185d6b59cba2",
"高信用等级企业债指数": "8a8b2ca03e4dd765013e6312d6462a1b",
"农行乡村振兴债券指数": "e8df331cfd44e54f338bf2811716c6da",
"城市商业银行及农村商业银行同业存单AAA指数": "8b8f70506d65f4675233a32c903ad552",
"股债恒定组合10/90指数": "978a5b988dfe640d0d083981803d0675",
"国信证券深圳市国有企业信用债精选指数": "9d895a4e2d56d6829590a5eb3ccf285d",
"商业银行无固定期限资本债券指数": "a096ce5c63c2a1df2240b876c868c3ed",
"银行间碳中和债券指数": "ac478f286376cf14bf6cbc68ca0aa284",
"中高等级信用债综合指数": "b10fd010c80946bf881ca39dca62e49a",
"贵阳银行西部高质量发展信用债精选指数": "c1dc7e964c26475afa239b00594b8275",
"投资优选国际信用评级投资级活跃信用债指数": "d20fbfd3ed04a7261a0572967ffc06c3",
"红利现金流高等级股债金波动率控制1%指数": "188b64de57c782a3b8a9359ff08f113d",
"东方证券科技创新信用债精选指数": "2adeb5d8aa35cbcb0ea4a05614a75a08",
"进出口行新发关键期限债券指数": "2e8da3759b4f83e0f0752147738f7fc9",
"商业银行二级资本债券AAA指数": "3f6da52f1d57886271979d928af5a203",
"粤港澳大湾区信用债指数": "8a8b2cef74b8f0c10174bac93afe436a",
"投资优选信用债指数": "8a8b2cef771ce12601771df60d924fdb",
"科技创新绿色普惠主题信用债指数": "6b227923cd44064bbf239a69f70f09ae",
"中国高等级债券指数(美元)": "8a8b2c8f581cfb2f01581db3fd830001",
"信用债总指数": "8a8b2ca038d716f10138dadde8416adc",
"高等级科技创新及绿色债券指数": "f1df5dcfb61be8a2fbcbc119db98b149",
"中邮理财高等级绿色债券精选指数": "f22aea49f4b11a53bd787b013253d5be",
"平安人寿ESG整合策略信用债指数": "f711877ede9c7aa67bfe326721c2137e",
"战略性新兴产业信用债指数": "f72725181b56144d3f9b55f1b6e60102",
"商业银行债券AAA指数": "9883fcadeac6d8c22204f0c749e4cf08",
"AAA评级债券综合指数": "b017c9c53c7ad6586b3446129c152616",
"高等级黄河流域绿色债券指数": "bfbeeed1994639dcd0e0b94fda306b56",
"高等级公司信用类债券综合指数": "c9a7185542022826b09dcc2ab72be8b1",
"中信证券高等级同业存单指数": "0857793c945697daf6a9873ff42825f4",
"浦银理财新质生产力发展债券指数": "103c0fdb82c06b6b9d7ec09f28b8b615",
"银行间国债指数": "2c9081e50e8767dc010e87b559ee0078",
"交易所高等级科技创新债券指数": "44a33e0c99dffbce14774eb52415a5b0",
"银行间资产支持证券指数": "8a8b2ca055eba5e10155ed6ebc530895",
"中国气候相关债券指数": "8a8b2ca056b9a4450156bb2be8df0002",
"招商银行优选信用债指数": "8a8b2cef6dd6cd77016dd88a7e7d002c",
"福建省地方政府债指数": "8a8b2cef732135fd017322145858008e",
"市场隐含评级AA+及以上信用债指数": "8a8b2cef734f8f3701735061131b014a",
"青海省地方政府债指数": "8a8b2cef74608045017461f9e203012a",
"红利自由现金流低波股债恒定比例25/75指数": "6bae070303eed9cf867fd5011a0e47bb",
"投资优选信用债分散指数": "6dd638194bb5a5f2de90bd7133192953",
"高信用等级城市商业银行及农村商业银行债券指数": "81303c95d362b50182547f7385469b7b",
"金融机构二级资本债券总指数": "8a8b2c8368edcfd70168f08992c6153a",
"新中期票据总指数": "8a8b2ca0375f977f0138c2c322474b06",
"高收益中期票据指数": "8a8b2ca03e29cab5013e3a180e064537",
"商业银行二级资本债券指数": "b379a2dacd92d19ca805021c0d336ee8",
"高信用等级商业银行无固定期限及二级资本债券指数": "ca7f4de2681f726e0d1268fd6f646788",
"银行间科技创新债券指数": "4bde3b669a49e81e8de90e8df7687128",
"金融行业信用债指数": "594b0c6f18d6dd3c6af0830d784058fa",
"高等级科技创新债券行业精选指数": "1287a4c6c7bce84cbe9eab904468b9d5",
"固定利率债券指数": "2c9081e50e8767dc010e87954b780011",
"中信证券挂钩LPR浮动利率政策性银行债活跃券指数": "430f1876233c711f505500edce079236",
"广西壮族自治区公司信用类债券指数": "8a8b2cef6b00accd016b022cffbb0009",
"长三角债券综合指数": "8a8b2cef6b29dfac016b2bc115460040",
"个人住房抵押贷款资产支持证券指数": "8a8b2cef6b96053a016b982c95e7001f",
"青岛市地方政府债指数": "8a8b2cef7307763001730a5c824524ce",
"煤炭行业信用债指数": "8a8b2cef73bbb4c60173bc59a0c90006",
"安徽省公司信用类债券指数": "8a8b2c8367bdf89e0167c05355f201fb",
"企业债AA+指数": "8a8b2ca0408e9fa701409edf078f26c0",
"挂钩DR浮动利率政策性银行债指数": "db78a8ddda8a6ac88bc193055906740a",
"红利自由现金流低波股债恒定比例20/80指数": "e638c5f176c772ddaf59e947af2d052e",
"金融机构科技创新债券指数": "ecac759d61e1c09314d6f2577c20ce6c",
"中豫信增河南省信用债指数": "f7948f9be0732d45e18f1d5c8190757f",
"红利现金流中高等级股债金波动率控制1%指数": "8a9ab2cac146e25febba515cfa08d8cc",
"电力行业优质转型企业信用债指数": "947d07b68357a6e40c93bf839efc2187",
"工行熊猫债30指数": "9eee3a194d1f035ce0cf4307a5b9b69f",
"申万宏源ESG绿色信用债精选指数": "a3dc0ed6ba8ab442783109d769baed5e",
"天府信用增进公司增信债券指数": "aa0b6304e290a57bcda90e1358e13de9",
"京津冀绿色债券综合指数": "d0df76dc4485ecd520c870d81703645c",
"高等级科技创新绿色普惠主题信用债指数": "61c04cb52c2decb1cbba80292ab46ccd",
"高信用等级数字经济产业信用债指数": "373e09025763c56cf01201234a794658",
"中银理财高等级乡村振兴债券指数": "398f40c1c8dd2081f6e1ee478b768dbb",
"国有大型商业银行及股份制商业银行债券指数": "469f1601d2b76750b82945b145e90992",
"民营企业公司信用类债券指数": "8a8b2cef6b4dec2d016b4ebb4ec36c3f",
"湖南省地方政府债指数": "8a8b2cef7132d3800171333ba262010c",
"贵州省地方政府债指数": "8a8b2cef730c9c8f01730e79bade0185",
"新疆维吾尔自治区(新疆生产建设兵团)地方政府债指数": "8a8b2cef7465a6a201746603d1a1005d",
"国寿资产ESG信用债精选指数": "8a8b2cef7a11e7fc017a13fe7446002a",
"中邮理财高等级科技创新债券精选指数": "773ade3d59c36dc1e13146c1866a8ccb",
"平安理财ESG优选绿色债券指数": "89019c1cbbe64a34698165eecc7e7417",
"中高等级公司债利差因子指数": "8a8b2c836393f4480163950643d92795",
"长三角公司信用类债券指数": "8a8b2c83649fbee90164a24dbbc00013",
"中信证券精选高等级资产支持证券指数": "8a8b2c83689643bc0168985a433e000e",
"交易所科技创新债券指数": "963fc157a1f34898dd4071a355ea13bd",
"中银理财高信用等级同业存单指数": "987527eff930a4986a5044a80cadae9e",
"中银绿色债券指数": "abea1402e6dd628d02118bca571783cb",
"国有大型商业银行同业存单指数": "af109288145de0c9a36332a4fb3d06c1",
"中高等级长江经济带绿色债券指数": "d3c82122ac871f08eb5bf877065e5377",
"AAA信用债综合指数": "05d235f4268241c25e36b27e13b13023",
"红利自由现金流低波股债金恒定比例指数": "0ff243f048cbd219f59fb92ab8ae4941",
"申万宏源中小微企业主题优选信用债指数": "1997fbc5e0a91db36e53c4540ae51cdd",
"企业债总指数": "2c90818811d3f4fa01123837e6b30d4a",
"商业银行债券指数": "2c9081e918ad26f401195c3a76a7210f",
"公司债总指数": "8a8b2ca050d9e35d0150da6758462c78",
"长江经济带债券综合指数": "8a8b2cef709854b501709a027fe4002f",
"信用债价值因子权重调整策略指数": "8a8b2cef7422b3f30174234f30fd0005",
"黑龙江省地方政府债指数": "8a8b2cef7456338c017457a55ccc07cc",
"碳中和绿色债券指数": "8a8b2cef7823857e01782469e9210080",
"投资优选政策性金融债指数": "8a8b2cef7a404137017a424e54cb7859",
"中金公司乡村振兴信用债精选指数": "8a8b2cef7a4fb448017a515401a53fc4",
"高等级公司信用类债券指数": "6fb584528c4d4aad6194d5a39a3b93a1",
"京津冀科技创新债券指数": "74bdb50a9cbf9a45903346968a951bd3",
"渤海银行新质生产力主题科技创新债券指数": "81a92ec45e9d90aa8961e9ac278fc435",
"长三角地方政府债指数": "8a8b2c836303c237016304feb2160006",
"AAA科技创新债券指数": "dff644648a8a007efd6a5b94970c0b89",
"投资级中资美元债指数": "8a962d8c69c31e1e016a0f26a9c0010a",
"成渝地区双城经济圈国有企业信用债精选指数": "03ffb378810766ab90ec7e959fadc3c0",
"投资优选活跃信用债指数": "103a161c9927a9ae41e38f0887bbd33e",
"北银理财绿色发展风险平价指数": "2c666b22d481c7eadb52992baa62591c",
"中高等级科技创新债券综合指数": "3b02fa47414f502add64f1e77e9e67b7",
"个人住房抵押贷款资产支持证券精选指数": "3b824a1426bea356799ca15d730ad6d1",
"红利自由现金流低波股债金恒定比例10/85/5指数": "48643ba4f9bd31f07ec8efdc44ebf761",
"高信用等级同业存单指数": "48fc8dfb472c5498c6612cd5151647d8",
"中国绿色债券精选指数": "8a8b2ca053fd435d0153fefc94100001",
"长三角中高等级信用债指数": "8a8b2cef6b4dec2d016b4fc04e286e57",
"江西省地方政府债指数": "8a8b2cef732135fd017321b8405e0005",
"江苏省地方政府债指数": "8a8b2c8368a5b6da0168a6bd29e80017",
"中信证券国债及地方政府债精选指数": "8a8b2c83694a824d01694c5d53d6000a",
"国债及政策性银行债指数": "8a8b2c8f5a62e9ca015a645fe3b60001",
"高信用等级公司信用类债券综合指数": "8a8b2ca038f905c70139b9b3ab9660bb",
"银行间高等级科技创新债券指数": "e4498669d5496afed08bdf7ff8695681",
"公路行业信用债指数": "e65b5cdf6e3e04c7892bdfd1ccc1e2dc",
"投资优选国际信用评级投资级信用债分散指数": "f5517678561c457f03b6d74c06440a3d",
"高信用等级农村商业银行债券优选指数": "f8cbf35f3095aa44006f7fc7c506176d",
"科技创新债券指数": "a485ef64ce0ae0f1f5cc088671e87d8f",
"科技创新债券综合指数": "afb3fe2d59b5165a0175bac95b8c3da0",
"高等级信用债指数": "d04f2fb3e1012c78b8acdecf2c93979f",
"中高等级公司信用类债券综合指数": "5911892524d8b384666a88d75200c9df",
"中高等级京津冀绿色债券指数": "00474c7a00eb73ca32a23a6861b4a418",
"城市商业银行及农村商业银行债券AAA指数": "13fe6e5cd6a84a3038b8a5d46c7a38cb",
"浦发银行绿色低碳股债优选指数": "2bdda0eb4cac30c07217f95a25a7a85f",
"金融债券总指数": "2c9081e50e8767dc010e87a9d5650060",
"离岸人民币中国主权及政策性金融债指数": "8a8b2cef6dcc80c0016dcf2444650bb7",
"安徽省地方政府债指数": "8a8b2cef7311c2e7017312b23a650130",
"AA国有企业信用债优选指数": "6b0d067864ff1675e96f3c49652fb73e",
"中高等级信用债指数": "6cdea6720316fd5d69494b4bc0f8129c",
"工行熊猫债AAA指数": "738751b4c9e76c9b7701fb0c201b70f1",
"国有大型商业银行及股份制商业银行同业存单指数": "78598fc1ac4a8f2d327577e0481b065c",
"黄金保值国开行债券风险平价指数": "806f9278922270298ee3e12c6d624ee5",
"交行长三角ESG优选信用债指数": "ebd9f5ac057709c3fe5a375773e0c62d",
"中信证券ESG优选信用债指数": "ece99ed16ea8c4c9d59befed1175f823",
"数字经济产业信用债指数": "fa87c88adac6b304de5654c29b1569e1",
"投资级公司信用债精选指数": "8d397b018e0ce97d58dedc3ef41ddf36",
"中信证券久期轮动政策性金融债指数": "9c6218292a77139d38f12ac6ef85d138",
"红利自由现金流低波股债恒定比例30/70指数": "d33a29eb4d1e1111af1e4b7097cca597",
"高等级信用债综合指数": "5b78d41604e06e90b720144a6a956c67",
"投资级公司科技创新债券精选指数": "0572b7d527231c98e4fc0de8abe2c7c2",
"交易所信用债AAA指数": "05f743ba6a11b907de8307b89c4fc618",
"高信用等级城市商业银行及农村商业银行同业存单指数": "0bb01422038bb4086e8baa8f648574e8",
"高信用等级商业银行债券指数": "1a985201e4c5ceecdde9610e43a0fd35",
"投资优选科技创新债券指数": "2ac380e3d3d941de8351f1fff8e6bda5",
"固定利率金融债指数": "2c9081e50e8767dc010e87ad08140068",
"银行间高等级碳中和债券指数": "37a60515edb02fe8dab961d9c7035a95",
"同业存单AA+指数": "429c1ff7661c2abacdbcb5718a3cb5f6",
"平安-可投资级信用债指数": "8a8b2ca0515fc8a60151618b84483c9a",
"农发行债券总指数": "8a8b2ca0540790160154091b513d370e",
"浙江省地方政府债指数": "8a8b2cef7109a09c01710c1c2d04478e",
"上海市地方政府债指数": "8a8b2cef7408f4280174096a89a04112",
"陕西省地方政府债指数": "8a8b2cef74510d2f01745168e5670004",
"资产支持证券指数": "8a8b2cef74510d2f0174529d5a9f35b4",
"吉林省地方政府债指数": "8a8b2cef74608045017461ccceff0073",
"海南省地方政府债指数": "8a8b2cef74608045017461fe1768015f",
"ESG优选信用债指数": "8a8b2cef75860ac0017587c644a02fde",
"中金公司绿色资产支持证券指数": "8a8b2cef783d454901783f2c468307ec",
"市场隐含评级AA+信用债指数": "8a8b2c836775df980167784a77520d4b",
"同业存单总指数": "8a8b2c8f611af5db01611cb3586c00f0",
"公司信用类债券指数": "8a8b2ca03a59370a013a676d717923da",
"高收益企业债指数": "8a8b2ca03e88932b013e88b9d6290001",
"企业债AAA指数": "8a8b2ca0408e9fa7014094a20f21001f",
"AAA公司信用类债券综合指数": "e6b1e2fc01692f8fcd22ba50e501231a",
"AAA公司信用类债券指数": "96377056fc894287b4a76ceebaca2808",
"投资优选绿色债券指数": "984c68bfc0b9263aaad7bd9af36888a3",
"系统重要性银行同业存单指数": "a08e1c9454a616491f5bf6431f2591b0",
"投资级主题绿色债券优选指数": "be73e8263fc20359521707abd6db45b3",
"高等级央企信用债精选指数": "cbfd21590b4805df8df7d9de222f8f7d",
"红利现金流中高等级股债波动率控制1.5%指数": "d31602c38de87265603df05d6cf9dd59",
"中高等级科技创新及绿色债券指数": "5ec55de5ac980c543c2d9bf25d6e423b",
"金融高质量发展主题债券综合指数": "60bb107af9b99b8fb7c6a28ef4b171da",
"商业银行无固定期限及二级资本债券指数": "0b96ff2a2948a75625e2319b49446633",
"国开行债券总指数": "2c908188111fac07011125068f91044d",
"综合指数": "2c90818811afed8d0111c0c672b31578",
"固定利率企业债指数": "2c9081e918ad26f40118adb5d6910004",
"中期票据总指数": "2c9081e91ebc9e41011ec8c7c0440001",
"黄金保值债券风险平价指数": "3b9c19a3dd638fd2672c0728fce892a0",
"广西壮族自治区地方政府债指数": "8a8b2cef7311c2e7017313a860bb03dc",
"新疆维吾尔自治区地方政府债指数": "8a8b2cef74510d2f017453365ea0367c",
"天津市地方政府债指数": "8a8b2cef7456338c017458e2e0da3e33",
"投资优选综合指数": "8a8b2cef7682625f0176835c7a840070",
"绿色债券综合指数": "85f86947411dd367018d7f8fde1dc295",
"市场隐含评级AAA信用债指数": "8a8b2c836775df980167785153790d6b",
"中国铁路债券指数": "8a8b2c8f5bea4d1b015bebe640530038",
"企业债AA指数": "8a8b2ca0408e9fa70140949f012d0002",
"地方政府债指数": "8a8b2ca0447ffe14014486b77f2a0002",
"国泰海通陕川渝国企信用增强债券精选指数": "de861828ae11bc5f498a330c650fdf5a",
"银行间高等级绿色债券指数": "9fa9718155dceab39e5149af665f68a7",
"红利现金流高等级股债波动率控制1.5%指数": "a7f952e6f6ad14b1c66f5f950ed476de",
"红利自由现金流低波股债恒定比例5/95指数": "c3bb7afced9999ce291380c0fc4dbca5",
"绿色普惠主题金融债券优选指数": "d69df7413ed6e76fa5b9b20ba9e7c0ec",
"建筑工程行业信用债指数": "0af700ba10feefc9a5191983eaadfc51",
"长三角绿色债券综合指数": "2551cfa3eea577a3ca71d51bceca6f8f",
"银行间债券总指数": "2c9081e50e8767dc010e87a3326c0039",
"交易所AAA科技创新债券指数": "2d90f08c90b2e886bf6f6df549af950c",
"AAA信用债指数": "3a2e8c74d7265e3e9aedfd8d1681836b",
"银行间市场信用债AAA指数": "3c94ebab97ab6edf12ca14e452977115",
"共同富裕主题债券指数": "430a7631f7ea66036a91f37e8b4b1c9c",
"中国绿色债券指数": "8a8b2ca054079016015408674cce0017",
"优选投资级信用债指数": "8a8b2cef771294700177144288381a6c",
"投资优选地方政府债指数": "8a8b2cef7a404137017a4245018a7011",
"湖北省地方政府债指数": "8a8b2c8368e383220168e4bae68500c9",
"兴业绿色债券指数": "8a8b2c8f57df2edc0157e1163014176e",
"银行普通债券AAA指数": "e36b9dc1620a0dc7ee027cca1663c526",
"中期票据AAA指数": "9ced53d3f93b8cb9509a80d294086876",
"黄金保值信用债风险平价指数": "b099abb287eebad09994ab481fe67f24",
"浦发银行ESG精选债券指数": "6357eef4131197707f812ea9a7530a53",
"北银理财京津冀企业高质量发展多元投资指数": "25895ebd4694c235a33aa9d360b04764",
"固定利率国债指数": "2c9081e50e8767dc010e87a6a60b0050",
"浮动利率金融债指数": "2c9081e50e8767dc010e87b3b1d60070",
"AAA公司信用类科技创新债券指数": "3279a06da6f3a8e8a6429d32b0917cb7",
"云南省地方政府债指数": "8a8b2cef7132d3800171330128ec0002",
"辽宁省地方政府债指数": "8a8b2cef73265c58017326e66e310005",
"长江经济带绿色债券综合指数": "7ebdf1292c65a1bcfcdab7546919312c",
"关键期限国债指数": "8a8b2ca04b1e4a5b014b2a23197c72c5",
"红利现金流中高等级股债波动率控制1%指数": "982441730a41cb3f45cf58bf0a21f2ee",
"北京银行高信用等级城市商业银行债券指数": "b9a6d06e9b6458c9062f08a1dc75fd30",
"中信证券个人汽车抵押贷款资产支持证券指数": "5cb7d4be4facd5353ac243620ebf2bde",
"中高等级长三角绿色债券指数": "1432826c10c29fdd3b75258378e45aa1",
"天风国际ESG优选中资美元债指数": "2d3ac1a7ccda4e7aadc605e2b1ca0c9b",
"工行绿色债券指数": "31d4a4934ca82e11892f6bbb9be0ea04",
"红利现金流中高等级股债金波动率控制1.5%指数": "47a631e45ce8b99708de3ecd775b64b7",
"京津冀绿色债券指数": "8a8b2cef6db2c0f4016db432c17f0667",
"河南省地方政府债指数": "8a8b2cef730c9c8f01730d1816ce0066",
"内蒙古自治区地方政府债指数": "8a8b2cef7311c2e701731364881d032a",
"制造行业信用债指数": "8a8b2cef73c6017e0173c882dd1c7801",
"粤港澳大湾区绿色债券指数": "8a8b2cef747519b5017476a72ce653a2",
"科技创新及绿色债券指数": "7dc84c0f21a71b97931fd7abadc78433",
"投资级公司绿色债券精选指数": "80e6aa811418a5b9ac810c93ac381fed",
"市场隐含评级AAA+信用债指数": "8a8b2c836775df9801677851e4360d74",
"高等级公司信用类科技创新债券指数": "eba5e43f73c9d877657d88d3e00ad90c",
"银行间绿色债券指数": "9da7e47f35b11c98cced95e4fb71b596",
"高等级战略性新兴产业信用债指数": "adf7158832226e8e7361b78d0f5e4798",
"红利自由现金流低波股债恒定比例15/85指数": "d0203aedec448bec95845ba349cc9e78",
"电力行业信用债指数": "5cc7a4278c0c1cc0f82dc018c3c15fd1",
"科技创新绿色普惠主题债券综合指数": "5e21777b1e179d595ebd9a78a6b89bf7",
"中高等级战略性新兴产业信用债指数": "05b2d2e9b40a7f2324774c0b32f8cd70",
"浮动利率债券指数": "2c9081e50e8767dc010e8797a5d70019",
"京津冀地方政府债指数": "8a8b2cef6d4bc1c2016d4c96069c24fb",
"宁波市地方政府债指数": "8a8b2cef73077630017307dc4339007c",
"钢铁行业信用债指数": "8a8b2cef73c0db220173c140495c0058",
"北京市地方政府债指数": "8a8b2cef7456338c017456818eba000a",
"山西省地方政府债指数": "8a8b2cef746080450174619484ea000c",
"宁夏回族自治区地方政府债指数": "8a8b2cef7460804501746219b518020a",
"西藏自治区地方政府债指数": "8a8b2cef7465a6a2017465f9dc55000a",
"投资优选国债指数": "8a8b2cef7a35f47f017a37c76654232d",
"挂钩LPR浮动利率政策性银行债指数": "678165887609e2cb84fa87251c33fc08",
"银行金融债券AAA指数": "81d917dad85d7ce95f51bc644484e1ff",
"市场隐含评级AAA-信用债指数": "8a8b2c836775df980167785085850d62",
"国有大型商业银行及股份制商业银行二级资本债券指数": "8a8b2c8367f69e950167f7b549f00005",
"高信用等级中期票据指数": "8a8b2ca03d393e7c013d39c667963351",
"高信用等级银行金融债券指数": "f187fd9f8ee0d88f9a59323d6a709e34",
"同业存单AAA指数": "b15ef8073f38d8962cd7728a857f5cc8",
"中高等级科技创新债券指数": "b7c74a6569cb5a38d7f1ab3ed20ca62b",
"商业银行二级资本债券市场隐含评级AA指数": "c511c7a1a872fb2ca258474e95a45ab8",
"高等级绿色公司信用类债券指数": "d8fbee7a51ae5901ea48aa7948bda83f",
"银行间AAA科技创新债券指数": "571d2417bcf35b5dc808f3c480349090",
"黄河流域绿色债券综合指数": "608e6e23ec091fdc8c879481ac979b19",
"国债总指数": "2c9081e50e8767dc010e879acb220021",
"长江经济带地方政府债指数": "8a8b2cef709d7b1201709f29b09f0084",
"山东省地方政府债指数": "8a8b2cef70eaba740170ed2c79b44c04",
"四川省地方政府债指数": "8a8b2cef7109a09c01710c04f8bb41fd",
"深圳市地方政府债指数": "8a8b2cef7224de5f0172265a948a0089",
"河北省地方政府债指数": "8a8b2cef730c9c8f01730d8ca18b00ee",
"大连市地方政府债指数": "8a8b2cef73265c580173273fe9e2008d",
"信用债价值因子精选策略指数": "8a8b2cef73a1f4f80173a2c0b2a4000e",
"粤港澳大湾区债券综合指数": "8a8b2cef74adbfab0174afbea5434943",
"利差驱动股债稳健指数": "890fcfb97ea76876563dfc1771652a22",
"中债信用增进公司增信债券指数": "8a8b2ca03de1b1db013de91f3a6f2aee",
"银行金融债券指数": "eae41b72f13a22c9b24a0a5887789000",
"乡村振兴债券综合指数": "cec6a61bd8827e306fcba8f195a4903f",
}
INDICATOR_MAPPING = {
"全价": "QJZS",
"净价": "JJZS",
"财富": "CFZS",
"平均市值法久期": "PJSZFJQ",
"平均现金流法久期": "PJXJLFJQ",
"平均市值法凸性": "PJSZFTX",
"平均现金流法凸性": "PJXJLFTX",
"平均现金流法到期收益率": "PJDQSYL",
"平均市值法到期收益率": "PJSZFDQSYL",
"平均基点价值": "PJJDJZ",
"平均待偿期": "PJDCQ",
"平均派息率": "PJPXL",
"指数上日总市值": "ZSZSZ",
"财富指数涨跌幅": "CFZSZDF",
"全价指数涨跌幅": "QJZSZDF",
"净价指数涨跌幅": "JJZSZDF",
"现券结算量": "XQJSL",
}
PERIOD_MAPPING = {
"总值": "00",
"1年以下": "01",
"1-3年": "02",
"3-5年": "03",
"5-7年": "04",
"7-10年": "05",
"10年以上": "06",
"0-3个月": "07",
"3-6个月": "08",
"6-9个月": "09",
"9-12个月": "10",
"0-6个月": "11",
"6-12个月": "12",
}
# bond-cov-sina
zh_sina_bond_hs_cov_url = "http://vip.stock.finance.sina.com.cn/quotes_service/api/json_v2.php/Market_Center.getHQNodeDataSimple"
zh_sina_bond_hs_cov_count_url = "http://vip.stock.finance.sina.com.cn/quotes_service/api/json_v2.php/Market_Center.getHQNodeStockCountSimple"
zh_sina_bond_hs_cov_hist_url = (
"https://finance.sina.com.cn/realstock/company/{}/hisdata/klc_kl.js?d={}"
)
zh_sina_bond_hs_cov_payload = {
"page": "1",
"num": "80",
"sort": "symbol",
"asc": "1",
"node": "hskzz_z",
"_s_r_a": "page",
}
# bond-sina
zh_sina_bond_hs_url = "http://vip.stock.finance.sina.com.cn/quotes_service/api/json_v2.php/Market_Center.getHQNodeData"
zh_sina_bond_hs_count_url = "http://vip.stock.finance.sina.com.cn/quotes_service/api/json_v2.php/Market_Center.getHQNodeStockCountSimple"
zh_sina_bond_hs_hist_url = (
"https://finance.sina.com.cn/realstock/company/{}/hisdata/klc_kl.js?d={}"
)
zh_sina_bond_hs_payload = {
"page": "1",
"num": "80",
"sort": "symbol",
"asc": "1",
"node": "hs_z",
"_s_r_a": "page",
}
# headers
SHORT_HEADERS = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.91 Safari/537.36"
}
# quote
MARKET_QUOTE_URL = "http://www.chinamoney.com.cn/ags/ms/cm-u-md-bond/CbMktMakQuot?flag=1&lang=cn&abdAssetEncdShrtDesc=&emaEntyEncdShrtDesc="
MARKET_QUOTE_PAYLOAD = {
"flag": "1",
"lang": "cn",
"abdAssetEncdShrtDesc": "",
"emaEntyEncdShrtDesc": "",
}
# trade
MARKET_TRADE_URL = (
"http://www.chinamoney.com.cn/ags/ms/cm-u-md-bond/CbtPri?lang=cn&flag=1&bondName="
)
MARKET_TRADE_PAYLOAD = {"lang": "cn", "flag": "1", "bondName": ""}
@@ -0,0 +1,173 @@
"""
Yang-Zhang-s-Realized-Volatility-Automated-Estimation-in-Python
https://github.com/hugogobato/Yang-Zhang-s-Realized-Volatility-Automated-Estimation-in-Python
论文地址https://www.jstor.org/stable/10.1086/209650
"""
import warnings
import numpy as np
import pandas as pd
def rv_from_stock_zh_a_hist_min_em(
symbol="000001",
start_date="2021-10-20 09:30:00",
end_date="2024-11-01 15:00:00",
period="1",
adjust="hfq",
) -> pd.DataFrame:
"""
从东方财富网获取股票的分钟级历史行情数据,并进行数据清洗和格式化为计算 yz 已实现波动率所需的数据格式
https://quote.eastmoney.com/concept/sh603777.html?from=classic
:param symbol: 股票代码,"000001"
:type symbol: str
:param start_date: 开始日期时间,格式"YYYY-MM-DD HH:MM:SS"
:type start_date: str
:param end_date: 结束日期时间,格式"YYYY-MM-DD HH:MM:SS"
:type end_date: str
:param period: 时间周期,可选{'1','5','15','30','60'}分钟
:type period: str
:param adjust: 复权方式,可选{'','qfq'(前复权),'hfq'(后复权)}
:type adjust: str
:return: 整理后的分钟行情数据,包含Date(索引),Open,High,Low,Close列
:rtype: pandas.DataFrame
"""
from akshare.stock_feature.stock_hist_em import stock_zh_a_hist_min_em
temp_df = stock_zh_a_hist_min_em(
symbol=symbol,
start_date=start_date,
end_date=end_date,
period=period,
adjust=adjust,
)
temp_df.rename(
columns={
"时间": "Date",
"开盘": "Open",
"最高": "High",
"最低": "Low",
"收盘": "Close",
},
inplace=True,
)
temp_df = temp_df[temp_df["Open"] != 0]
temp_df["Date"] = pd.to_datetime(temp_df["Date"])
temp_df.set_index(keys="Date", inplace=True)
return temp_df
def rv_from_futures_zh_minute_sina(
symbol: str = "IF2008", period: str = "5"
) -> pd.DataFrame:
"""
从新浪财经获取期货的分钟级历史行情数据,并进行数据清洗和格式化
https://vip.stock.finance.sina.com.cn/quotes_service/view/qihuohangqing.html#titlePos_3
:param symbol: 期货合约代码,"IF2008"代表沪深300期货2020年8月合约
:type symbol: str
:param period: 时间周期,可选{'1','5','15','30','60'}分钟
:type period: str
:return: 整理后的分钟行情数据,包含Date(索引),Open,High,Low,Close列
:rtype: pandas.DataFrame
"""
from akshare.futures.futures_zh_sina import futures_zh_minute_sina
temp_df = futures_zh_minute_sina(symbol=symbol, period=period)
temp_df.rename(
columns={
"datetime": "Date",
"open": "Open",
"high": "High",
"low": "Low",
"close": "Close",
},
inplace=True,
)
temp_df["Date"] = pd.to_datetime(temp_df["Date"])
temp_df.set_index(keys="Date", inplace=True)
return temp_df
def volatility_yz_rv(data: pd.DataFrame) -> pd.DataFrame:
(
"""
波动率-已实现波动率-Yang-Zhang 已实现波动率(Yang-Zhang Realized Volatility)
https://github.com/hugogobato/Yang-Zhang-s-Realized-Volatility-Automated-Estimation-in-Python
论文地址https://www.jstor.org/stable/10.1086/209650
基于以下公式计算:
RV^2 = Vo + k*Vc + (1-k)*Vrs
其中:
- Vo: 隔夜波动率, Vo = 1/(n-1)*sum(Oi-Obar)^2
Oi为标准化开盘价, Obar为标准化开盘价均值
- Vc: 收盘波动率, Vc = 1/(n-1)*sum(ci-Cbar)^2
ci为标准化收盘价, Cbar为标准化收盘价均值
- k: 权重系数, k = 0.34/(1.34+(n+1)/(n-1))
n为样本数量
- Vrs: Rogers-Satchell波动率代理, Vrs = ui(ui-ci)+di(di-ci)
ui = ln(Hi/Oi), ci = ln(Ci/Oi), di = ln(Li/Oi), oi = ln(Oi/Ci-1)
Hi/Li/Ci/Oi分别为最高价/最低价/收盘价/开盘价
:param data: 包含 OHLC(开高低收) 价格的 pandas.DataFrame
:type data: pandas.DataFrame
:return: 包含 Yang-Zhang 实现波动率的 pandas.DataFrame
:rtype: pandas.DataFrame
要求输入数据包含以下列:
- Open: 开盘价
- High: 最高价
- Low: 最低价
- Close: 收盘价
# yang_zhang_rv formula is give as:
# RV^2 = Vo + k*Vc + (1-k)*Vrs
# where Vo = 1/(n-1)*sum(Oi-Obar)^2
# with oi = normalized opening price at time t and Obar = mean of normalized opening prices
# Vc = = 1/(n-1)*sum(ci-Cbar)^2
# with ci = normalized close price at time t and Cbar = mean of normalized close prices
# k = 0.34/(1.34+(n+1)/(n-1))
# with n = total number of days or time periods considered
# Vrs (Rogers & Satchell RV proxy) = ui(ui-ci)+di(di-ci)
# with ui = ln(Hi/Oi), ci = ln(Ci/Oi), di=(Li/Oi), oi = ln(Oi/Ci-1)
# where Hi = high price at time t and Li = low price at time t
"""
""
)
warnings.filterwarnings("ignore")
data["ui"] = np.log(np.divide(data["High"][1:], data["Open"][1:]))
data["ci"] = np.log(np.divide(data["Close"][1:], data["Open"][1:]))
data["di"] = np.log(np.divide(data["Low"][1:], data["Open"][1:]))
data["oi"] = np.log(np.divide(data["Open"][1:], data["Close"][: len(data) - 1]))
data = data[1:]
data["RS"] = data["ui"] * (data["ui"] - data["ci"]) + data["di"] * (
data["di"] - data["ci"]
)
rs_var = data["RS"].groupby(pd.Grouper(freq="1D")).mean().dropna()
vc_and_vo = data[["oi", "ci"]].groupby(pd.Grouper(freq="1D")).var().dropna()
n = int(len(data) / len(rs_var))
k = 0.34 / (1.34 + (n + 1) / (n - 1))
yang_zhang_rv = np.sqrt((1 - k) * rs_var + vc_and_vo["oi"] + vc_and_vo["ci"] * k)
yang_zhang_rv_df = pd.DataFrame(yang_zhang_rv)
yang_zhang_rv_df.rename(columns={0: "yz_rv"}, inplace=True)
yang_zhang_rv_df.reset_index(inplace=True)
yang_zhang_rv_df.columns = ["date", "rv"]
yang_zhang_rv_df["date"] = pd.to_datetime(
yang_zhang_rv_df["date"], errors="coerce"
).dt.date
return yang_zhang_rv_df
if __name__ == "__main__":
futures_df = rv_from_futures_zh_minute_sina(symbol="IF2008", period="1")
volatility_yz_rv_df = volatility_yz_rv(data=futures_df)
print(volatility_yz_rv_df)
stock_df = rv_from_stock_zh_a_hist_min_em(
symbol="000001",
start_date="2021-10-20 09:30:00",
end_date="2024-11-01 15:00:00",
period="5",
adjust="",
)
volatility_yz_rv_df = volatility_yz_rv(data=stock_df)
print(volatility_yz_rv_df)
@@ -0,0 +1,6 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2020/10/23 13:51
Desc:
"""
@@ -0,0 +1,63 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2023/9/5 15:41
Desc: 芝加哥商业交易所-比特币成交量报告
https://datacenter.jin10.com/reportType/dc_cme_btc_report
"""
import pandas as pd
import requests
def crypto_bitcoin_cme(date: str = "20230830") -> pd.DataFrame:
"""
芝加哥商业交易所-比特币成交量报告
https://datacenter.jin10.com/reportType/dc_cme_btc_report
:param date: Specific date, e.g., "20230830"
:type date: str
:return: 比特币成交量报告
:rtype: pandas.DataFrame
"""
url = "https://datacenter-api.jin10.com/reports/list"
params = {
"category": "cme",
"date": "-".join([date[:4], date[4:6], date[6:]]),
"attr_id": "4",
}
headers = {
"accept": "*/*",
"accept-encoding": "gzip, deflate, br",
"accept-language": "zh-CN,zh;q=0.9,en;q=0.8",
"cache-control": "no-cache",
"origin": "https://datacenter.jin10.com",
"pragma": "no-cache",
"referer": "https://datacenter.jin10.com/",
"sec-ch-ua": '" Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"',
"sec-ch-ua-mobile": "?0",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-site",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36",
"x-app-id": "rU6QIu7JHe2gOUeR",
"x-csrf-token": "",
"x-version": "1.0.0",
}
r = requests.get(url, params=params, headers=headers)
data_json = r.json()
temp_df = pd.DataFrame(
[item for item in data_json["data"]["values"]],
columns=[item["name"] for item in data_json["data"]["keys"]],
)
temp_df["电子交易合约"] = pd.to_numeric(temp_df["电子交易合约"], errors="coerce")
temp_df["场内成交合约"] = pd.to_numeric(temp_df["场内成交合约"], errors="coerce")
temp_df["场外成交合约"] = pd.to_numeric(temp_df["场外成交合约"], errors="coerce")
temp_df["成交量"] = pd.to_numeric(temp_df["成交量"], errors="coerce")
temp_df["未平仓合约"] = pd.to_numeric(temp_df["未平仓合约"], errors="coerce")
temp_df["持仓变化"] = pd.to_numeric(temp_df["持仓变化"], errors="coerce")
return temp_df
if __name__ == "__main__":
crypto_bitcoin_cme_df = crypto_bitcoin_cme(date="20230830")
print(crypto_bitcoin_cme_df)
@@ -0,0 +1,79 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2023/8/31 23:00
Desc: 金十数据-比特币持仓报告
https://datacenter.jin10.com/dc_report?name=bitcoint
"""
import pandas as pd
import requests
def crypto_bitcoin_hold_report():
"""
金十数据-比特币持仓报告
https://datacenter.jin10.com/dc_report?name=bitcoint
:return: 比特币持仓报告
:rtype: pandas.DataFrame
"""
url = "https://datacenter-api.jin10.com/bitcoin_treasuries/list"
headers = {
"X-App-Id": "lnFP5lxse24wPgtY",
"X-Version": "1.0.0",
}
r = requests.get(url, headers=headers)
data_json = r.json()
temp_df = pd.DataFrame(data_json["data"]["values"])
temp_df.columns = [
"代码",
"公司名称-英文",
"国家/地区",
"市值",
"比特币占市值比重",
"持仓成本",
"持仓占比",
"持仓量",
"当日持仓市值",
"查询日期",
"公告链接",
"_",
"分类",
"倍数",
"_",
"公司名称-中文",
]
temp_df = temp_df[
[
"代码",
"公司名称-英文",
"公司名称-中文",
"国家/地区",
"市值",
"比特币占市值比重",
"持仓成本",
"持仓占比",
"持仓量",
"当日持仓市值",
"查询日期",
"公告链接",
"分类",
"倍数",
]
]
temp_df["市值"] = pd.to_numeric(temp_df["市值"], errors="coerce")
temp_df["比特币占市值比重"] = pd.to_numeric(
temp_df["比特币占市值比重"], errors="coerce"
)
temp_df["持仓成本"] = pd.to_numeric(temp_df["持仓成本"], errors="coerce")
temp_df["持仓占比"] = pd.to_numeric(temp_df["持仓占比"], errors="coerce")
temp_df["持仓量"] = pd.to_numeric(temp_df["持仓量"], errors="coerce")
temp_df["当日持仓市值"] = pd.to_numeric(temp_df["当日持仓市值"], errors="coerce")
temp_df["倍数"] = pd.to_numeric(temp_df["倍数"], errors="coerce")
temp_df["查询日期"] = pd.to_datetime(temp_df["查询日期"], errors="coerce").dt.date
return temp_df
if __name__ == "__main__":
crypto_bitcoin_hold_report_df = crypto_bitcoin_hold_report()
print(crypto_bitcoin_hold_report_df)
@@ -0,0 +1,6 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2020/3/6 16:40
Desc:
"""
@@ -0,0 +1,184 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2023/7/24 18:30
Desc: currencybeacon 提供的外汇数据
该网站需要先注册后获取 API 使用
https://currencyscoop.com/
"""
import pandas as pd
import requests
def currency_latest(
base: str = "USD", symbols: str = "", api_key: str = ""
) -> pd.DataFrame:
"""
Latest data from currencyscoop.com
https://currencyscoop.com/api-documentation
:param base: The base currency you would like to use for your rates
:type base: str
:param symbols: A list of currencies you will like to see the rates for. You can refer to a list all supported currencies here
:type symbols: str
:param api_key: Account -> Account Details -> API KEY (use as password in external tools)
:type api_key: str
:return: Latest data of base currency
:rtype: pandas.DataFrame
"""
params = {"base": base, "symbols": symbols, "api_key": api_key}
url = "https://api.currencyscoop.com/v1/latest"
r = requests.get(url, params=params)
temp_df = pd.DataFrame.from_dict(r.json()["response"])
temp_df["date"] = pd.to_datetime(temp_df["date"])
temp_df.reset_index(inplace=True)
temp_df.rename(columns={"index": "currency"}, inplace=True)
return temp_df
def currency_history(
base: str = "USD", date: str = "2023-02-03", symbols: str = "", api_key: str = ""
) -> pd.DataFrame:
"""
Latest data from currencyscoop.com
https://currencyscoop.com/api-documentation
:param base: The base currency you would like to use for your rates
:type base: str
:param date: Specific date, e.g., "2020-02-03"
:type date: str
:param symbols: A list of currencies you will like to see the rates for. You can refer to a list all supported currencies here
:type symbols: str
:param api_key: Account -> Account Details -> API KEY (use as password in external tools)
:type api_key: str
:return: Latest data of base currency
:rtype: pandas.DataFrame
"""
params = {"base": base, "date": date, "symbols": symbols, "api_key": api_key}
url = "https://api.currencyscoop.com/v1/historical"
r = requests.get(url, params=params)
temp_df = pd.DataFrame.from_dict(r.json()["response"])
temp_df["date"] = pd.to_datetime(temp_df["date"]).dt.date
temp_df.reset_index(inplace=True)
temp_df.rename(columns={"index": "currency"}, inplace=True)
return temp_df
def currency_time_series(
base: str = "USD",
start_date: str = "2023-02-03",
end_date: str = "2023-03-04",
symbols: str = "",
api_key: str = "",
) -> pd.DataFrame:
"""
Time-series data from currencyscoop.com
P.S. need special authority
https://currencyscoop.com/api-documentation
:param base: The base currency you would like to use for your rates
:type base: str
:param start_date: Specific date, e.g., "2020-02-03"
:type start_date: str
:param end_date: Specific date, e.g., "2020-02-03"
:type end_date: str
:param symbols: A list of currencies you will like to see the rates for. You can refer to a list all supported currencies here
:type symbols: str
:param api_key: Account -> Account Details -> API KEY (use as password in external tools)
:type api_key: str
:return: Latest data of base currency
:rtype: pandas.DataFrame
"""
params = {
"base": base,
"api_key": api_key,
"start_date": start_date,
"end_date": end_date,
"symbols": symbols,
}
url = "https://api.currencyscoop.com/v1/timeseries"
r = requests.get(url, params=params)
temp_df = pd.DataFrame.from_dict(r.json()["response"])
temp_df = temp_df.T
temp_df.reset_index(inplace=True)
temp_df.rename(columns={"index": "date"}, inplace=True)
temp_df["date"] = pd.to_datetime(temp_df["date"]).dt.date
return temp_df
def currency_currencies(c_type: str = "fiat", api_key: str = "") -> pd.DataFrame:
"""
currencies data from currencyscoop.com
https://currencyscoop.com/api-documentation
:param c_type: now only "fiat" can return data
:type c_type: str
:param api_key: Account -> Account Details -> API KEY (use as password in external tools)
:type api_key: str
:return: Latest data of base currency
:rtype: pandas.DataFrame
"""
params = {"type": c_type, "api_key": api_key}
url = "https://api.currencyscoop.com/v1/currencies"
r = requests.get(url, params=params)
data_json = r.json()
temp_df = pd.DataFrame(data_json["response"])
return temp_df
def currency_convert(
base: str = "USD",
to: str = "CNY",
amount: str = "10000",
api_key: str = "",
) -> pd.DataFrame:
"""
currencies data from currencyscoop.com
https://currencyscoop.com/api-documentation
:param base: The base currency you would like to use for your rates
:type base: str
:param to: The currency you would like to use for your rates
:type to: str
:param amount: The amount of base currency
:type amount: str
:param api_key: Account -> Account Details -> API KEY (use as password in external tools)
:type api_key: str
:return: Latest data of base currency
:rtype: pandas.Series
"""
params = {
"from": base,
"to": to,
"amount": amount,
"api_key": api_key,
}
url = "https://api.currencyscoop.com/v1/convert"
r = requests.get(url, params=params)
temp_se = pd.Series(r.json()["response"])
temp_se["timestamp"] = pd.to_datetime(temp_se["timestamp"], unit="s")
temp_df = temp_se.to_frame()
temp_df.reset_index(inplace=True)
temp_df.columns = ["item", "value"]
return temp_df
if __name__ == "__main__":
currency_latest_df = currency_latest(base="USD", api_key="")
print(currency_latest_df)
currency_history_df = currency_history(base="USD", date="2023-02-03", api_key="")
print(currency_history_df)
currency_time_series_df = currency_time_series(
base="USD",
start_date="2023-02-03",
end_date="2023-03-04",
symbols="",
api_key="",
)
print(currency_time_series_df)
currency_currencies_df = currency_currencies(c_type="fiat", api_key="")
print(currency_currencies_df)
currency_convert_se = currency_convert(
base="USD", to="CNY", amount="10000", api_key=""
)
print(currency_convert_se)
@@ -0,0 +1,117 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2025/12/8 17:20
Desc: 新浪财经-中行人民币牌价历史数据查询
https://biz.finance.sina.com.cn/forex/forex.php?startdate=2012-01-01&enddate=2021-06-14&money_code=EUR&type=0
"""
from functools import lru_cache
from io import StringIO
import pandas as pd
import requests
from bs4 import BeautifulSoup
from tqdm import tqdm
@lru_cache()
def _currency_boc_sina_map(
start_date: str = "20210614", end_date: str = "20230810"
) -> dict:
"""
外汇 symbol 和代码映射
https://biz.finance.sina.com.cn/forex/forex.php?startdate=2012-01-01&enddate=2021-06-14&money_code=EUR&type=0
:param start_date: 开始交易日
:type start_date: str
:param end_date: 结束交易日
:type end_date: str
:return: 外汇 symbol 和代码映射
:rtype: dict
"""
url = "http://biz.finance.sina.com.cn/forex/forex.php"
params = {
"startdate": "-".join([start_date[:4], start_date[4:6], start_date[6:]]),
"enddate": "-".join([end_date[:4], end_date[4:6], end_date[6:]]),
"money_code": "EUR",
"type": "0",
}
r = requests.get(url, params=params)
r.encoding = "gbk"
soup = BeautifulSoup(r.text, "lxml")
data_dict = dict(
zip(
[
item.text
for item in soup.find(attrs={"id": "money_code"}).find_all("option")
],
[
item["value"]
for item in soup.find(attrs={"id": "money_code"}).find_all("option")
],
)
)
return data_dict
def currency_boc_sina(
symbol: str = "美元", start_date: str = "20230304", end_date: str = "20231110"
) -> pd.DataFrame:
"""
新浪财经-中行人民币牌价历史数据查询
https://biz.finance.sina.com.cn/forex/forex.php?startdate=2012-01-01&enddate=2021-06-14&money_code=EUR&type=0
:param symbol: choice of {'美元', '英镑', '欧元', '澳门元', '泰国铢', '菲律宾比索', '港币', '瑞士法郎', '新加坡元', '瑞典克朗', '丹麦克朗', '挪威克朗', '日元', '加拿大元', '澳大利亚元', '新西兰元', '韩国元'}
:type symbol: str
:param start_date: 开始交易日
:type start_date: str
:param end_date: 结束交易日
:type end_date: str
:return: 中行人民币牌价历史数据查询
:rtype: pandas.DataFrame
"""
data_dict = _currency_boc_sina_map(start_date=start_date, end_date=end_date)
url = "http://biz.finance.sina.com.cn/forex/forex.php"
params = {
"money_code": data_dict[symbol],
"type": "0",
"startdate": "-".join([start_date[:4], start_date[4:6], start_date[6:]]),
"enddate": "-".join([end_date[:4], end_date[4:6], end_date[6:]]),
"page": "1",
"call_type": "ajax",
}
r = requests.get(url, params=params)
soup = BeautifulSoup(r.text, features="lxml")
soup.find(attrs={"id": "money_code"})
page_element_list = soup.find_all("a", attrs={"class": "page"})
page_num = int(page_element_list[-2].text) if len(page_element_list) != 0 else 1
big_df = pd.DataFrame()
for page in tqdm(range(1, page_num + 1), leave=False):
params.update({"page": page})
r = requests.get(url, params=params)
temp_df = pd.read_html(StringIO(r.text), header=0)[0]
big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
big_df.columns = [
"日期",
"中行汇买价",
"中行钞买价",
"中行钞卖价/汇卖价",
"央行中间价",
"中行折算价",
]
big_df["日期"] = pd.to_datetime(big_df["日期"], errors="coerce").dt.date
big_df["中行汇买价"] = pd.to_numeric(big_df["中行汇买价"], errors="coerce")
big_df["中行钞买价"] = pd.to_numeric(big_df["中行钞买价"], errors="coerce")
big_df["中行钞卖价/汇卖价"] = pd.to_numeric(
big_df["中行钞卖价/汇卖价"], errors="coerce"
)
big_df["央行中间价"] = pd.to_numeric(big_df["央行中间价"], errors="coerce")
big_df["中行折算价"] = pd.to_numeric(big_df["中行折算价"], errors="coerce")
big_df.sort_values(by=["日期"], inplace=True, ignore_index=True)
return big_df
if __name__ == "__main__":
currency_boc_sina_df = currency_boc_sina(
symbol="美元", start_date="20230304", end_date="20231110"
)
print(currency_boc_sina_df)
@@ -0,0 +1,60 @@
# -*- coding:utf-8 -*-
# !/usr/bin/env python
"""
Date: 2024/4/29 17:00
Desc: 人民币汇率中间价
https://www.safe.gov.cn/safe/rmbhlzjj/index.html
"""
import re
from datetime import datetime
from io import StringIO
import pandas as pd
import requests
from bs4 import BeautifulSoup
def currency_boc_safe() -> pd.DataFrame:
"""
人民币汇率中间价
https://www.safe.gov.cn/safe/rmbhlzjj/index.html
:return: 人民币汇率中间价
:rtype: pandas.DataFrame
"""
url = "https://www.safe.gov.cn/safe/2020/1218/17833.html"
r = requests.get(url)
r.encoding = "utf8"
soup = BeautifulSoup(r.text, features="lxml")
content = soup.find(name="a", string=re.compile("人民币汇率"))["href"]
url = f"https://www.safe.gov.cn{content}"
temp_df = pd.read_excel(url)
temp_df.sort_values(by=["日期"], inplace=True)
temp_df.reset_index(inplace=True, drop=True)
start_date = (
(pd.Timestamp(temp_df["日期"].tolist()[-1]) + pd.Timedelta(days=1))
.isoformat()
.split("T")[0]
)
end_date = datetime.now().isoformat().split("T")[0]
url = "https://www.safe.gov.cn/AppStructured/hlw/RMBQuery.do"
payload = {
"startDate": start_date,
"endDate": end_date,
"queryYN": "true",
}
r = requests.post(url, data=payload)
current_temp_df = pd.read_html(StringIO(r.text))[-1]
current_temp_df.sort_values(by=["日期"], inplace=True)
current_temp_df.reset_index(inplace=True, drop=True)
big_df = pd.concat(objs=[temp_df, current_temp_df], ignore_index=True)
column_name_list = big_df.columns[1:]
for item in column_name_list:
big_df[item] = pd.to_numeric(big_df[item], errors="coerce")
big_df["日期"] = pd.to_datetime(big_df["日期"], errors="coerce").dt.date
return big_df
if __name__ == "__main__":
currency_boc_safe_df = currency_boc_safe()
print(currency_boc_safe_df)
@@ -0,0 +1,6 @@
# -*- coding:utf-8 -*-
# !/usr/bin/env python
"""
Date: 2022/5/9 18:08
Desc:
"""
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,989 @@
var TOKEN_SERVER_TIME = 1572845499.629;
function v_cookie (r, n, t, e, a) {
var u = n[0],
c = n[1],
v = a[0],
s = t[0],
f = t[1],
l = r[0],
d = hr(a[1], e[0], t[2]),
p = t[3],
h = e[1],
g = yr(a[2], a[3], e[2]),
m = yr(a[4], r[1], t[4]),
w = r[2],
I = a[5],
_ = a[6],
y = a[7],
E = hr(n[2], r[3], r[4]),
A = t[5],
C = e[3],
b = e[4],
B = t[6],
R = a[8],
T = a[9],
S = n[3],
k = t[7],
x = t[8],
O = a[10],
L = n[4],
M = n[5],
N = a[11],
P = e[5],
j = hr(n[6], e[6], t[9], r[5]),
D = t[10],
W = e[7],
$ = r[6],
F = yr(r[7], t[11], e[8], n[7]),
X = r[8],
H = t[12],
K = r[9],
U = n[8],
V = e[9],
Y = r[10],
J = e[10],
q = r[11],
Q = a[12],
Z = n[9],
G = t[13],
z = t[14],
rr = t[15],
nr = n[10],
tr = a[13],
er = a[14],
ar = e[11],
or = r[12],
ir = yr(t[16], r[13], r[14], r[15]),
ur = t[17],
cr = t[18];
function vr () {
var r = arguments[n[11]];
return r.split(n[12]).reverse().join(e[12])
}
var sr = [new e[13](hr(a[15], n[13], a[16])), new e[13](a[17])];
function fr () {
var n = arguments[a[18]];
if (!n) return a[19];
for (var o = t[19], i = e[14], u = e[15]; u < n.length; u++)
{
var c = n.charCodeAt(u),
v = c ^ i;
i = c,
o += r[16].fromCharCode(v)
}
return o
}
var lr = '',
dr; !
function (o) {
var i = e[18],
c = e[19];
o[e[20]] = a[21];
function v (t, a, o, i, u) {
var c, v, s;
c = v = s = r;
var f, l, d;
f = l = d = n;
var p, h, g;
p = h = g = e;
var m = t + g[21] + a;
i && (m += l[15] + i),
u && (m += h[22] + u),
o && (m += v[17] + o),
l[14][g[23]] = m
}
o[e[24]] = l;
function s (t, e, a) {
var o = n[16];
this.setCookie(t, r[18], i + o + c, e, a)
}
o[t[22]] = f;
function f (o) {
var i = vr(e[25], a[22]),
c = a[23][n[17]],
v = u + i + o + t[23],
s = '';
if (s == -r[19])
{
if (v = o + t[23], c.substr(a[24], v.length) != v) return;
s = a[24]
}
var f = s + v[r[20]],
l = '';
return l == -e[26] && (l = c[t[24]])
}
o[e[27]] = v;
function l () {
var r, t, a;
r = t = a = e;
var i, u, c;
i = u = c = n;
var v = u[18];
this.setCookie(v, a[28]),
this.getCookie(v) || (o[i[19]] = u[20]),
this.delCookie(v)
}
o[n[21]] = s
}(dr || (dr = {}));
var pr;
function hr () {
var r = arguments[a[25]];
if (!r) return a[19];
for (var e = a[19], o = t[25], i = n[22], u = t[18]; u < r.length; u++)
{
var c = r.charCodeAt(u);
i = (i + t[26]) % o.length,
c ^= o.charCodeAt(i),
e += String.fromCharCode(c)
}
return e
} !
function (o) {
var i, u, d;
i = u = d = a;
var p, h, g;
p = h = g = t;
var m, w, I;
m = w = I = r;
var _, y, E;
_ = y = E = n;
var b, B, R;
b = B = R = e;
var T = B[29],
S = y[23],
k = m[22],
x = w[0],
O = E[24],
L = (C, Ar, R[30]),
M = b[31],
N = T + S,
P = p[28],
j,
W = m[23][y[25]],
$,
F;
function X (r) {
return function () {
F.appendChild(j),
j.addBehavior(u[26]),
j.load(N);
var n = r();
return F.removeChild(j),
n
}
}
function H () {
var r = A;
r = D;
try
{
return !!(N in B[32] && b[32][N])
} catch (n)
{
return void B[15]
}
}
function K (r) {
return P ? G(r) : j ? Y(r) : void _[26]
}
function U () {
if (P = H(), P) j = _[27][N];
else if (W[k + c][I[24]]) try
{
$ = new ActiveXObject(vr(I[25], y[28], w[26])),
$.open(),
$.write(y[29]),
$.close(),
F = $.w[B[33]][I[27]][_[30]],
j = F.createElement(I[28])
} catch (r)
{
j = W.createElement(N),
F = W[vr(I[29], d[27])] || W.getElementsByTagName(b[17])[I[27]] || W[m[30]]
}
}
o[w[31]] = U;
function V (r, n) {
var t = J;
if (void 0 === n) return Z(r);
if (t = sr, P) z(r, n);
else
{
if (!j) return void B[15];
Q(r, n)
}
}
o[v + x] = V;
function Y (r) {
X(function () {
return r = J(r),
j.getAttribute(r)
})()
}
function J (r) {
var n = z;
n = v;
var t = vr(Ir, w[32]),
e = new y[31](t + O + s + L, b[31]);
return r.replace(new B[13](d[28]), b[34]).replace(e, p[29])
}
function q (r) {
try
{
j.removeItem(r)
} catch (n) { }
}
o[M + f + l] = K;
function Q (r, n) {
var t = G;
t = cr,
X(function () {
var t = M;
r = J(r),
t = K;
try
{
j.setAttribute(r, n),
j.save(N)
} catch (e) { }
})()
}
function Z (r) {
var n, t, e;
if (n = t = e = g, P) q(r);
else
{
if (!j) return void t[18];
rr(r)
}
}
function G (r) {
try
{
return j.getItem(r)
} catch (n)
{
return y[20]
}
}
o[fr(w[33], p[30], R[35])] = Z;
function z (r, n) {
try
{
j.setItem(r, n)
} catch (t) { }
}
function rr (r) {
X(function () {
r = J(r),
j.removeAttribute(r),
j.save(N)
})()
}
}(pr || (pr = {}));
var gr = function () {
var o, i, u;
o = i = u = e;
var c, v, s;
c = v = s = a;
var f, l, g;
f = l = g = n;
var m, w, I;
m = w = I = t;
var _, E, A;
_ = E = A = r;
var C = yr(Cr, U, _[34]),
b = vr(A[35], m[31]),
R = hr(g[32], c[29], i[36]),
T = hr(l[33], g[34], i[37], tr);
function S (r) {
this[m[32]] = r;
for (var n = o[15], t = r[i[38]]; t > n; n++) this[n] = i[15]
}
return S[d + p + C][b + h] = function () {
for (var r = this[vr(h, E[36], E[37])], n = [], t = -I[26], e = o[15], a = r[A[20]]; a > e; e++) for (var u = this[e], f = r[e], d = t += f; n[d] = u & parseInt(v[30], l[35]), --f != s[24];)--d,
u >>= parseInt(i[39], c[31]);
return n
},
S[vr(w[33], v[32])][_[38]] = function (r) {
var n = dr,
t = this[vr(y, l[36], A[39])],
e = f[26];
n = B;
for (var a = v[24], o = t[l[37]]; o > a; a++)
{
var i = t[a],
u = l[26];
do u = (u << parseInt(R + T, g[35])) + r[e++];
while (--i > w[18]);
this[a] = u >>> w[18]
}
},
S
}(),
mr; !
function (o) {
var i, u, c;
i = u = c = n;
var v, s, f;
v = s = f = e;
var l, d, p;
l = d = p = a;
var h, w, I;
h = w = I = r;
var _, y, E;
_ = y = E = t;
var A = y[34],
C = (nr, U, h[40]),
b = p[25];
function B (r) {
for (var n = y[35], t = f[15], e = r[vr(c[38], I[41], H)], a = []; e > t;)
{
var o = k[r.charAt(t++)] << parseInt(g + A, d[31]) | k[r.charAt(t++)] << parseInt(n + m, h[42]) | k[r.charAt(t++)] << parseInt(I[43], i[35]) | k[r.charAt(t++)];
a.push(o >> parseInt(_[36], h[42]), o >> l[31] & parseInt(u[39], i[40]), o & parseInt(d[30], c[35]))
}
return a
}
function T (r) {
for (var n = (O, R, p[24]), t = I[27], e = r[E[24]]; e > t; t++) n = (n << E[37]) - n + r[t];
return n & parseInt(E[38], p[33])
}
for (var S = s[40], k = {},
x = s[15]; x < parseInt(I[44], l[34]); x++) k[S.charAt(x)] = x;
function L (r) {
var n = B(r),
t = n[u[26]];
if (t != b) return error = yr(V, u[41], s[41], v[42]),
void 0;
var e = n[s[26]],
a = [];
return P(n, +_[39], a, +_[18], e),
T(a) == e ? a : void 0
}
function M (r) {
var n = T(r),
t = [b, n];
return P(r, +l[24], t, +p[25], n),
N(t)
}
function N (r) {
var n, t, e;
n = t = e = f;
var a, o, u;
a = o = u = y;
var c, v, s;
c = v = s = h;
var d, p, g;
d = p = g = l;
var m, w, I;
m = w = I = i;
for (var _ = m[42], E = d[24], A = r[c[20]], b = []; A > E;)
{
var B = r[E++] << parseInt(fr(Z, d[35]), o[39]) | r[E++] << g[31] | r[E++];
b.push(S.charAt(B >> parseInt(m[43], t[43])), S.charAt(B >> parseInt(p[36], o[40]) & parseInt(I[44], I[45])), S.charAt(B >> n[44] & parseInt(_ + C, n[42])), S.charAt(B & parseInt(fr(d[37], c[45], or), a[41])))
}
return b.join(o[19])
}
function P (r, n, t, e, a) {
var o, i, u;
o = i = u = w;
var c, v, s;
c = v = s = E;
for (var f = r[v[24]]; f > n;) t[e++] = r[n++] ^ a & parseInt(u[46], s[42]),
a = ~(a * parseInt(v[43], v[40]))
}
o[E[44]] = N,
o[_[45]] = B,
o[v[45]] = M,
o[y[46]] = L
}(mr || (mr = {}));
var wr; !
function (o) {
var i = a[38],
u = r[47],
c = t[47],
v = vr(n[46], a[39], a[40]),
s = e[46],
f = e[47],
l = a[41],
d = a[42];
function p (o) {
var i = a[43],
u = vr(n[47], e[48], n[48]),
c = {},
v = function (o, c) {
var s, f, l, d;
for (c = c.replace(n[49], n[12]), c = c.substring(e[26], c[e[38]] - e[26]), s = c.split(e[49]), l = a[24]; l < s[yr(v, sr, t[48])]; l++) if (f = s[l].split(n[50]), f && !(f[a[44]] < t[39]))
{
for (d = n[35]; d < f[r[20]]; d++) f[n[11]] = f[n[11]] + r[48] + f[d];
f[n[26]] = new a[45](r[49]).test(f[n[26]]) ? f[e[15]].substring(r[19], f[e[15]][a[44]] - n[11]) : f[n[26]],
f[n[11]] = new r[50](i + u + w).test(f[n[11]]) ? f[e[26]].substring(t[26], f[r[19]][n[37]] - t[26]) : f[a[18]],
o[f[r[27]]] = f[n[11]]
}
return o
};
return new a[45](I + _).test(o) && (c = v(c, o)),
c
}
function h (n) {
for (var t = [], e = a[24]; e < n[r[20]]; e++) t.push(n.charCodeAt(e));
return t
}
function g (o) {
var u = a[46];
if (typeof o === vr(O, a[47], or) && o[a[48]]) try
{
var c = parseInt(o[a[48]]);
switch (c)
{
case parseInt(i + u, t[42]): break;
case parseInt(yr(t[49], r[51], e[50]), e[43]): top[t[50]][n[51]] = o[e[51]];
break;
case parseInt(yr(a[25], j, e[52]), n[52]): top[n[53]][t[51]] = o[t[52]]
}
} catch (v) { }
}
function m (r, n, t) {
}
function L () {
var e, a, o;
e = a = o = r;
var i, u, c;
i = u = c = n;
var v, s, f;
v = s = f = t;
var l = f[53],
d = c[54],
p = new e[52];
return typeof TOKEN_SERVER_TIME == y + l + d ? s[18] : (time = parseInt(TOKEN_SERVER_TIME), time)
}
function M () {
var o = new t[54];
try
{
return time = n[2].now(),
time / parseInt(fr(a[50], a[51], r[53]), t[40]) >>> e[15]
} catch (i)
{
return time = o.getTime(),
time / parseInt(e[53], a[25]) >>> r[27]
}
}
function N (r) {
for (var a = t[18], o = r[t[24]] - n[11]; o >= e[15]; o--) a = a << e[26] | +r[o];
return a
}
function P (a) {
var o = new r[50](n[55]);
if (K(a)) return a;
var i = o.test(a) ? -e[54] : -t[39],
u = a.split(r[54]);
return u.slice(i).join(fr(n[56], t[55], E))
}
function j (t) {
for (var o = n[26], i = e[15], u = t[vr(r[55], a[52], D)]; u > i; i++) o = (o << r[56]) - o + t.charCodeAt(i),
o >>>= n[26];
return o
}
function W (n, o) {
var i = new a[45](t[56], yr(r[57], $, t[57], r[58])),
u = new a[45](t[58]);
if (n)
{
var c = n.match(i);
if (c)
{
var v = c[e[26]];
return o && u.test(v) && (v = v.split(t[59]).pop().split(r[48])[e[15]]),
v
}
}
}
function $ (o) {
var i = n[57],
u = vr(e[55], e[56]),
f = e[4];
if (!(o > t[60]))
{
o = o || a[24];
var l = parseInt(E + c + A, r[42]),
d = n[14].createElement(e[57]);
d[r[59]] = n[58] + parseInt((new a[53]).getTime() / l) + r[60],
d[r[61]] = function () {
var n = a[46];
cr = r[19],
setTimeout(function () {
$(++o)
},
o * parseInt(C + n, a[33]))
},
d[t[61]] = d[hr(a[54], a[55], t[62])] = function () {
var a = n[59];
this[i + v + u + b] && this[e[58]] !== n[60] && this[s + B + a + f] !== e[59] && this[t[63]] !== n[61] || (cr = e[15], d[hr(N, r[62], n[62], e[25])] = d[t[64]] = r[63])
},
e[60][e[61]].appendChild(d)
}
}
function F () {
var r = a[56];
return Math.random() * parseInt(R + T + f + r, t[42]) >>> n[26]
}
function X (r) {
var e = new n[31](fr(t[65], t[66], a[57]), yr(c, n[63], t[57]));
if (r)
{
var o = r.match(e);
return o
}
}
o[S + k] = p,
o[r[64]] = $,
o[t[67]] = g,
o[t[68]] = h,
o[t[69]] = j,
o[t[70]] = F,
o[r[65]] = K,
o[x + l] = P,
o[t[71]] = W,
o[t[72]] = X,
o[hr(r[66], t[73], r[67], C)] = N,
o[t[74]] = M,
o[d + O] = L;
function K (n) {
return new r[50](t[75]).test(n)
}
o[r[68]] = m
}(wr || (wr = {}));
var Ir; !
function (o) {
var i = t[76],
u = t[77],
c = n[65],
v = t[78],
s = a[24],
f = n[26],
l = t[18],
d = t[18],
p = e[15],
h = a[24],
g = r[69],
m = '';
wr.eventBind(e[60], n[67], E),
wr.eventBind(r[71], t[79], E),
wr.eventBind(t[20], hr(e[64], A, a[59]), b),
wr.eventBind(e[60], r[72], y);
function w () {
return f
}
function I (r) {
f++
}
function _ () {
return {
x: p,
y: h,
trusted: g
}
}
function y (r) {
d++
}
function E (r) {
s++
}
function C () {
return l
}
function b (r) {
var o, i, u;
o = i = u = n;
var c, s, f;
c = s = f = t;
var d, m, w;
d = m = w = e;
var I, _, y;
I = _ = y = a;
var E = I[60],
A = d[65];
l++ ,
g = void 0 == r[E + A + v] || r[yr(f[80], s[81], i[68])],
p = r[s[82]],
h = r[c[83]]
}
function B () {
return d
}
function R () {
return s
}
o[r[73]] = R,
o[a[61]] = w,
o[fr(a[62], n[69])] = C,
o[n[70]] = B,
o[r[74]] = _
}(Ir || (Ir = {}));
var _r; !
function (u) {
var v = fr(n[71], t[84]),
s = r[75],
f = yr(dr, n[72], e[66], $),
l = r[76],
d = e[67],
p = r[77],
h = hr(dr, r[78], a[63], n[73]),
g = r[79],
m = n[74];
BROWSER_LIST = {
};
function w () {
var t, e, a;
t = e = a = r;
var o, i, u;
o = i = u = n;
return wr.booleanToDecimal(c)
}
function I (t) {
for (var o = n[26]; o < y[e[38]]; o++)
{
var i = y[o][r[94]];
if (t.test(i)) return !a[24]
}
return !a[18]
}
function E (t) {
}
function A () {
return a[73]
}
function B () {
return n[20]
}
function T () {
return I(new t[93](r[96]))
}
function S () {
return I(new a[45](t[98], r[97]))
}
function k () {
for (var r in BROWSER_LIST) if (BROWSER_LIST.hasOwnProperty(r))
{
var n = BROWSER_LIST[r];
if (n()) return + r.substr(a[18])
}
return e[15]
}
function x () {
var n, a, o;
n = a = o = r;
var i, u, c;
i = u = c = t;
var v, s, f;
v = s = f = e;
var l = s[75],
d = s[76];
return I(new u[93](o[98], v[71])) || E(l + F + d + X)
}
function O () {
}
function L () {
var r, n, t;
r = n = t = a;
var o, i, u;
o = i = u = e;
var c = l;
return c = p
}
function M () {
var r, n, a;
r = n = a = t;
var o, i, u;
o = i = u = e;
var c;
try
{
c = i[60].createElement(a[99]).getContext(i[78])
} catch (v) { }
return !!c
}
function J () {
var t, e, o;
t = e = o = n;
var i, u, c;
i = u = c = a;
var v, s, f;
return v = s = f = r,
-parseInt(s[100], c[31]) === (new e[2]).getTimezoneOffset()
}
function Q () {
try
{
} catch (e)
{
return r[101]
}
}
function Z () {
var n, a, o;
n = a = o = e;
var i, u, c;
i = u = c = r;
var v, s, f;
return v = s = f = t,
plugin_num = s[18],
plugin_num
}
var z = [R, x, S, T, L, Q, b, V, O, J, M, q, Y, B, tr, A];
var nr = [new e[13](n[85]), new n[31](e[82]), new r[50](e[83]), new r[50](t[102]), new n[31](e[84]), new a[45](a[78]), new a[45](e[85]), new e[13](t[103]), new a[45](r[103]), new t[93](r[104]), new a[45](r[105])];
function tr () {
return e[86]
}
u[e[87]] = rr,
u[a[79]] = k,
u[yr(c, e[88], r[106])] = Z,
u[K + U + m] = w
}(_r || (_r = {}));
function yr () {
var o = arguments[a[25]];
if (!o) return t[19];
for (var i = a[19], u = e[14], c = r[27]; c < o.length; c++)
{
var v = o.charCodeAt(c),
s = v ^ u;
u = u * c % a[80] + e[89],
i += n[86].fromCharCode(s)
}
return i
}
var Er; !
function (o) {
var i = a[81],
u = t[35],
c = r[107],
v = vr(S, a[56]),
f = r[27],
l = r[19],
d = a[25],
p = n[87],
h = parseInt(e[90], r[108]),
g = a[82],
m = parseInt(vr(s, t[104]), t[39]),
w = r[109],
I = t[40],
_ = parseInt(i + V, n[45]),
y = parseInt(u + c, n[52]),
E = parseInt(t[105], r[42]),
A = e[91],
C = parseInt(Y + v, r[42]),
b = parseInt(e[92], e[93]),
B = t[106],
R = parseInt(vr(e[94], e[95]), t[41]),
T = parseInt(a[83], e[93]),
k;
function x () {
var r = M();
return r
}
function O () {
var r = t[26],
a = n[35],
o = e[54],
i = n[88];
k = new gr([i, i, i, i, r, r, r, o, a, a, a, a, a, a, a, i, a, r]),
k[l] = wr.serverTimeNow(),
L(),
k[B] = cr,
k[T] = ur,
k[R] = e[15],
k[C] = _r.getBrowserFeature(),
k[g] = _r.getBrowserIndex(),
k[m] = _r.getPluginNum()
}
function L () {
var a = dr.getCookie(tr) || pr.get(ar);
if (a && a[r[20]] == parseInt(e[96], n[52]))
{
var o = mr.decode(a);
if (o && (k.decodeBuffer(o), k[f] != t[18])) return
}
k[f] = wr.random()
}
o[a[84]] = O;
function M () {
k[R]++ ,
k[l] = wr.serverTimeNow(),
k[d] = wr.timeNow(),
k[B] = cr,
k[w] = Ir.getMouseMove(),
k[I] = Ir.getMouseClick(),
k[_] = Ir.getMouseWhell(),
k[y] = Ir.getKeyDown(),
k[E] = Ir.getClickPos().x,
k[A] = Ir.getClickPos().y;
var r = k.toBuffer();
return mr.encode(r)
}
o[yr(r[3], n[89], e[97])] = x
}(Er || (Er = {}));
var Ar; !
function (o) {
var i = n[90],
u = a[85],
v = r[110],
s = a[86],
f = t[107],
p,
h,
m,
w,
I,
_;
function E (r) {
return N(r) && dr[a[87]]
}
function A (o) {
var i = wr.getOriginFromUrl(o);
return i ? !new n[31](yr(r[42], c, t[110]) + w).test(i[r[108]]) || !new e[13](I).test(i[a[18]]) : t[111]
}
function C (e) {
var o = (_r, g, Er.update());
return e + (new r[50](vr(a[88], a[89])).test(e) ? n[91] : vr(P, a[90], t[112])) + er + t[23] + r[111](o)
}
function b (o, i, u) {
if (r[112] in i) return i.apply(o, u);
switch (u[n[37]])
{
case n[26]:
return i();
case a[18]:
return i(u[n[26]]);
case r[108]:
return i(u[e[15]], u[r[19]]);
default:
return i(u[n[26]], u[r[108]], u[t[17]])
}
}
function B () {
var r = Er.update();
return r
}
function k (r, e, o) {
if (!r) return n[20];
var i = r[e];
if (!i) return t[111];
var u = o(i);
return d || (u[a[97]] = i + t[19]),
u[n[97]] = i,
r[e] = u,
a[21]
}
function M (o) {
var i, u, c;
i = u = c = n;
var v, s, l;
v = s = l = r;
var d, p, h;
d = p = h = e;
var g, m, w;
g = m = w = a;
var I, _, y;
I = _ = y = t;
var R = hr(I[121], w[106], d[109]),
T;
k(o, _[122],
function (r) {
var n = w[107];
return function () {
var t, e, a;
t = e = a = _;
var o, i, u;
o = i = u = l;
var c, v, s;
c = v = s = w;
var f = s[108];
try
{
A(arguments[s[18]]) && !E(arguments[o[19]]) ? arguments[a[26]] = C(arguments[s[18]]) : T = B(),
r.apply(this, arguments),
A(arguments[i[19]]) || this.setRequestHeader(ar, T)
} catch (d)
{
return n + f
}
}
}),
k(o, g[109],
function (r) {
var n = b;
n = M;
var t = vr(_[123], u[107]);
return function () {
var n = fr(f, c[108], I[124]),
e = s[122];
try
{
if (parseInt(this.status) === parseInt(h[110], v[123]))
{
for (var a = r.apply(this, arguments), o = new p[13](i[109], n + R), u, l, d = {}; u = o.exec(a);) d[u[m[18]].toLowerCase()] = u[v[108]];
wr.analysisRst(wr.parse(d[ir.toLowerCase()]))
}
} catch (g)
{
return e + t
}
return r.apply(this, arguments)
}
})
}
function N (r) {
var n = wr.getHostFromUrl(r, e[28]);
return n ? _.test(n) : e[28]
}
function j () {
var cookie_v;
cookie_v = B()
return cookie_v
}
o[n[111]] = j
}(Ar || (Ar = {}));
var Cr;
var cookie = (function (a) {
function _ () {
var cookie_v;
Er.Init();
cookie_v = Ar.Init();
return cookie_v
}
return function y () {
try
{
return _()
} catch (r)
{
return r
}
}
})()
return cookie()
}
function v () {
var v;
v = v_cookie(
["t", 34, '"$', 36, "\fb", 55, "ure", "lJ#K", "Flash", "getBro", "1", "analys", "CHAMELEON_CALLBACK", 30, "\u256f\u0930\u097b\u09ff\u09a4\u0934\u099d\u09c1\u099d\u09d9\u09a7\u09c3\u0995\u09f0\u09d3\u0a62\u0a6f\u09bc\u09ad\u0934", "F,sp-", String, "; expires=", "", 1, "length", "; ", '', '', "addBehavior", ";^l", ">*]+", 0, "div", "&~!", "", "Init", "('&%$#\"![", ">NJ", "\u254e\u096d\u095f", "W$R", "sdelif_esab", "Or)E", "decodeBuffer", 84, "f", "htgnel", 8, "110", "40", "\u2504\u2562", "255", "o", ":", '^".*"$', RegExp, 40, Date, "e9", ".", 19, 5, "t8JOi", "}B", "src", ".js", "onerror", "*q:", null, "getServerTime", "isIPAddr", "8-", "ZX9Y]V8aWs3VQZ7Y", "eventBind", !0, "wheel", '', "keydown", "getMouseMove", "getClickPos", "vent", "me", "MSG", 41, "th", "safari", "ActiveXObject", "maxHeight", "head", "Google Inc.", "vendor", "sgAppName", "opr", 94, "tugw`pj", "chrome", "2345Explorer", "ome", "TheWorld", "name", "\u2553\u253c\u2572\u251d\u2569\u253d\u254f\u252e\u254d\u2526", "Native Client", "i", "Shockwave", "systemLanguage", "740", !1, "plugins", "^ARM", "^iPod", "^BlackBerry", "\u2550\u0978\u094e\u09c1\u09bc\u0928\u0989\u09d8\u099a\u09f3\u09b7\u09dc", "0", 2, 7, "c", encodeURIComponent, "apply", "headers", "8S:+", "\u2560\u2509\u2567\u2503\u256c\u251b", "\u255e\u2530\u2543\u2526\u2554\u2520\u2562\u2507\u2561\u250e\u257c\u2519", "a", 14, ":dB2", "href", "click", "err", 16, "hostname", "`60w", "\fbf", "&X "],
[";", "Element", Date, "par", "i", "DOMMous", 21, "xmT", "wserFe", "h", !0, 1, "", Boolean, '', "; domain=", "n 1970 00:", "cookie", "checkcookie", "allow", !1, "delCookie", 2333, "torage", ")*+,/\\\\:;", '', 0, '', "eliflmth", '', "ducument", RegExp, "W", "qsU", 61, 2, "sdelif_esab", "length", "I", "ff", 16, 45, "3", "10010", "77", 8, "6e%d", "DT{e", "$", / /g, ":", "href", 10, "location", "ned", "\\.com\\.cn$|\\.com\\.hk$", 63, "rea", "https://s.thsi.cn/js/chameleon/time.1", "tat", "loaded", "interactive", "WY:ZYS", "E?`a", "addEventListener", "eScroll", "onmousewheel", "mousemove", "\u255e\u096e\u096e\u09e3\u09a5\u092e\u099a\u09d4\u0990", "\u2550\u2535\u2541\u250c\u2563\u2516\u2565\u2500\u2543\u252f\u2546\u2525\u254e", "getKeyDown", "H69<J", "v~g-", "", "ature", "callPhantom", "ActiveXObject", "Uint8Array", "WeakMap", "JX%<", "chrome", "@L:!", "20", "language", "localStorage", "^Win32", String, 3, 4, "=XAE", "hea", "&", "/", "\\R$", '^R"VP', "s", "include", "_raw", "x.", "isRst", "SCRIPT", "ta", "base", "$?", "^_self$", "#", "unload", "ro", "\u2550", "^(.*?):[ \\t]*([^\\r\\n]*)\\r?$", "g", "Init", "t6?x}", "\u2574\u0955\u097b\u09dc\u0995\u0911\u09ab\u09fe\u09ba\u09e2\u098e\u09fe\u09f9\u09f9\u09f3\u0a55", "=d' "],
["<=>?@[\\]^", "e", "HE9", "tot", "\u2503", "0", "dyS", "se", "getRoot", "NR", "nd", 60, "ng", "s", "get", "mit", 13, 3, 0, "", '', "\u255f\u253a\u255b\u253f", "getCookie", "=", "length", "V587", 1, String, !0, "___", "\u2553\u2536\u255a", "uBot", "base_fileds", 32, "2", "1", "20", 5, "255", 2, 8, 16, 10, "203", "base64Encode", "base64Decode", "decode", "760", "\u255b\u0978\u0954\u09f6\u09a4\u0935", 70, "location", "href", "redirect_url", "efi", Date, "\u2519", "^\\s*(?:https?:)?\\/{2,}([^\\/\\?\\#\\\\]+)", "\u255e", "[@:]", "@", 7, "onload", 'WY$PYS/FLV"P[_7[_R', "readyState", "onreadystatechange", '"^w', "\u2569\u2535\u2546\u256c\u2544\u257b\u2541\u2569\u2501\u2575\u2501\u2571\u2502\u253d\u2507\u252e\u2507\u2538\u2564\u254b\u2530\u2502\u252e\u2553\u257b\u2520\u257e\u2522\u250d\u2551\u256e\u2532\u2511\u254d\u2511\u254c\u2567\u254e", "analysisRst", "strToBytes", "strhash", "random", "getHostFromUrl", "getOriginFromUrl", 83, "timeNow", "^(\\d+\\.)+\\d+$", "d", "v", "ted", "touchmove", 85, "F(K9i", "clientX", "clientY", "\u257a\u2515\u256f\u253c", "postMessage", '', "ActiveXObject", "Apple Computer, Inc.", "Q", "chr", "\u2558\u2535\u2550", "BIDUBrowser", RegExp, "QQBrowser", "ro", "aef", "msDoNotTrack", "PDF|Acrobat", "canvas", "yE", "\u255b\u253a\u2554\u2533\u2546\u2527\u2540\u2525\u2556", "^Android", "^Linux [ix]\\d+", "011", "13", 15, "sub", "addEventListener", "jsonp_ignore", "\u2569", !1, 'L"', "Sj", "T{_,", "q*", "i", "tagName", "et", "{'K", "Pp<", "#x'", "open", "rS", "KN3", "#", "protocol", "\\.", "DEDAOL_NOELEMAHC"],
[83, "ffer", "\u2505", "20", "e", "ngsE", Error, "est", "\u2552\u095b\u0956\u09f0\u09a3\u0935\u09c0\u09e2", "1", "sr", "hexin-v", "", RegExp, 9527, 0, "**l>", "head", "Thu, 01 Ja", "00:00 GMT", "allow", "=", "; path=", "cookie", "Init", 33, 1, "setCookie", !0, "localS", "`{|}~]", "g", '', "frames", "___$&", 56, " ", "\b", "length", "10", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_", "\u2552\u096f\u0948\u09fe\u09a2", 16, 2, 6, "encode", "rea", "729", "*.", ",", "\u2506\u092c\u090b\u09a0\u09e1\u096d\u09df\u0981\u09c4\u098c", "redirect_url", "\u2506\u092d\u090a\u09a3", "1111101000", 3, 47, "tat", "script", "readyState", "complete", '', "body", "onwheel", "mousewheel", 37, "rus", "\u2554\u0975", "chr", "ActiveXObject", "WeakMap", "aT1Kg", "i", 24, "\u2554\u253c\u254e\u2521\u254c\u2529", "\u2547\u0971\u094f\u09f6\u09b9\u0933\u099d", "Shockwav", "hockwave", "$cdc_asdjflasutopfhvcZLmcfl_", "webgl2", "2>n|", "plugins", "platform", "^Win64", "^Linux armv|Android", "^iPhone", "^MacIntel", !1, "getPlatform", "6Y,", 2333, "100", 12, "14", 10, 36, "01", "60", "\u2542\u096d\u095e\u09f0\u09a4\u0938", "j", 17, "Request", "prototype", "`z}lc", "error", "s", "r", "target", "\u255e", "A", "U", "193", "host", "$"],
["se", "g@g?", Array, "*Y", Number, "^{.", "*}$", "und", "429", "496", "imeNow", "etti", "rg", "v", "hexin-v", Error, "L_%\\T8", ".baidu.", 1, "", Function, !0, " ", '', 0, 2, "#default#userData", "ydob", "^d", 89, "11111111", 8, "epytotorp", 10, 16, "\u2506\u2536\u2506\u2536\u2506", "14", 13, "10", "Syd", 44, "Domain", "serverT", '^"', "length", RegExp, "00", "tcejbo", "status_code", "n", 66, "\u2506\u2531\u2504\u2534", "htgnel", Date, "L%", 67, "5", "?)'", '', "[[?VS", "isT", "getMouseWhell", "}}", "TR", "ActiveXObject", "WE", "python", "Maxthon", 97, "chrome", "Ryp", "UBrowser", 54, !1, "ontouchstart", "\u254d\u0975\u0917\u09f2\u09be", "iso-8859-1", "defaultCharset", "^iPad", "getBrowserIndex", 256, "1", 5, "17", "Init", "XMLHttp", "tar", "allow", "@*", "?\\", "?", "\u2571\u2503\u256a\u2546\u2566\u2556\u2567\u2547\u2501\u2564\u2506\u2526\u2514\u2524\u2511\u2521\u2501\u2531\u2501\u253b\u250b\u253b\u2501\u2531\u2501\u2521\u2566\u252b\u257f", "den", "tia", 94, "ls", "\u2554\u2526\u2543", "_str", 37, "append", "Child", "\u255f", "\u2569\u0975\u094e\u09e5\u09a0\u092e\u09d1\u09ed\u09ce", "srcElement", "parentNode", "\u2543\u2522\u2545\u250b\u256a\u2507\u2562", "}*", "err", "or", "getAllResponseHeaders", "\\.?", "\\."]
);
return v
}
@@ -0,0 +1,39 @@
# -*- coding:utf-8 -*-
# !/usr/bin/env python
"""
Date: 2024/12/30 15:30
Desc: 导入文件工具可以正确处理路径问题
"""
import pathlib
from importlib import resources
def get_ths_js(file: str = "ths.js") -> pathlib.Path:
"""
get path to data "ths.js" text file.
:return: 文件路径
:rtype: pathlib.Path
"""
with resources.path("akshare.data", file) as f:
data_file_path = f
return data_file_path
def get_crypto_info_csv(file: str = "crypto_info.zip") -> pathlib.Path:
"""
get path to data "ths.js" text file.
:return: 文件路径
:rtype: pathlib.Path
"""
with resources.path("akshare.data", file) as f:
data_file_path = f
return data_file_path
if __name__ == "__main__":
get_ths_js_path = get_ths_js(file="ths.js")
print(get_ths_js_path)
get_crypto_info_csv_path = get_crypto_info_csv(file="crypto_info.zip")
print(get_crypto_info_csv_path)
@@ -0,0 +1,6 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2019/10/21 12:08
Desc:
"""
@@ -0,0 +1,233 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2019/10/21 21:11
Desc: 宏观经济配置文件
"""
# urls-china
JS_CHINA_CPI_YEARLY_URL = (
"https://cdn.jin10.com/dc/reports/dc_chinese_cpi_yoy_all.js?v={}&_={}"
)
JS_CHINA_CPI_MONTHLY_URL = (
"https://cdn.jin10.com/dc/reports/dc_chinese_cpi_mom_all.js?v={}&_={}"
)
JS_CHINA_M2_YEARLY_URL = (
"https://cdn.jin10.com/dc/reports/dc_chinese_m2_money_supply_yoy_all.js?v={}&_={}"
)
JS_CHINA_PPI_YEARLY_URL = (
"https://cdn.jin10.com/dc/reports/dc_chinese_ppi_yoy_all.js?v={}&_={}"
)
JS_CHINA_PMI_YEARLY_URL = (
"https://cdn.jin10.com/dc/reports/dc_chinese_manufacturing_pmi_all.js?v={}&_={}"
)
JS_CHINA_GDP_YEARLY_URL = (
"https://cdn.jin10.com/dc/reports/dc_chinese_gdp_yoy_all.js?v={}&_={}"
)
JS_CHINA_CX_PMI_YEARLY_URL = "https://cdn.jin10.com/dc/reports/dc_chinese_caixin_manufacturing_pmi_all.js?v={}&_={}"
JS_CHINA_CX_SERVICE_PMI_YEARLY_URL = (
"https://cdn.jin10.com/dc/reports/dc_chinese_caixin_services_pmi_all.js?v={}&_={}"
)
JS_CHINA_FX_RESERVES_YEARLY_URL = (
"https://cdn.jin10.com/dc/reports/dc_chinese_fx_reserves_all.js?v={}&_={}"
)
JS_CHINA_ENERGY_DAILY_URL = (
"https://cdn.jin10.com/dc/reports/dc_qihuo_energy_report_all.js?v={}&_={}"
)
JS_CHINA_NON_MAN_PMI_MONTHLY_URL = (
"https://cdn.jin10.com/dc/reports/dc_chinese_non_manufacturing_pmi_all.js?v={}&_={}"
)
JS_CHINA_RMB_DAILY_URL = "https://cdn.jin10.com/dc/reports/dc_rmb_data_all.js?v={}&_={}"
JS_CHINA_MARKET_MARGIN_SZ_URL = (
"https://cdn.jin10.com/dc/reports/dc_market_margin_sz_all.js?v={}&_={}"
)
JS_CHINA_MARKET_MARGIN_SH_URL = (
"https://cdn.jin10.com/dc/reports/dc_market_margin_sse_all.js?v={}&_={}"
)
JS_CHINA_REPORT_URL = "https://cdn.jin10.com/dc/reports/dc_sge_report_all.js?v={}&_={}"
# urls-usa
JS_USA_INTEREST_RATE_URL = (
"https://cdn.jin10.com/dc/reports/dc_usa_interest_rate_decision_all.js?v={}&_={}"
)
JS_USA_NON_FARM_URL = (
"https://cdn.jin10.com/dc/reports/dc_nonfarm_payrolls_all.js?v={}&_={}"
)
JS_USA_UNEMPLOYMENT_RATE_URL = (
"https://cdn.jin10.com/dc/reports/dc_usa_unemployment_rate_all.js??v={}&_={}"
)
JS_USA_EIA_CRUDE_URL = (
"https://cdn.jin10.com/dc/reports/dc_eia_crude_oil_all.js?v={}&_={}"
)
JS_USA_INITIAL_JOBLESS_URL = (
"https://cdn.jin10.com/dc/reports/dc_initial_jobless_all.js?v={}&_={}"
)
JS_USA_CORE_PCE_PRICE_URL = (
"https://cdn.jin10.com/dc/reports/dc_usa_core_pce_price_all.js?v={}&_={}"
)
JS_USA_CPI_MONTHLY_URL = "https://cdn.jin10.com/dc/reports/dc_usa_cpi_all.js?v={}&_={}"
JS_USA_LMCI_URL = "https://cdn.jin10.com/dc/reports/dc_usa_lmci_all.js?v={}&_={}"
JS_USA_ADP_NONFARM_URL = (
"https://cdn.jin10.com/dc/reports/dc_adp_nonfarm_employment_all.js?v={}&_={}"
)
JS_USA_GDP_MONTHLY_URL = "https://cdn.jin10.com/dc/reports/dc_usa_gdp_all.js?v={}&_={}"
JS_USA_EIA_CRUDE_PRODUCE_URL = (
"https://cdn.jin10.com/dc/reports/dc_eia_crude_oil_produce_all.js?v={}&_={}"
)
# urls-euro
JS_EURO_RATE_DECISION_URL = (
"https://cdn.jin10.com/dc/reports/dc_interest_rate_decision_all.js?v={}&_={}"
)
# urls-constitute
JS_CONS_GOLD_ETF_URL = "https://cdn.jin10.com/dc/reports/dc_etf_gold_all.js?v={}&_={}"
JS_CONS_SLIVER_ETF_URL = (
"https://cdn.jin10.com/dc/reports/dc_etf_sliver_all.js?v={}&_={}"
)
JS_CONS_OPEC_URL = "https://cdn.jin10.com/dc/reports/dc_opec_report_all.js??v={}&_={}"
usa_name_url_map = {
"美联储决议报告": "//datacenter.jin10.com/reportType/dc_usa_interest_rate_decision",
"美国非农就业人数报告": "//datacenter.jin10.com/reportType/dc_nonfarm_payrolls",
"美国失业率报告": "//datacenter.jin10.com/reportType/dc_usa_unemployment_rate",
"美国CPI月率报告": "//datacenter.jin10.com/reportType/dc_usa_cpi",
"美国初请失业金人数报告": "//datacenter.jin10.com/reportType/dc_initial_jobless",
"美国核心PCE物价指数年率报告": "//datacenter.jin10.com/reportType/dc_usa_core_pce_price",
"美国EIA原油库存报告": "//datacenter.jin10.com/reportType/dc_eia_crude_oil",
"美联储劳动力市场状况指数报告": "//datacenter.jin10.com/reportType/dc_usa_lmci",
"美国ADP就业人数报告": "//datacenter.jin10.com/reportType/dc_adp_nonfarm_employment",
"美国国内生产总值(GDP)报告": "//datacenter.jin10.com/reportType/dc_usa_gdp",
"美国原油产量报告": "//datacenter.jin10.com/reportType/dc_eia_crude_oil_produce",
"美国零售销售月率报告": "//datacenter.jin10.com/reportType/dc_usa_retail_sales",
"美国商品期货交易委员会CFTC外汇类非商业持仓报告": "//datacenter.jin10.com/reportType/dc_cftc_nc_report",
"美国NFIB小型企业信心指数报告": "//datacenter.jin10.com/reportType/dc_usa_nfib_small_business",
"贝克休斯钻井报告": "//datacenter.jin10.com/reportType/dc_rig_count_summary",
"美国谘商会消费者信心指数报告": "//datacenter.jin10.com/reportType/dc_usa_cb_consumer_confidence",
"美国FHFA房价指数月率报告": "//datacenter.jin10.com/reportType/dc_usa_house_price_index",
"美国个人支出月率报告": "//datacenter.jin10.com/reportType/dc_usa_personal_spending",
"美国生产者物价指数(PPI)报告": "//datacenter.jin10.com/reportType/dc_usa_ppi",
"美国成屋销售总数年化报告": "//datacenter.jin10.com/reportType/dc_usa_exist_home_sales",
"美国成屋签约销售指数月率报告": "//datacenter.jin10.com/reportType/dc_usa_pending_home_sales",
"美国S&P/CS20座大城市房价指数年率报告": "//datacenter.jin10.com/reportType/dc_usa_spcs20",
"美国进口物价指数报告": "//datacenter.jin10.com/reportType/dc_usa_import_price",
"美国营建许可总数报告": "//datacenter.jin10.com/reportType/dc_usa_building_permits",
"美国商品期货交易委员会CFTC商品类非商业持仓报告": "//datacenter.jin10.com/reportType/dc_cftc_c_report",
"美国挑战者企业裁员人数报告": "//datacenter.jin10.com/reportType/dc_usa_job_cuts",
"美国实际个人消费支出季率初值报告": "//datacenter.jin10.com/reportType/dc_usa_real_consumer_spending",
"美国贸易帐报告": "//datacenter.jin10.com/reportType/dc_usa_trade_balance",
"美国经常帐报告": "//datacenter.jin10.com/reportType/dc_usa_current_account",
"美国API原油库存报告": "//datacenter.jin10.com/reportType/dc_usa_api_crude_stock",
"美国工业产出月率报告": "//datacenter.jin10.com/reportType/dc_usa_industrial_production",
"美国耐用品订单月率报告": "//datacenter.jin10.com/reportType/dc_usa_durable_goods_orders",
"美国工厂订单月率报告": "//datacenter.jin10.com/reportType/dc_usa_factory_orders",
"Markit服务业PMI终值": "//datacenter.jin10.com/reportType/dc_usa_services_pmi",
"商业库存月率": "//datacenter.jin10.com/reportType/dc_usa_business_inventories",
"美国ISM非制造业PMI": "//datacenter.jin10.com/reportType/dc_usa_ism_non_pmi",
"NAHB房产市场指数": "//datacenter.jin10.com/reportType/dc_usa_nahb_house_market_index",
"新屋开工总数年化": "//datacenter.jin10.com/reportType/dc_usa_house_starts",
"美国新屋销售总数年化": "//datacenter.jin10.com/reportType/dc_usa_new_home_sales",
"美国Markit制造业PMI初值报告": "//datacenter.jin10.com/reportType/dc_usa_pmi",
"美国ISM制造业PMI报告": "//datacenter.jin10.com/reportType/dc_usa_ism_pmi",
"美国密歇根大学消费者信心指数初值报告": "//datacenter.jin10.com/reportType/dc_usa_michigan_consumer_sentiment",
"美国出口价格指数报告": "//datacenter.jin10.com/reportType/dc_usa_export_price",
"美国核心生产者物价指数(PPI)报告": "//datacenter.jin10.com/reportType/dc_usa_core_ppi",
"美国核心CPI月率报告": "//datacenter.jin10.com/reportType/dc_usa_core_cpi",
"美国EIA俄克拉荷马州库欣原油库存报告": "//datacenter.jin10.com/reportType/dc_eia_cushing_oil",
"美国EIA精炼油库存报告": "//datacenter.jin10.com/reportType/dc_eia_distillates_stocks",
"美国EIA天然气库存报告": "//datacenter.jin10.com/reportType/dc_eia_natural_gas",
"美国EIA汽油库存报告": "//datacenter.jin10.com/reportType/dc_eia_gasoline",
}
china_name_url_map = {
"郑州商品交易所期货每日行情": "//datacenter.jin10.com/reportType/dc_czce_futures_data",
"中国CPI年率报告": "//datacenter.jin10.com/reportType/dc_chinese_cpi_yoy",
"中国PPI年率报告": "//datacenter.jin10.com/reportType/dc_chinese_ppi_yoy",
"中国以美元计算出口年率报告": "//datacenter.jin10.com/reportType/dc_chinese_exports_yoy",
"中国以美元计算进口年率报告": "//datacenter.jin10.com/reportType/dc_chinese_imports_yoy",
"中国以美元计算贸易帐报告": "//datacenter.jin10.com/reportType/dc_chinese_trade_balance",
"中国规模以上工业增加值年率报告": "//datacenter.jin10.com/reportType/dc_chinese_industrial_production_yoy",
"中国官方制造业PMI报告": "//datacenter.jin10.com/reportType/dc_chinese_manufacturing_pmi",
"中国财新制造业PMI终值报告": "//datacenter.jin10.com/reportType/dc_chinese_caixin_manufacturing_pmi",
"中国财新服务业PMI报告": "//datacenter.jin10.com/reportType/dc_chinese_caixin_services_pmi",
"中国外汇储备报告": "//datacenter.jin10.com/reportType/dc_chinese_fx_reserves",
"中国M2货币供应年率报告": "//datacenter.jin10.com/reportType/dc_chinese_m2_money_supply_yoy",
"中国GDP年率报告": "//datacenter.jin10.com/reportType/dc_chinese_gdp_yoy",
"人民币汇率中间价报告": "//datacenter.jin10.com/reportType/dc_rmb_data",
"在岸人民币成交量报告": "//datacenter.jin10.com/reportType/dc_dollar_rmb_report",
"上海期货交易所期货合约行情": "//datacenter.jin10.com/reportType/dc_shfe_futures_data",
"中国CPI月率报告": "//datacenter.jin10.com/reportType/dc_chinese_cpi_mom",
"大连商品交易所期货每日行情": "//datacenter.jin10.com/reportType/dc_dce_futures_data",
"中国金融期货交易所期货每日行情": "//datacenter.jin10.com/reportType/dc_cffex_futures_data",
"同业拆借报告": "//datacenter.jin10.com/reportType/dc_shibor",
"香港同业拆借报告": "//datacenter.jin10.com/reportType/dc_hk_market_info",
"深圳融资融券报告": "//datacenter.jin10.com/reportType/dc_market_margin_sz",
"上海融资融券报告": "//datacenter.jin10.com/reportType/dc_market_margin_sse",
"上海黄金交易所报告": "//datacenter.jin10.com/reportType/dc_sge_report",
"上海期货交易所仓单日报": "//datacenter.jin10.com/reportType/dc_shfe_daily_stock",
"大连商品交易所仓单日报": "//datacenter.jin10.com/reportType/dc_dce_daily_stock",
"郑州商品交易所仓单日报": "//datacenter.jin10.com/reportType/dc_czce_daily_stock",
"上海期货交易所指定交割仓库库存周报": "//datacenter.jin10.com/reportType/dc_shfe_weekly_stock",
"CCI指数5500大卡动力煤价格报告": "//datacenter.jin10.com/reportType/dc_cci_report",
"沿海六大电厂库存动态报告": "//datacenter.jin10.com/reportType/dc_qihuo_energy_report",
"国内期货市场实施热度报告": "//datacenter.jin10.com/reportType/dc_futures_market_realtime",
"中国官方非制造业PMI报告": "//datacenter.jin10.com/reportType/dc_chinese_non_manufacturing_pmi",
}
euro_name_url_map = {
"欧元区未季调贸易帐报告": "//datacenter.jin10.com/reportType/dc_eurozone_trade_balance_mom",
"欧元区季度GDP年率报告": "//datacenter.jin10.com/reportType/dc_eurozone_gdp_yoy",
"欧元区CPI年率报告": "//datacenter.jin10.com/reportType/dc_eurozone_cpi_yoy",
"欧元区PPI月率报告": "//datacenter.jin10.com/reportType/dc_eurozone_ppi_mom",
"欧元区零售销售月率报告": "//datacenter.jin10.com/reportType/dc_eurozone_retail_sales_mom",
"欧元区季调后就业人数季率报告": "//datacenter.jin10.com/reportType/dc_eurozone_employment_change_qoq",
"欧元区失业率报告": "//datacenter.jin10.com/reportType/dc_eurozone_unemployment_rate_mom",
"欧元区CPI月率报告": "//datacenter.jin10.com/reportType/dc_eurozone_cpi_mom",
"欧元区经常帐报告": "//datacenter.jin10.com/reportType/dc_eurozone_current_account_mom",
"欧元区工业产出月率报告": "//datacenter.jin10.com/reportType/dc_eurozone_industrial_production_mom",
"欧元区制造业PMI初值报告": "//datacenter.jin10.com/reportType/dc_eurozone_manufacturing_pmi",
"欧元区服务业PMI终值报告": "//datacenter.jin10.com/reportType/dc_eurozone_services_pmi",
"欧元区ZEW经济景气指数报告": "//datacenter.jin10.com/reportType/dc_eurozone_zew_economic_sentiment",
"欧元区Sentix投资者信心指数报告": "//datacenter.jin10.com/reportType/dc_eurozone_sentix_investor_confidence",
}
world_central_bank_map = {
"美联储决议报告": "//datacenter.jin10.com/reportType/dc_usa_interest_rate_decision",
"欧洲央行决议报告": "//datacenter.jin10.com/reportType/dc_interest_rate_decision",
"新西兰联储决议报告": "//datacenter.jin10.com/reportType/dc_newzealand_interest_rate_decision",
"中国央行决议报告": "//datacenter.jin10.com/reportType/dc_china_interest_rate_decision",
"瑞士央行决议报告": "//datacenter.jin10.com/reportType/dc_switzerland_interest_rate_decision",
"英国央行决议报告": "//datacenter.jin10.com/reportType/dc_english_interest_rate_decision",
"澳洲联储决议报告": "//datacenter.jin10.com/reportType/dc_australia_interest_rate_decision",
"日本央行决议报告": "//datacenter.jin10.com/reportType/dc_japan_interest_rate_decision",
"印度央行决议报告": "//datacenter.jin10.com/reportType/dc_india_interest_rate_decision",
"俄罗斯央行决议报告": "//datacenter.jin10.com/reportType/dc_russia_interest_rate_decision",
"巴西央行决议报告": "//datacenter.jin10.com/reportType/dc_brazil_interest_rate_decision",
}
constitute_report_map = {
"全球最大黄金ETF—SPDR Gold Trust持仓报告": "//datacenter.jin10.com/reportType/dc_etf_gold",
"全球最大白银ETF--iShares Silver Trust持仓报告": "//datacenter.jin10.com/reportType/dc_etf_sliver",
"芝加哥商业交易所(CME)能源类商品成交量报告": "//datacenter.jin10.com/reportType/dc_cme_energy_report",
"美国商品期货交易委员会CFTC外汇类非商业持仓报告": "//datacenter.jin10.com/reportType/dc_cftc_nc_report",
"美国商品期货交易委员会CFTC商品类非商业持仓报告": "//datacenter.jin10.com/reportType/dc_cftc_c_report",
"芝加哥商业交易所(CME)金属类商品成交量报告": "//datacenter.jin10.com/reportType/dc_cme_report",
"芝加哥商业交易所(CME)外汇类商品成交量报告": "//datacenter.jin10.com/reportType/dc_cme_fx_report",
"伦敦金属交易所(LME)库存报告": "//datacenter.jin10.com/reportType/dc_lme_report",
"伦敦金属交易所(LME)持仓报告": "//datacenter.jin10.com/reportType/dc_lme_traders_report",
"美国商品期货交易委员会CFTC商品类商业持仓报告": "//datacenter.jin10.com/reportType/dc_cftc_merchant_goods",
"美国商品期货交易委员会CFTC外汇类商业持仓报告": "//datacenter.jin10.com/reportType/dc_cftc_merchant_currency",
}
other_map = {
"投机情绪报告": "//datacenter.jin10.com/reportType/dc_ssi_trends",
"外汇实时波动监控": "//datacenter.jin10.com/reportType/dc_myFxBook_heat_map",
"外汇相关性报告": "//datacenter.jin10.com/reportType/dc_myFxBook_correlation",
"加密货币实时行情": "//datacenter.jin10.com/reportType/dc_bitcoin_current",
}
main_map = {
"全球最大黄金ETF—SPDR Gold Trust持仓报告": "//datacenter.jin10.com/reportType/dc_etf_gold",
"全球最大白银ETF--iShares Silver Trust持仓报告": "//datacenter.jin10.com/reportType/dc_etf_sliver",
"美国非农就业人数报告": "//datacenter.jin10.com/reportType/dc_nonfarm_payrolls",
"投机情绪报告": "//datacenter.jin10.com/reportType/dc_ssi_trends",
"数据达人 — 复合报告": "//datacenter.jin10.com/reportType/dc_complex_report?complexType=1",
"投行订单": "//datacenter.jin10.com/banks_orders",
"行情报价": "//datacenter.jin10.com/price_wall",
"美国EIA原油库存报告": "//datacenter.jin10.com/reportType/dc_eia_crude_oil",
"欧佩克报告": "//datacenter.jin10.com/reportType/dc_opec_report",
}
@@ -0,0 +1,390 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2025/1/17 15:30
Desc: 东方财富-经济数据-澳大利亚
https://data.eastmoney.com/cjsj/foreign_5_0.html
"""
import pandas as pd
import requests
# 零售销售月率
def macro_australia_retail_rate_monthly() -> pd.DataFrame:
"""
东方财富-经济数据-澳大利亚-零售销售月率
https://data.eastmoney.com/cjsj/foreign_5_0.html
:return: 零售销售月率
:rtype: pandas.DataFrame
"""
url = "https://datacenter-web.eastmoney.com/api/data/v1/get"
params = {
"reportName": "RPT_ECONOMICVALUE_AUSTRALIA",
"columns": "ALL",
"filter": '(INDICATOR_ID="EMG00152903")',
"pageNumber": "1",
"pageSize": "2000",
"sortColumns": "REPORT_DATE",
"sortTypes": "-1",
"source": "WEB",
"client": "WEB",
"p": "1",
"pageNo": "1",
"pageNum": "1",
}
r = requests.get(url, params=params)
data_json = r.json()
temp_df = pd.DataFrame(data_json["result"]["data"])
temp_df.columns = [
"-",
"-",
"-",
"时间",
"-",
"发布日期",
"现值",
"前值",
]
temp_df = temp_df[
[
"时间",
"前值",
"现值",
"发布日期",
]
]
temp_df["前值"] = pd.to_numeric(temp_df["前值"], errors="coerce")
temp_df["现值"] = pd.to_numeric(temp_df["现值"], errors="coerce")
temp_df["发布日期"] = pd.to_datetime(temp_df["发布日期"], errors="coerce").dt.date
temp_df.sort_values(by="发布日期", ignore_index=True, inplace=True)
return temp_df
# 贸易帐
def macro_australia_trade() -> pd.DataFrame:
"""
东方财富-经济数据-澳大利亚-贸易帐
https://data.eastmoney.com/cjsj/foreign_5_1.html
:return: 贸易帐
:rtype: pandas.DataFrame
"""
url = "https://datacenter-web.eastmoney.com/api/data/v1/get"
params = {
"reportName": "RPT_ECONOMICVALUE_AUSTRALIA",
"columns": "ALL",
"filter": '(INDICATOR_ID="EMG00152793")',
"pageNumber": "1",
"pageSize": "2000",
"sortColumns": "REPORT_DATE",
"sortTypes": "-1",
"source": "WEB",
"client": "WEB",
"p": "1",
"pageNo": "1",
"pageNum": "1",
}
r = requests.get(url, params=params)
data_json = r.json()
temp_df = pd.DataFrame(data_json["result"]["data"])
temp_df.columns = [
"-",
"-",
"-",
"时间",
"-",
"发布日期",
"现值",
"前值",
]
temp_df = temp_df[
[
"时间",
"前值",
"现值",
"发布日期",
]
]
temp_df["前值"] = pd.to_numeric(temp_df["前值"], errors="coerce")
temp_df["现值"] = pd.to_numeric(temp_df["现值"], errors="coerce")
temp_df["发布日期"] = pd.to_datetime(temp_df["发布日期"], errors="coerce").dt.date
temp_df.sort_values(by="发布日期", ignore_index=True, inplace=True)
return temp_df
# 失业率
def macro_australia_unemployment_rate() -> pd.DataFrame:
"""
东方财富-经济数据-澳大利亚-失业率
https://data.eastmoney.com/cjsj/foreign_5_2.html
:return: 失业率
:rtype: pandas.DataFrame
"""
url = "https://datacenter-web.eastmoney.com/api/data/v1/get"
params = {
"reportName": "RPT_ECONOMICVALUE_AUSTRALIA",
"columns": "ALL",
"filter": '(INDICATOR_ID="EMG00101141")',
"pageNumber": "1",
"pageSize": "2000",
"sortColumns": "REPORT_DATE",
"sortTypes": "-1",
"source": "WEB",
"client": "WEB",
"p": "1",
"pageNo": "1",
"pageNum": "1",
}
r = requests.get(url, params=params)
data_json = r.json()
temp_df = pd.DataFrame(data_json["result"]["data"])
temp_df.columns = [
"-",
"-",
"-",
"时间",
"-",
"发布日期",
"现值",
"前值",
]
temp_df = temp_df[
[
"时间",
"前值",
"现值",
"发布日期",
]
]
temp_df["前值"] = pd.to_numeric(temp_df["前值"], errors="coerce")
temp_df["现值"] = pd.to_numeric(temp_df["现值"], errors="coerce")
temp_df["发布日期"] = pd.to_datetime(temp_df["发布日期"], errors="coerce").dt.date
temp_df.sort_values(by="发布日期", ignore_index=True, inplace=True)
return temp_df
# 生产者物价指数季率
def macro_australia_ppi_quarterly() -> pd.DataFrame:
"""
东方财富-经济数据-澳大利亚-生产者物价指数季率
https://data.eastmoney.com/cjsj/foreign_5_3.html
:return: 生产者物价指数季率
:rtype: pandas.DataFrame
"""
url = "https://datacenter-web.eastmoney.com/api/data/v1/get"
params = {
"reportName": "RPT_ECONOMICVALUE_AUSTRALIA",
"columns": "ALL",
"filter": '(INDICATOR_ID="EMG00152722")',
"pageNumber": "1",
"pageSize": "2000",
"sortColumns": "REPORT_DATE",
"sortTypes": "-1",
"source": "WEB",
"client": "WEB",
"p": "1",
"pageNo": "1",
"pageNum": "1",
}
r = requests.get(url, params=params)
data_json = r.json()
temp_df = pd.DataFrame(data_json["result"]["data"])
temp_df.columns = [
"-",
"-",
"-",
"时间",
"-",
"发布日期",
"现值",
"前值",
]
temp_df = temp_df[
[
"时间",
"前值",
"现值",
"发布日期",
]
]
temp_df["前值"] = pd.to_numeric(temp_df["前值"], errors="coerce")
temp_df["现值"] = pd.to_numeric(temp_df["现值"], errors="coerce")
temp_df["发布日期"] = pd.to_datetime(temp_df["发布日期"], errors="coerce").dt.date
temp_df.sort_values(by="发布日期", ignore_index=True, inplace=True)
return temp_df
# 消费者物价指数季率
def macro_australia_cpi_quarterly() -> pd.DataFrame:
"""
东方财富-经济数据-澳大利亚-消费者物价指数季率
https://data.eastmoney.com/cjsj/foreign_5_4.html
:return: 消费者物价指数季率
:rtype: pandas.DataFrame
"""
url = "https://datacenter-web.eastmoney.com/api/data/v1/get"
params = {
"reportName": "RPT_ECONOMICVALUE_AUSTRALIA",
"columns": "ALL",
"filter": '(INDICATOR_ID="EMG00101104")',
"pageNumber": "1",
"pageSize": "2000",
"sortColumns": "REPORT_DATE",
"sortTypes": "-1",
"source": "WEB",
"client": "WEB",
"p": "1",
"pageNo": "1",
"pageNum": "1",
}
r = requests.get(url, params=params)
data_json = r.json()
temp_df = pd.DataFrame(data_json["result"]["data"])
temp_df.columns = [
"-",
"-",
"-",
"时间",
"-",
"发布日期",
"现值",
"前值",
]
temp_df = temp_df[
[
"时间",
"前值",
"现值",
"发布日期",
]
]
temp_df["前值"] = pd.to_numeric(temp_df["前值"], errors="coerce")
temp_df["现值"] = pd.to_numeric(temp_df["现值"], errors="coerce")
temp_df["发布日期"] = pd.to_datetime(temp_df["发布日期"], errors="coerce").dt.date
temp_df.sort_values(by="发布日期", ignore_index=True, inplace=True)
return temp_df
# 消费者物价指数年率
def macro_australia_cpi_yearly() -> pd.DataFrame:
"""
东方财富-经济数据-澳大利亚-消费者物价指数年率
https://data.eastmoney.com/cjsj/foreign_5_5.html
:return: 消费者物价指数年率
:rtype: pandas.DataFrame
"""
url = "https://datacenter-web.eastmoney.com/api/data/v1/get"
params = {
"reportName": "RPT_ECONOMICVALUE_AUSTRALIA",
"columns": "ALL",
"filter": '(INDICATOR_ID="EMG00101093")',
"pageNumber": "1",
"pageSize": "2000",
"sortColumns": "REPORT_DATE",
"sortTypes": "-1",
"source": "WEB",
"client": "WEB",
"p": "1",
"pageNo": "1",
"pageNum": "1",
}
r = requests.get(url, params=params)
data_json = r.json()
temp_df = pd.DataFrame(data_json["result"]["data"])
temp_df.columns = [
"-",
"-",
"-",
"时间",
"-",
"发布日期",
"现值",
"前值",
]
temp_df = temp_df[
[
"时间",
"前值",
"现值",
"发布日期",
]
]
temp_df["前值"] = pd.to_numeric(temp_df["前值"], errors="coerce")
temp_df["现值"] = pd.to_numeric(temp_df["现值"], errors="coerce")
temp_df["发布日期"] = pd.to_datetime(temp_df["发布日期"], errors="coerce").dt.date
temp_df.sort_values(by="发布日期", ignore_index=True, inplace=True)
return temp_df
# 央行公布利率决议
def macro_australia_bank_rate() -> pd.DataFrame:
"""
东方财富-经济数据-澳大利亚-央行公布利率决议
https://data.eastmoney.com/cjsj/foreign_5_6.html
:return: 央行公布利率决议
:rtype: pandas.DataFrame
"""
url = "https://datacenter-web.eastmoney.com/api/data/v1/get"
params = {
"reportName": "RPT_ECONOMICVALUE_AUSTRALIA",
"columns": "ALL",
"filter": '(INDICATOR_ID="EMG00342255")',
"pageNumber": "1",
"pageSize": "2000",
"sortColumns": "REPORT_DATE",
"sortTypes": "-1",
"source": "WEB",
"client": "WEB",
"p": "1",
"pageNo": "1",
"pageNum": "1",
}
r = requests.get(url, params=params)
data_json = r.json()
temp_df = pd.DataFrame(data_json["result"]["data"])
temp_df.columns = [
"-",
"-",
"-",
"时间",
"-",
"发布日期",
"现值",
"前值",
]
temp_df = temp_df[
[
"时间",
"前值",
"现值",
"发布日期",
]
]
temp_df["前值"] = pd.to_numeric(temp_df["前值"], errors="coerce")
temp_df["现值"] = pd.to_numeric(temp_df["现值"], errors="coerce")
temp_df["发布日期"] = pd.to_datetime(temp_df["发布日期"], errors="coerce").dt.date
temp_df.sort_values(by="发布日期", ignore_index=True, inplace=True)
return temp_df
if __name__ == "__main__":
macro_australia_retail_rate_monthly_df = macro_australia_retail_rate_monthly()
print(macro_australia_retail_rate_monthly_df)
macro_australia_trade_df = macro_australia_trade()
print(macro_australia_trade_df)
macro_australia_unemployment_rate_df = macro_australia_unemployment_rate()
print(macro_australia_unemployment_rate_df)
macro_australia_ppi_quarterly_df = macro_australia_ppi_quarterly()
print(macro_australia_ppi_quarterly_df)
macro_australia_cpi_quarterly_df = macro_australia_cpi_quarterly()
print(macro_australia_cpi_quarterly_df)
macro_australia_cpi_yearly_df = macro_australia_cpi_yearly()
print(macro_australia_cpi_yearly_df)
macro_australia_bank_rate_df = macro_australia_bank_rate()
print(macro_australia_bank_rate_df)
@@ -0,0 +1,274 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2024/11/5 17:11
Desc: 金十数据中心-经济指标-央行利率-主要央行利率
https://datacenter.jin10.com/economic
输出数据格式为 float64
美联储利率决议报告
欧洲央行决议报告
新西兰联储决议报告
中国央行决议报告
瑞士央行决议报告
英国央行决议报告
澳洲联储决议报告
日本央行决议报告
俄罗斯央行决议报告
印度央行决议报告
巴西央行决议报告
"""
import datetime
import time
import pandas as pd
import requests
def __get_interest_rate_data(attr_id: str, name: str = "利率") -> pd.DataFrame:
"""
利率决议报告公共函数
https://datacenter.jin10.com/reportType/dc_usa_interest_rate_decision
:param attr_id: 内置属性
:type attr_id: str
:param name: 利率报告名称
:type name: str
:return: 利率决议报告数据
:rtype: pandas.Series
"""
t = time.time()
headers = {
"Accept": "*/*",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/120.0.0.0 Safari/537.36",
"Origin": "https://datacenter.jin10.com",
"Referer": "https://datacenter.jin10.com/",
"x-app-id": "rU6QIu7JHe2gOUeR",
"x-version": "1.0.0",
}
base_url = "https://datacenter-api.jin10.com/reports/list_v2"
params = {
"max_date": "",
"category": "ec",
"attr_id": attr_id,
"_": str(int(round(t * 1000))),
}
interest_rate_data = []
try:
while True:
response = requests.get(
url=base_url, params=params, headers=headers, timeout=10
)
data = response.json()
if not data.get("data", {}).get("values"):
break
interest_rate_data.extend(data["data"]["values"])
# Update max_date for pagination
last_date = data["data"]["values"][-1][0]
next_date = (
datetime.datetime.strptime(last_date, "%Y-%m-%d").date()
- datetime.timedelta(days=1)
).isoformat()
params["max_date"] = next_date
except requests.exceptions.RequestException as e:
print(f"Error fetching data: {e}")
return pd.DataFrame()
# Convert to DataFrame
big_df = pd.DataFrame(interest_rate_data)
if big_df.empty:
return pd.DataFrame()
# Process DataFrame
big_df["商品"] = name
big_df.columns = ["日期", "今值", "预测值", "前值", "商品"]
big_df = big_df[["商品", "日期", "今值", "预测值", "前值"]]
# Convert data types
big_df["日期"] = pd.to_datetime(big_df["日期"]).dt.date
numeric_columns = ["今值", "预测值", "前值"]
for col in numeric_columns:
big_df[col] = pd.to_numeric(big_df[col], errors="coerce")
return big_df.sort_values("日期").reset_index(drop=True)
# 金十数据中心-经济指标-央行利率-主要央行利率-美联储利率决议报告
def macro_bank_usa_interest_rate() -> pd.DataFrame:
"""
美联储利率决议报告, 数据区间从 19820927-至今
https://datacenter.jin10.com/reportType/dc_usa_interest_rate_decision
:return: 美联储利率决议报告-今值(%)
:rtype: pandas.Series
"""
return __get_interest_rate_data(attr_id="24", name="美联储利率决议报告")
# 金十数据中心-经济指标-央行利率-主要央行利率-欧洲央行决议报告
def macro_bank_euro_interest_rate() -> pd.DataFrame:
"""
欧洲央行决议报告, 数据区间从 19990101-至今
https://datacenter.jin10.com/reportType/dc_interest_rate_decision
https://cdn.jin10.com/dc/reports/dc_interest_rate_decision_all.js?v=1578581663
:return: 欧洲央行决议报告-今值(%)
:rtype: pandas.Series
"""
return __get_interest_rate_data(attr_id="21", name="欧洲央行决议报告")
# 金十数据中心-经济指标-央行利率-主要央行利率-新西兰联储决议报告
def macro_bank_newzealand_interest_rate() -> pd.DataFrame:
"""
新西兰联储决议报告, 数据区间从 19990401-至今
https://datacenter.jin10.com/reportType/dc_newzealand_interest_rate_decision
https://cdn.jin10.com/dc/reports/dc_newzealand_interest_rate_decision_all.js?v=1578582075
:return: 新西兰联储决议报告-今值(%)
:rtype: pandas.Series
"""
return __get_interest_rate_data(attr_id="23", name="新西兰利率决议报告")
# 金十数据中心-经济指标-央行利率-主要央行利率-中国央行决议报告
def macro_bank_china_interest_rate() -> pd.DataFrame:
"""
中国央行决议报告, 数据区间从 19990105-至今
https://datacenter.jin10.com/reportType/dc_newzealand_interest_rate_decision
https://cdn.jin10.com/dc/reports/dc_newzealand_interest_rate_decision_all.js?v=1578582075
:return: 新西兰联储决议报告-今值(%)
:rtype: pandas.Series
"""
return __get_interest_rate_data(attr_id="91", name="中国央行决议报告")
# 金十数据中心-经济指标-央行利率-主要央行利率-瑞士央行决议报告
def macro_bank_switzerland_interest_rate() -> pd.DataFrame:
"""
瑞士央行利率决议报告, 数据区间从 20080313-至今
https://datacenter.jin10.com/reportType/dc_switzerland_interest_rate_decision
https://cdn.jin10.com/dc/reports/dc_switzerland_interest_rate_decision_all.js?v=1578582240
:return: 瑞士央行利率决议报告-今值(%)
:rtype: pandas.Series
"""
return __get_interest_rate_data(attr_id="25", name="瑞士央行决议报告")
# 金十数据中心-经济指标-央行利率-主要央行利率-英国央行决议报告
def macro_bank_english_interest_rate() -> pd.DataFrame:
"""
英国央行决议报告, 数据区间从 19700101-至今
https://datacenter.jin10.com/reportType/dc_english_interest_rate_decision
https://cdn.jin10.com/dc/reports/dc_english_interest_rate_decision_all.js?v=1578582331
:return: 英国央行决议报告-今值(%)
:rtype: pandas.Series
"""
return __get_interest_rate_data(attr_id="26", name="英国央行决议报告")
# 金十数据中心-经济指标-央行利率-主要央行利率-澳洲联储决议报告
def macro_bank_australia_interest_rate() -> pd.DataFrame:
"""
澳洲联储决议报告, 数据区间从 19800201-至今
https://datacenter.jin10.com/reportType/dc_australia_interest_rate_decision
https://cdn.jin10.com/dc/reports/dc_australia_interest_rate_decision_all.js?v=1578582414
:return: 澳洲联储决议报告-今值(%)
:rtype: pandas.Series
"""
return __get_interest_rate_data(attr_id="27", name="澳洲联储决议报告")
# 金十数据中心-经济指标-央行利率-主要央行利率-日本央行决议报告
def macro_bank_japan_interest_rate() -> pd.DataFrame:
"""
日本利率决议报告, 数据区间从 20080214-至今
https://datacenter.jin10.com/reportType/dc_japan_interest_rate_decision
https://cdn.jin10.com/dc/reports/dc_japan_interest_rate_decision_all.js?v=1578582485
:return: 日本利率决议报告-今值(%)
:rtype: pandas.Series
"""
return __get_interest_rate_data(attr_id="22", name="日本央行决议报告")
# 金十数据中心-经济指标-央行利率-主要央行利率-俄罗斯央行决议报告
def macro_bank_russia_interest_rate() -> pd.DataFrame:
"""
俄罗斯利率决议报告, 数据区间从 20030601-至今
https://datacenter.jin10.com/reportType/dc_russia_interest_rate_decision
https://cdn.jin10.com/dc/reports/dc_russia_interest_rate_decision_all.js?v=1578582572
:return: 俄罗斯利率决议报告-今值(%)
:rtype: pandas.Series
"""
return __get_interest_rate_data(attr_id="64", name="俄罗斯央行决议报告")
# 金十数据中心-经济指标-央行利率-主要央行利率-印度央行决议报告
def macro_bank_india_interest_rate() -> pd.DataFrame:
"""
印度利率决议报告, 数据区间从 20000801-至今
https://datacenter.jin10.com/reportType/dc_india_interest_rate_decision
https://cdn.jin10.com/dc/reports/dc_india_interest_rate_decision_all.js?v=1578582645
:return: 印度利率决议报告-今值(%)
:rtype: pandas.Series
"""
return __get_interest_rate_data(attr_id="68", name="印度央行决议报告")
# 金十数据中心-经济指标-央行利率-主要央行利率-巴西央行决议报告
def macro_bank_brazil_interest_rate() -> pd.DataFrame:
"""
巴西利率决议报告, 数据区间从 20080201-至今
https://datacenter.jin10.com/reportType/dc_brazil_interest_rate_decision
https://cdn.jin10.com/dc/reports/dc_brazil_interest_rate_decision_all.js?v=1578582718
:return: 巴西利率决议报告-今值(%)
:rtype: pandas.Series
"""
return __get_interest_rate_data(attr_id="55", name="巴西央行决议报告")
if __name__ == "__main__":
# 金十数据中心-经济指标-央行利率-主要央行利率-美联储利率决议报告
macro_bank_usa_interest_rate_df = macro_bank_usa_interest_rate()
print(macro_bank_usa_interest_rate_df)
# 金十数据中心-经济指标-央行利率-主要央行利率-欧洲央行决议报告
macro_bank_euro_interest_rate_df = macro_bank_euro_interest_rate()
print(macro_bank_euro_interest_rate_df)
# 金十数据中心-经济指标-央行利率-主要央行利率-新西兰联储决议报告
macro_bank_newzealand_interest_rate_df = macro_bank_newzealand_interest_rate()
print(macro_bank_newzealand_interest_rate_df)
# 金十数据中心-经济指标-央行利率-主要央行利率-中国央行决议报告
macro_bank_china_interest_rate_df = macro_bank_china_interest_rate()
print(macro_bank_china_interest_rate_df)
# 金十数据中心-经济指标-央行利率-主要央行利率-瑞士央行决议报告
macro_bank_switzerland_interest_rate_df = macro_bank_switzerland_interest_rate()
print(macro_bank_switzerland_interest_rate_df)
# 金十数据中心-经济指标-央行利率-主要央行利率-英国央行决议报告
macro_bank_english_interest_rate_df = macro_bank_english_interest_rate()
print(macro_bank_english_interest_rate_df)
# 金十数据中心-经济指标-央行利率-主要央行利率-澳洲联储决议报告
macro_bank_australia_interest_rate_df = macro_bank_australia_interest_rate()
print(macro_bank_australia_interest_rate_df)
# 金十数据中心-经济指标-央行利率-主要央行利率-日本央行决议报告
macro_bank_japan_interest_rate_df = macro_bank_japan_interest_rate()
print(macro_bank_japan_interest_rate_df)
# 金十数据中心-经济指标-央行利率-主要央行利率-俄罗斯央行决议报告
macro_bank_russia_interest_rate_df = macro_bank_russia_interest_rate()
print(macro_bank_russia_interest_rate_df)
# 金十数据中心-经济指标-央行利率-主要央行利率-印度央行决议报告
macro_bank_india_interest_rate_df = macro_bank_india_interest_rate()
print(macro_bank_india_interest_rate_df)
# 金十数据中心-经济指标-央行利率-主要央行利率-巴西央行决议报告
macro_bank_brazil_interest_rate_df = macro_bank_brazil_interest_rate()
print(macro_bank_brazil_interest_rate_df)
@@ -0,0 +1,552 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2022/11/27 20:30
Desc: 东方财富-经济数据-加拿大
https://data.eastmoney.com/cjsj/foreign_5_0.html
"""
import pandas as pd
import requests
# 新屋开工
def macro_canada_new_house_rate() -> pd.DataFrame:
"""
东方财富-经济数据-加拿大-新屋开工
https://data.eastmoney.com/cjsj/foreign_7_0.html
:return: 新屋开工
:rtype: pandas.DataFrame
"""
url = "https://datacenter-web.eastmoney.com/api/data/v1/get"
params = {
"reportName": "RPT_ECONOMICVALUE_CA",
"columns": "ALL",
"filter": '(INDICATOR_ID="EMG00342247")',
"pageNumber": "1",
"pageSize": "2000",
"sortColumns": "REPORT_DATE",
"sortTypes": "-1",
"source": "WEB",
"client": "WEB",
"p": "1",
"pageNo": "1",
"pageNum": "1",
}
r = requests.get(url, params=params)
data_json = r.json()
temp_df = pd.DataFrame(data_json["result"]["data"])
temp_df.columns = [
"-",
"-",
"-",
"-",
"时间",
"-",
"发布日期",
"现值",
"前值",
]
temp_df = temp_df[
[
"时间",
"前值",
"现值",
"发布日期",
]
]
temp_df["前值"] = pd.to_numeric(temp_df["前值"], errors="coerce")
temp_df["现值"] = pd.to_numeric(temp_df["现值"], errors="coerce")
temp_df["发布日期"] = pd.to_datetime(temp_df["发布日期"]).dt.date
return temp_df
# 失业率
def macro_canada_unemployment_rate() -> pd.DataFrame:
"""
东方财富-经济数据-加拿大-失业率
https://data.eastmoney.com/cjsj/foreign_7_1.html
:return: 失业率
:rtype: pandas.DataFrame
"""
url = "https://datacenter-web.eastmoney.com/api/data/v1/get"
params = {
"reportName": "RPT_ECONOMICVALUE_CA",
"columns": "ALL",
"filter": '(INDICATOR_ID="EMG00157746")',
"pageNumber": "1",
"pageSize": "2000",
"sortColumns": "REPORT_DATE",
"sortTypes": "-1",
"source": "WEB",
"client": "WEB",
"p": "1",
"pageNo": "1",
"pageNum": "1",
}
r = requests.get(url, params=params)
data_json = r.json()
temp_df = pd.DataFrame(data_json["result"]["data"])
temp_df.columns = [
"-",
"-",
"-",
"-",
"时间",
"-",
"发布日期",
"现值",
"前值",
]
temp_df = temp_df[
[
"时间",
"前值",
"现值",
"发布日期",
]
]
temp_df["前值"] = pd.to_numeric(temp_df["前值"], errors="coerce")
temp_df["现值"] = pd.to_numeric(temp_df["现值"], errors="coerce")
temp_df["发布日期"] = pd.to_datetime(temp_df["发布日期"]).dt.date
return temp_df
# 贸易帐
def macro_canada_trade() -> pd.DataFrame:
"""
东方财富-经济数据-加拿大-贸易帐
https://data.eastmoney.com/cjsj/foreign_7_2.html
:return: 贸易帐
:rtype: pandas.DataFrame
"""
url = "https://datacenter-web.eastmoney.com/api/data/v1/get"
params = {
"reportName": "RPT_ECONOMICVALUE_CA",
"columns": "ALL",
"filter": '(INDICATOR_ID="EMG00102022")',
"pageNumber": "1",
"pageSize": "2000",
"sortColumns": "REPORT_DATE",
"sortTypes": "-1",
"source": "WEB",
"client": "WEB",
"p": "1",
"pageNo": "1",
"pageNum": "1",
}
r = requests.get(url, params=params)
data_json = r.json()
temp_df = pd.DataFrame(data_json["result"]["data"])
temp_df.columns = [
"-",
"-",
"-",
"-",
"时间",
"-",
"发布日期",
"现值",
"前值",
]
temp_df = temp_df[
[
"时间",
"前值",
"现值",
"发布日期",
]
]
temp_df["前值"] = pd.to_numeric(temp_df["前值"], errors="coerce")
temp_df["现值"] = pd.to_numeric(temp_df["现值"], errors="coerce")
temp_df["发布日期"] = pd.to_datetime(temp_df["发布日期"]).dt.date
return temp_df
# 零售销售月率
def macro_canada_retail_rate_monthly() -> pd.DataFrame:
"""
东方财富-经济数据-加拿大-零售销售月率
https://data.eastmoney.com/cjsj/foreign_7_3.html
:return: 零售销售月率
:rtype: pandas.DataFrame
"""
url = "https://datacenter-web.eastmoney.com/api/data/v1/get"
params = {
"reportName": "RPT_ECONOMICVALUE_CA",
"columns": "ALL",
"filter": '(INDICATOR_ID="EMG01337094")',
"pageNumber": "1",
"pageSize": "2000",
"sortColumns": "REPORT_DATE",
"sortTypes": "-1",
"source": "WEB",
"client": "WEB",
"p": "1",
"pageNo": "1",
"pageNum": "1",
}
r = requests.get(url, params=params)
data_json = r.json()
temp_df = pd.DataFrame(data_json["result"]["data"])
temp_df.columns = [
"-",
"-",
"-",
"-",
"时间",
"-",
"发布日期",
"现值",
"前值",
]
temp_df = temp_df[
[
"时间",
"前值",
"现值",
"发布日期",
]
]
temp_df["前值"] = pd.to_numeric(temp_df["前值"], errors="coerce")
temp_df["现值"] = pd.to_numeric(temp_df["现值"], errors="coerce")
temp_df["发布日期"] = pd.to_datetime(temp_df["发布日期"]).dt.date
return temp_df
# 央行公布利率决议
def macro_canada_bank_rate() -> pd.DataFrame:
"""
东方财富-经济数据-加拿大-央行公布利率决议
https://data.eastmoney.com/cjsj/foreign_7_4.html
:return: 央行公布利率决议
:rtype: pandas.DataFrame
"""
url = "https://datacenter-web.eastmoney.com/api/data/v1/get"
params = {
"reportName": "RPT_ECONOMICVALUE_CA",
"columns": "ALL",
"filter": '(INDICATOR_ID="EMG00342248")',
"pageNumber": "1",
"pageSize": "2000",
"sortColumns": "REPORT_DATE",
"sortTypes": "-1",
"source": "WEB",
"client": "WEB",
"p": "1",
"pageNo": "1",
"pageNum": "1",
}
r = requests.get(url, params=params)
data_json = r.json()
temp_df = pd.DataFrame(data_json["result"]["data"])
temp_df.columns = [
"-",
"-",
"-",
"-",
"时间",
"-",
"发布日期",
"现值",
"前值",
]
temp_df = temp_df[
[
"时间",
"前值",
"现值",
"发布日期",
]
]
temp_df["前值"] = pd.to_numeric(temp_df["前值"], errors="coerce")
temp_df["现值"] = pd.to_numeric(temp_df["现值"], errors="coerce")
temp_df["发布日期"] = pd.to_datetime(temp_df["发布日期"]).dt.date
return temp_df
# 核心消费者物价指数年率
def macro_canada_core_cpi_yearly() -> pd.DataFrame:
"""
东方财富-经济数据-加拿大-核心消费者物价指数年率
https://data.eastmoney.com/cjsj/foreign_7_5.html
:return: 核心消费者物价指数年率
:rtype: pandas.DataFrame
"""
url = "https://datacenter-web.eastmoney.com/api/data/v1/get"
params = {
"reportName": "RPT_ECONOMICVALUE_CA",
"columns": "ALL",
"filter": '(INDICATOR_ID="EMG00102030")',
"pageNumber": "1",
"pageSize": "2000",
"sortColumns": "REPORT_DATE",
"sortTypes": "-1",
"source": "WEB",
"client": "WEB",
"p": "1",
"pageNo": "1",
"pageNum": "1",
}
r = requests.get(url, params=params)
data_json = r.json()
temp_df = pd.DataFrame(data_json["result"]["data"])
temp_df.columns = [
"-",
"-",
"-",
"-",
"时间",
"-",
"发布日期",
"现值",
"前值",
]
temp_df = temp_df[
[
"时间",
"前值",
"现值",
"发布日期",
]
]
temp_df["前值"] = pd.to_numeric(temp_df["前值"], errors="coerce")
temp_df["现值"] = pd.to_numeric(temp_df["现值"], errors="coerce")
temp_df["发布日期"] = pd.to_datetime(temp_df["发布日期"]).dt.date
return temp_df
# 核心消费者物价指数月率
def macro_canada_core_cpi_monthly() -> pd.DataFrame:
"""
东方财富-经济数据-加拿大-核心消费者物价指数月率
https://data.eastmoney.com/cjsj/foreign_7_6.html
:return: 核心消费者物价指数月率
:rtype: pandas.DataFrame
"""
url = "https://datacenter-web.eastmoney.com/api/data/v1/get"
params = {
"reportName": "RPT_ECONOMICVALUE_CA",
"columns": "ALL",
"filter": '(INDICATOR_ID="EMG00102044")',
"pageNumber": "1",
"pageSize": "2000",
"sortColumns": "REPORT_DATE",
"sortTypes": "-1",
"source": "WEB",
"client": "WEB",
"p": "1",
"pageNo": "1",
"pageNum": "1",
}
r = requests.get(url, params=params)
data_json = r.json()
temp_df = pd.DataFrame(data_json["result"]["data"])
temp_df.columns = [
"-",
"-",
"-",
"-",
"时间",
"-",
"发布日期",
"现值",
"前值",
]
temp_df = temp_df[
[
"时间",
"前值",
"现值",
"发布日期",
]
]
temp_df["前值"] = pd.to_numeric(temp_df["前值"], errors="coerce")
temp_df["现值"] = pd.to_numeric(temp_df["现值"], errors="coerce")
temp_df["发布日期"] = pd.to_datetime(temp_df["发布日期"]).dt.date
return temp_df
# 消费者物价指数年率
def macro_canada_cpi_yearly() -> pd.DataFrame:
"""
东方财富-经济数据-加拿大-消费者物价指数年率
https://data.eastmoney.com/cjsj/foreign_7_7.html
:return: 消费者物价指数年率
:rtype: pandas.DataFrame
"""
url = "https://datacenter-web.eastmoney.com/api/data/v1/get"
params = {
"reportName": "RPT_ECONOMICVALUE_CA",
"columns": "ALL",
"filter": '(INDICATOR_ID="EMG00102029")',
"pageNumber": "1",
"pageSize": "2000",
"sortColumns": "REPORT_DATE",
"sortTypes": "-1",
"source": "WEB",
"client": "WEB",
"p": "1",
"pageNo": "1",
"pageNum": "1",
}
r = requests.get(url, params=params)
data_json = r.json()
temp_df = pd.DataFrame(data_json["result"]["data"])
temp_df.columns = [
"-",
"-",
"-",
"-",
"时间",
"-",
"发布日期",
"现值",
"前值",
]
temp_df = temp_df[
[
"时间",
"前值",
"现值",
"发布日期",
]
]
temp_df["前值"] = pd.to_numeric(temp_df["前值"], errors="coerce")
temp_df["现值"] = pd.to_numeric(temp_df["现值"], errors="coerce")
temp_df["发布日期"] = pd.to_datetime(temp_df["发布日期"]).dt.date
return temp_df
# 消费者物价指数月率
def macro_canada_cpi_monthly() -> pd.DataFrame:
"""
东方财富-经济数据-加拿大-消费者物价指数月率
https://data.eastmoney.com/cjsj/foreign_7_8.html
:return: 消费者物价指数月率
:rtype: pandas.DataFrame
"""
url = "https://datacenter-web.eastmoney.com/api/data/v1/get"
params = {
"reportName": "RPT_ECONOMICVALUE_CA",
"columns": "ALL",
"filter": '(INDICATOR_ID="EMG00158719")',
"pageNumber": "1",
"pageSize": "2000",
"sortColumns": "REPORT_DATE",
"sortTypes": "-1",
"source": "WEB",
"client": "WEB",
"p": "1",
"pageNo": "1",
"pageNum": "1",
}
r = requests.get(url, params=params)
data_json = r.json()
temp_df = pd.DataFrame(data_json["result"]["data"])
temp_df.columns = [
"-",
"-",
"-",
"-",
"时间",
"-",
"发布日期",
"现值",
"前值",
]
temp_df = temp_df[
[
"时间",
"前值",
"现值",
"发布日期",
]
]
temp_df["前值"] = pd.to_numeric(temp_df["前值"], errors="coerce")
temp_df["现值"] = pd.to_numeric(temp_df["现值"], errors="coerce")
temp_df["发布日期"] = pd.to_datetime(temp_df["发布日期"]).dt.date
return temp_df
# GDP 月率
def macro_canada_gdp_monthly() -> pd.DataFrame:
"""
东方财富-经济数据-加拿大-GDP 月率
https://data.eastmoney.com/cjsj/foreign_7_9.html
:return: GDP 月率
:rtype: pandas.DataFrame
"""
url = "https://datacenter-web.eastmoney.com/api/data/v1/get"
params = {
"reportName": "RPT_ECONOMICVALUE_CA",
"columns": "ALL",
"filter": '(INDICATOR_ID="EMG00159259")',
"pageNumber": "1",
"pageSize": "2000",
"sortColumns": "REPORT_DATE",
"sortTypes": "-1",
"source": "WEB",
"client": "WEB",
"p": "1",
"pageNo": "1",
"pageNum": "1",
}
r = requests.get(url, params=params)
data_json = r.json()
temp_df = pd.DataFrame(data_json["result"]["data"])
temp_df.columns = [
"-",
"-",
"-",
"-",
"时间",
"-",
"发布日期",
"现值",
"前值",
]
temp_df = temp_df[
[
"时间",
"前值",
"现值",
"发布日期",
]
]
temp_df["前值"] = pd.to_numeric(temp_df["前值"], errors="coerce")
temp_df["现值"] = pd.to_numeric(temp_df["现值"], errors="coerce")
temp_df["发布日期"] = pd.to_datetime(temp_df["发布日期"]).dt.date
return temp_df
if __name__ == "__main__":
macro_canada_new_house_rate_df = macro_canada_new_house_rate()
print(macro_canada_new_house_rate_df)
macro_canada_unemployment_rate_df = macro_canada_unemployment_rate()
print(macro_canada_unemployment_rate_df)
macro_canada_trade_df = macro_canada_trade()
print(macro_canada_trade_df)
macro_canada_retail_rate_monthly_df = macro_canada_retail_rate_monthly()
print(macro_canada_retail_rate_monthly_df)
macro_canada_bank_rate_df = macro_canada_bank_rate()
print(macro_canada_bank_rate_df)
macro_canada_core_cpi_yearly_df = macro_canada_core_cpi_yearly()
print(macro_canada_core_cpi_yearly_df)
macro_canada_core_cpi_monthly_df = macro_canada_core_cpi_monthly()
print(macro_canada_core_cpi_monthly_df)
macro_canada_cpi_yearly_df = macro_canada_cpi_yearly()
print(macro_canada_cpi_yearly_df)
macro_canada_cpi_monthly_df = macro_canada_cpi_monthly()
print(macro_canada_cpi_monthly_df)
macro_canada_gdp_monthly_df = macro_canada_gdp_monthly()
print(macro_canada_gdp_monthly_df)
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,194 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2024/4/3 16:21
Desc: 中国-香港-宏观指标
https://data.eastmoney.com/cjsj/foreign_8_0.html
"""
import pandas as pd
import requests
def macro_china_hk_core(symbol: str = "EMG00341602") -> pd.DataFrame:
"""
东方财富-数据中心-经济数据一览-宏观经济-日本-核心代码
https://data.eastmoney.com/cjsj/foreign_1_0.html
:param symbol: 代码
:type symbol: str
:return: 指定 symbol 的数据
:rtype: pandas.DataFrame
"""
url = "https://datacenter-web.eastmoney.com/api/data/v1/get"
params = {
"reportName": "RPT_ECONOMICVALUE_HK",
"columns": "ALL",
"filter": f'(INDICATOR_ID="{symbol}")',
"pageNumber": "1",
"pageSize": "5000",
"sortColumns": "REPORT_DATE",
"sortTypes": "-1",
"source": "WEB",
"client": "WEB",
"p": "1",
"pageNo": "1",
"pageNum": "1",
}
r = requests.get(url, params=params)
data_json = r.json()
temp_df = pd.DataFrame(data_json["result"]["data"])
temp_df.rename(
columns={
"COUNTRY": "-",
"INDICATOR_ID": "-",
"INDICATOR_NAME": "-",
"REPORT_DATE_CH": "时间",
"REPORT_DATE": "-",
"PUBLISH_DATE": "发布日期",
"VALUE": "现值",
"PRE_VALUE": "前值",
"INDICATOR_IDOLD": "-",
},
inplace=True,
)
temp_df = temp_df[
[
"时间",
"前值",
"现值",
"发布日期",
]
]
temp_df["前值"] = pd.to_numeric(temp_df["前值"], errors="coerce")
temp_df["现值"] = pd.to_numeric(temp_df["现值"], errors="coerce")
temp_df["发布日期"] = pd.to_datetime(temp_df["发布日期"], errors="coerce").dt.date
temp_df.sort_values(["发布日期"], inplace=True, ignore_index=True)
return temp_df
def macro_china_hk_cpi() -> pd.DataFrame:
"""
东方财富-经济数据一览-中国香港-消费者物价指数
https://data.eastmoney.com/cjsj/foreign_8_0.html
:return: 消费者物价指数
:rtype: pandas.DataFrame
"""
temp_df = macro_china_hk_core(symbol="EMG01336996")
return temp_df
def macro_china_hk_cpi_ratio() -> pd.DataFrame:
"""
东方财富-经济数据一览-中国香港-消费者物价指数年率
https://data.eastmoney.com/cjsj/foreign_8_1.html
:return: 消费者物价指数年率
:rtype: pandas.DataFrame
"""
temp_df = macro_china_hk_core(symbol="EMG00059282")
return temp_df
def macro_china_hk_rate_of_unemployment() -> pd.DataFrame:
"""
东方财富-经济数据一览-中国香港-失业率
https://data.eastmoney.com/cjsj/foreign_8_2.html
:return: 失业率
:rtype: pandas.DataFrame
"""
temp_df = macro_china_hk_core(symbol="EMG00059647")
return temp_df
def macro_china_hk_gbp() -> pd.DataFrame:
"""
东方财富-经济数据一览-中国香港-香港 GDP
https://data.eastmoney.com/cjsj/foreign_8_3.html
:return: 香港 GDP
:rtype: pandas.DataFrame
"""
temp_df = macro_china_hk_core(symbol="EMG01337008")
return temp_df
def macro_china_hk_gbp_ratio() -> pd.DataFrame:
"""
东方财富-经济数据一览-中国香港-香港 GDP 同比
https://data.eastmoney.com/cjsj/foreign_8_4.html
:return: 香港 GDP 同比
:rtype: pandas.DataFrame
"""
temp_df = macro_china_hk_core(symbol="EMG01337009")
return temp_df
def macro_china_hk_building_volume() -> pd.DataFrame:
"""
东方财富-经济数据一览-中国香港-香港楼宇买卖合约数量
https://data.eastmoney.com/cjsj/foreign_8_5.html
:return: 香港楼宇买卖合约数量
:rtype: pandas.DataFrame
"""
temp_df = macro_china_hk_core(symbol="EMG00158055")
return temp_df
def macro_china_hk_building_amount() -> pd.DataFrame:
"""
东方财富-经济数据一览-中国香港-香港楼宇买卖合约成交金额
https://data.eastmoney.com/cjsj/foreign_8_6.html
:return: 香港楼宇买卖合约成交金额
:rtype: pandas.DataFrame
"""
temp_df = macro_china_hk_core(symbol="EMG00158066")
return temp_df
def macro_china_hk_trade_diff_ratio() -> pd.DataFrame:
"""
东方财富-经济数据一览-中国香港-香港商品贸易差额年率
https://data.eastmoney.com/cjsj/foreign_8_7.html
:return: 香港商品贸易差额年率
:rtype: pandas.DataFrame
"""
temp_df = macro_china_hk_core(symbol="EMG00157898")
return temp_df
def macro_china_hk_ppi() -> pd.DataFrame:
"""
东方财富-经济数据一览-中国香港-香港制造业 PPI 年率
https://data.eastmoney.com/cjsj/foreign_8_8.html
:return: 香港制造业 PPI 年率
:rtype: pandas.DataFrame
"""
temp_df = macro_china_hk_core(symbol="EMG00157818")
return temp_df
if __name__ == "__main__":
macro_china_hk_cpi_df = macro_china_hk_cpi()
print(macro_china_hk_cpi_df)
macro_china_hk_cpi_ratio_df = macro_china_hk_cpi_ratio()
print(macro_china_hk_cpi_ratio_df)
macro_china_hk_rate_of_unemployment_df = macro_china_hk_rate_of_unemployment()
print(macro_china_hk_rate_of_unemployment_df)
macro_china_hk_gbp_df = macro_china_hk_gbp()
print(macro_china_hk_gbp_df)
macro_china_hk_gbp_ratio_df = macro_china_hk_gbp_ratio()
print(macro_china_hk_gbp_ratio_df)
marco_china_hk_building_volume_df = macro_china_hk_building_volume()
print(marco_china_hk_building_volume_df)
macro_china_hk_building_amount_df = macro_china_hk_building_amount()
print(macro_china_hk_building_amount_df)
macro_china_hk_trade_diff_ratio_df = macro_china_hk_trade_diff_ratio()
print(macro_china_hk_trade_diff_ratio_df)
macro_china_hk_ppi_df = macro_china_hk_ppi()
print(macro_china_hk_ppi_df)
@@ -0,0 +1,293 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2024/6/30 22:00
Desc: 中国-国家统计局-宏观数据
https://data.stats.gov.cn/easyquery.htm
"""
import time
from functools import lru_cache
from typing import Union, Literal, List, Dict
import jsonpath as jp
import numpy as np
import pandas as pd
import requests
import urllib3
from urllib3.exceptions import InsecureRequestWarning
# 忽略InsecureRequestWarning警告
urllib3.disable_warnings(InsecureRequestWarning)
@lru_cache
def _get_nbs_tree(idcode: str, dbcode: str) -> List[Dict]:
"""
获取指标目录树
:param idcode: 指标编码
:param dbcode: 库编码
:return: json数据
"""
url = "https://data.stats.gov.cn/easyquery.htm"
params = {"id": idcode, "dbcode": dbcode, "wdcode": "zb", "m": "getTree"}
r = requests.post(url, params=params, verify=False, allow_redirects=True)
data_json = r.json()
return data_json
@lru_cache
def _get_nbs_wds_tree(idcode: str, dbcode: str, rowcode: str) -> List[Dict]:
"""
获取地区数据的可选指标目录树
:param idcode: 指标编码
:param dbcode: 库编码
:param rowcode: 值为zb是返回地区的编码值为reg时返回可选指标的编码
:return: json数据
"""
url = "https://data.stats.gov.cn/easyquery.htm"
params = {
"m": "getOtherWds",
"dbcode": dbcode,
"rowcode": rowcode,
"colcode": "sj",
"wds": '[{"wdcode":"zb","valuecode":"%s"}]' % idcode,
"k1": str(time.time_ns())[:13],
}
r = requests.post(url, params=params, verify=False, allow_redirects=True)
data_json = r.json()
data_json = data_json["returndata"][0]["nodes"]
return data_json
def _get_code_from_nbs_tree(tree: List[Dict], name: str, target: str = "id") -> str:
"""
根据指标名称从目录树中获取target编码
:param tree: 目录树
:param name: 指标名称
:param target: 指标编码属性名
:return: 指标编码
"""
expr = f'$[?(@.name == "{name}")].{target}'
ret = jp.jsonpath(tree, expr)
if ret is False:
raise ValueError("Please check if the data path or indicator is correct.")
return ret[0]
def macro_china_nbs_nation(
kind: Literal["月度数据", "季度数据", "年度数据"], path: str, period: str = "LAST10"
) -> pd.DataFrame:
"""
国家统计局全国数据通用接口
https://data.stats.gov.cn/easyquery.htm
:param kind: 数据类别
:param path: 数据路径
:param period: 时间区间例如'LAST10', '2016-2023', '2016-'
:return: 国家统计局统计数据
:rtype: pandas.DataFrame
"""
# 获取dbcode
kind_code = {"月度数据": "hgyd", "季度数据": "hgjd", "年度数据": "hgnd"}
dbcode = kind_code[kind]
# 获取最终id
parent_tree = _get_nbs_tree("zb", dbcode)
path_split = path.replace(" ", "").split(">")
indicator_id = _get_code_from_nbs_tree(parent_tree, path_split[0])
path_split.pop(0)
while path_split:
temp_tree = _get_nbs_tree(indicator_id, dbcode)
indicator_id = _get_code_from_nbs_tree(temp_tree, path_split[0])
path_split.pop(0)
# 请求数据
url = "https://data.stats.gov.cn/easyquery.htm"
params = {
"m": "QueryData",
"dbcode": dbcode,
"rowcode": "zb",
"colcode": "sj",
"wds": "[]",
"dfwds": '[{"wdcode":"zb","valuecode":"%s"}, '
'{"wdcode":"sj","valuecode":"%s"}]' % (indicator_id, period),
"k1": str(time.time_ns())[:13],
}
r = requests.get(url, params=params, verify=False, allow_redirects=True)
data_json = r.json()
# 整理为dataframe
temp_df = pd.DataFrame(data_json["returndata"]["datanodes"])
temp_df["data"] = temp_df["data"].apply(
lambda x: x["data"] if x["hasdata"] else None
)
wdnodes = data_json["returndata"]["wdnodes"]
wn_df_list = []
for wn in wdnodes:
wn_df_list.append(
pd.DataFrame(wn["nodes"])
.assign(
funit=lambda df: df["unit"].apply(lambda x: "(" + x + ")" if x else x)
)
.assign(fname=lambda df: df["cname"] + df["funit"]),
)
row_name, column_name = (
wn_df_list[0]["fname"],
wn_df_list[1]["fname"],
)
data_ndarray = np.reshape(temp_df["data"], (len(row_name), len(column_name)))
data_df = pd.DataFrame(data=data_ndarray, columns=column_name, index=row_name)
data_df.index.name = None
data_df.columns.name = None
return data_df
def macro_china_nbs_region(
kind: Literal[
"分省月度数据",
"分省季度数据",
"分省年度数据",
"主要城市月度价格",
"主要城市年度数据",
"港澳台月度数据",
"港澳台年度数据",
],
path: str,
indicator: Union[str, None],
region: Union[str, None] = None,
period: str = "LAST10",
) -> pd.DataFrame:
"""
国家统计局地区数据通用接口
https://data.stats.gov.cn/easyquery.htm
:param kind: 数据类别
:param path: 数据路径
:param indicator: 指定指标
:param region: 指定地区 当指定region时将symbol设为None可以同时获得所有可选指标的值
:param period: 时间区间例如'LAST10', '2016-2023', '2016-'
:return: 国家统计局统计数据
:rtype: pandas.DataFrame
"""
if indicator is None and region is None:
raise AssertionError("The indicator and region parameters cannot both be None.")
# 获取dbcode
kind_dict = {
"分省月度数据": "fsyd",
"分省季度数据": "fsjd",
"分省年度数据": "fsnd",
"主要城市月度价格": "csyd",
"主要城市年度数据": "csnd",
"港澳台月度数据": "gatyd",
"港澳台年度数据": "gatnd",
}
dbcode = kind_dict[kind]
# 获取最终id
parent_tree = _get_nbs_tree("zb", dbcode)
path_split = path.replace(" ", "").split(">")
indicator_id = _get_code_from_nbs_tree(parent_tree, path_split[0])
path_split.pop(0)
while path_split:
temp_tree = _get_nbs_tree(indicator_id, dbcode)
indicator_id = _get_code_from_nbs_tree(temp_tree, path_split[0])
path_split.pop(0)
# 参数设定
if region is None:
indicator_tree = _get_nbs_wds_tree(indicator_id, dbcode, "reg")
indicator_id = _get_code_from_nbs_tree(indicator_tree, indicator, target="code")
rowcode = "reg"
colcode = "sj"
wds = '[{"wdcode":"zb","valuecode":"%s"}]' % indicator_id
dfwds = '[{"wdcode":"sj","valuecode":"%s"}]' % period
else:
if indicator is not None:
indicator_tree = _get_nbs_wds_tree(indicator_id, dbcode, "reg")
indicator_id = _get_code_from_nbs_tree(
indicator_tree, indicator, target="code"
)
region_tree = _get_nbs_wds_tree(indicator_id, dbcode, "zb")
region_id = _get_code_from_nbs_tree(region_tree, region, target="code")
rowcode = "zb"
colcode = "sj"
wds = '[{"wdcode":"reg","valuecode":"%s"}]' % region_id
dfwds = (
'[{"wdcode":"zb","valuecode":"%s"}, '
'{"wdcode":"sj","valuecode":"%s"}]' % (indicator_id, period)
)
# 请求数据
url = "https://data.stats.gov.cn/easyquery.htm"
params = {
"m": "QueryData",
"dbcode": dbcode,
"rowcode": rowcode,
"colcode": colcode,
"wds": wds,
"dfwds": dfwds,
"k1": str(time.time_ns())[:13],
}
r = requests.get(url, params=params, verify=False, allow_redirects=True)
data_json = r.json()
# 整理为dataframe
temp_df = pd.DataFrame(data_json["returndata"]["datanodes"])
temp_df["data"] = temp_df["data"].apply(
lambda x: x["data"] if x["hasdata"] else None
)
wdnodes = data_json["returndata"]["wdnodes"]
wn_df_list = []
for wn in wdnodes:
wn_df_list.append(
pd.DataFrame(wn["nodes"])
.assign(
funit=lambda df: df["unit"].apply(lambda x: "(" + x + ")" if x else x)
)
.assign(fname=lambda df: df["cname"] + df["funit"]),
)
if region is None:
row_name, column_name = wn_df_list[1]["fname"], wn_df_list[2]["fname"]
title_name = wn_df_list[0]["fname"][0]
else:
row_name, column_name = wn_df_list[0]["fname"], wn_df_list[2]["fname"]
title_name = wn_df_list[1]["fname"][0]
data_ndarray = np.reshape(temp_df["data"], (len(row_name), len(column_name)))
data_df = pd.DataFrame(data=data_ndarray, columns=column_name, index=row_name)
data_df.index.name = None
data_df.columns.name = title_name
return data_df
if __name__ == "__main__":
macro_china_nbs_nation_df = macro_china_nbs_nation(
kind="月度数据",
path="工业 > 工业分大类行业出口交货值(2018-至今) > 废弃资源综合利用业",
period="LAST5",
)
print(macro_china_nbs_nation_df)
macro_china_nbs_region_df = macro_china_nbs_region(
kind="分省季度数据",
path="人民生活 > 居民人均可支配收入",
period="2018-2022",
indicator=None,
region="北京市",
)
print(macro_china_nbs_region_df)
macro_china_nbs_region_df = macro_china_nbs_region(
kind="分省季度数据",
path="国民经济核算 > 地区生产总值",
period="2018-",
indicator="地区生产总值_累计值(亿元)",
)
print(macro_china_nbs_region_df)

Some files were not shown because too many files have changed in this diff Show More