akshare-one 0.3.1__py3-none-any.whl → 0.3.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- akshare_one/__init__.py +214 -31
- akshare_one/indicators.py +395 -395
- akshare_one/modules/cache.py +10 -9
- akshare_one/modules/eastmoney/client.py +88 -88
- akshare_one/modules/eastmoney/utils.py +104 -104
- akshare_one/modules/financial/base.py +27 -22
- akshare_one/modules/financial/eastmoney.py +184 -0
- akshare_one/modules/financial/factory.py +46 -44
- akshare_one/modules/financial/sina.py +298 -273
- akshare_one/modules/historical/base.py +47 -47
- akshare_one/modules/historical/eastmoney.py +241 -241
- akshare_one/modules/historical/eastmoney_direct.py +79 -79
- akshare_one/modules/historical/factory.py +48 -48
- akshare_one/modules/historical/sina.py +254 -254
- akshare_one/modules/indicators/base.py +158 -158
- akshare_one/modules/indicators/factory.py +33 -33
- akshare_one/modules/indicators/simple.py +230 -230
- akshare_one/modules/indicators/talib.py +263 -263
- akshare_one/modules/info/base.py +25 -0
- akshare_one/modules/info/eastmoney.py +52 -0
- akshare_one/modules/info/factory.py +44 -0
- akshare_one/modules/insider/base.py +28 -28
- akshare_one/modules/insider/factory.py +44 -44
- akshare_one/modules/insider/xueqiu.py +115 -115
- akshare_one/modules/news/base.py +22 -22
- akshare_one/modules/news/eastmoney.py +47 -47
- akshare_one/modules/news/factory.py +44 -44
- akshare_one/modules/realtime/base.py +27 -27
- akshare_one/modules/realtime/eastmoney.py +57 -57
- akshare_one/modules/realtime/eastmoney_direct.py +37 -37
- akshare_one/modules/realtime/factory.py +48 -48
- akshare_one/modules/realtime/xueqiu.py +60 -60
- akshare_one/modules/utils.py +10 -10
- {akshare_one-0.3.1.dist-info → akshare_one-0.3.3.dist-info}/METADATA +70 -70
- akshare_one-0.3.3.dist-info/RECORD +39 -0
- {akshare_one-0.3.1.dist-info → akshare_one-0.3.3.dist-info}/licenses/LICENSE +21 -21
- akshare_one/financial.py +0 -46
- akshare_one/insider.py +0 -33
- akshare_one/news.py +0 -27
- akshare_one/stock.py +0 -78
- akshare_one-0.3.1.dist-info/RECORD +0 -39
- {akshare_one-0.3.1.dist-info → akshare_one-0.3.3.dist-info}/WHEEL +0 -0
- {akshare_one-0.3.1.dist-info → akshare_one-0.3.3.dist-info}/top_level.txt +0 -0
@@ -1,57 +1,57 @@
|
|
1
|
-
from cachetools import cached
|
2
|
-
import pandas as pd
|
3
|
-
import akshare as ak
|
4
|
-
|
5
|
-
from ..cache import CACHE_CONFIG
|
6
|
-
from .base import RealtimeDataProvider
|
7
|
-
|
8
|
-
|
9
|
-
class EastmoneyRealtime(RealtimeDataProvider):
|
10
|
-
@cached(
|
11
|
-
CACHE_CONFIG["realtime_cache"],
|
12
|
-
key=lambda self, symbol=None: f"eastmoney_{symbol if symbol else 'all'}",
|
13
|
-
)
|
14
|
-
def get_current_data(self) -> pd.DataFrame:
|
15
|
-
"""获取沪深京A股实时行情数据"""
|
16
|
-
raw_df = ak.stock_zh_a_spot_em()
|
17
|
-
df = self._clean_spot_data(raw_df)
|
18
|
-
if self.symbol:
|
19
|
-
df = df[df["symbol"] == self.symbol].reset_index(drop=True)
|
20
|
-
return df
|
21
|
-
|
22
|
-
def _clean_spot_data(self, raw_df: pd.DataFrame) -> pd.DataFrame:
|
23
|
-
"""清理和标准化实时行情数据"""
|
24
|
-
column_mapping = {
|
25
|
-
"代码": "symbol",
|
26
|
-
"最新价": "price",
|
27
|
-
"涨跌额": "change",
|
28
|
-
"涨跌幅": "pct_change",
|
29
|
-
"成交量": "volume",
|
30
|
-
"成交额": "amount",
|
31
|
-
"今开": "open",
|
32
|
-
"最高": "high",
|
33
|
-
"最低": "low",
|
34
|
-
"昨收": "prev_close",
|
35
|
-
}
|
36
|
-
|
37
|
-
df = raw_df.rename(columns=column_mapping)
|
38
|
-
|
39
|
-
# Change time to UTC
|
40
|
-
df = df.assign(
|
41
|
-
timestamp=lambda x: pd.Timestamp.now(tz="Asia/Shanghai").tz_convert("UTC")
|
42
|
-
)
|
43
|
-
|
44
|
-
required_columns = [
|
45
|
-
"symbol",
|
46
|
-
"price",
|
47
|
-
"change",
|
48
|
-
"pct_change",
|
49
|
-
"timestamp",
|
50
|
-
"volume",
|
51
|
-
"amount",
|
52
|
-
"open",
|
53
|
-
"high",
|
54
|
-
"low",
|
55
|
-
"prev_close",
|
56
|
-
]
|
57
|
-
return df[required_columns]
|
1
|
+
from cachetools import cached
|
2
|
+
import pandas as pd
|
3
|
+
import akshare as ak
|
4
|
+
|
5
|
+
from ..cache import CACHE_CONFIG
|
6
|
+
from .base import RealtimeDataProvider
|
7
|
+
|
8
|
+
|
9
|
+
class EastmoneyRealtime(RealtimeDataProvider):
|
10
|
+
@cached(
|
11
|
+
CACHE_CONFIG["realtime_cache"],
|
12
|
+
key=lambda self, symbol=None: f"eastmoney_{symbol if symbol else 'all'}",
|
13
|
+
)
|
14
|
+
def get_current_data(self) -> pd.DataFrame:
|
15
|
+
"""获取沪深京A股实时行情数据"""
|
16
|
+
raw_df = ak.stock_zh_a_spot_em()
|
17
|
+
df = self._clean_spot_data(raw_df)
|
18
|
+
if self.symbol:
|
19
|
+
df = df[df["symbol"] == self.symbol].reset_index(drop=True)
|
20
|
+
return df
|
21
|
+
|
22
|
+
def _clean_spot_data(self, raw_df: pd.DataFrame) -> pd.DataFrame:
|
23
|
+
"""清理和标准化实时行情数据"""
|
24
|
+
column_mapping = {
|
25
|
+
"代码": "symbol",
|
26
|
+
"最新价": "price",
|
27
|
+
"涨跌额": "change",
|
28
|
+
"涨跌幅": "pct_change",
|
29
|
+
"成交量": "volume",
|
30
|
+
"成交额": "amount",
|
31
|
+
"今开": "open",
|
32
|
+
"最高": "high",
|
33
|
+
"最低": "low",
|
34
|
+
"昨收": "prev_close",
|
35
|
+
}
|
36
|
+
|
37
|
+
df = raw_df.rename(columns=column_mapping)
|
38
|
+
|
39
|
+
# Change time to UTC
|
40
|
+
df = df.assign(
|
41
|
+
timestamp=lambda x: pd.Timestamp.now(tz="Asia/Shanghai").tz_convert("UTC")
|
42
|
+
)
|
43
|
+
|
44
|
+
required_columns = [
|
45
|
+
"symbol",
|
46
|
+
"price",
|
47
|
+
"change",
|
48
|
+
"pct_change",
|
49
|
+
"timestamp",
|
50
|
+
"volume",
|
51
|
+
"amount",
|
52
|
+
"open",
|
53
|
+
"high",
|
54
|
+
"low",
|
55
|
+
"prev_close",
|
56
|
+
]
|
57
|
+
return df[required_columns]
|
@@ -1,37 +1,37 @@
|
|
1
|
-
import pandas as pd
|
2
|
-
from cachetools import cached
|
3
|
-
from .base import RealtimeDataProvider
|
4
|
-
from ..cache import CACHE_CONFIG
|
5
|
-
from ..eastmoney.client import EastMoneyClient
|
6
|
-
from ..eastmoney.utils import parse_realtime_data
|
7
|
-
|
8
|
-
|
9
|
-
class EastMoneyDirectRealtime(RealtimeDataProvider):
|
10
|
-
"""Direct implementation for EastMoney realtime stock data API"""
|
11
|
-
|
12
|
-
def __init__(self, symbol: str):
|
13
|
-
super().__init__(symbol)
|
14
|
-
self.client = EastMoneyClient()
|
15
|
-
|
16
|
-
@cached(
|
17
|
-
cache=CACHE_CONFIG["realtime_cache"],
|
18
|
-
key=lambda self: f"eastmoney_direct_realtime_{self.symbol}",
|
19
|
-
)
|
20
|
-
def get_current_data(self) -> pd.DataFrame:
|
21
|
-
"""Get real-time stock data"""
|
22
|
-
try:
|
23
|
-
raw_data = self.client.fetch_realtime_quote(self.symbol)
|
24
|
-
|
25
|
-
if raw_data.get("rc") != 0:
|
26
|
-
raise ValueError(f"API returned error: {raw_data.get('msg')}")
|
27
|
-
|
28
|
-
df = parse_realtime_data(raw_data)
|
29
|
-
|
30
|
-
# Ensure the output matches the base class definition
|
31
|
-
if self.symbol:
|
32
|
-
df = df[df["symbol"] == self.symbol].reset_index(drop=True)
|
33
|
-
|
34
|
-
return df
|
35
|
-
|
36
|
-
except Exception as e:
|
37
|
-
raise ValueError(f"Failed to get real-time data for {self.symbol}: {e}")
|
1
|
+
import pandas as pd
|
2
|
+
from cachetools import cached
|
3
|
+
from .base import RealtimeDataProvider
|
4
|
+
from ..cache import CACHE_CONFIG
|
5
|
+
from ..eastmoney.client import EastMoneyClient
|
6
|
+
from ..eastmoney.utils import parse_realtime_data
|
7
|
+
|
8
|
+
|
9
|
+
class EastMoneyDirectRealtime(RealtimeDataProvider):
|
10
|
+
"""Direct implementation for EastMoney realtime stock data API"""
|
11
|
+
|
12
|
+
def __init__(self, symbol: str):
|
13
|
+
super().__init__(symbol)
|
14
|
+
self.client = EastMoneyClient()
|
15
|
+
|
16
|
+
@cached(
|
17
|
+
cache=CACHE_CONFIG["realtime_cache"],
|
18
|
+
key=lambda self: f"eastmoney_direct_realtime_{self.symbol}",
|
19
|
+
)
|
20
|
+
def get_current_data(self) -> pd.DataFrame:
|
21
|
+
"""Get real-time stock data"""
|
22
|
+
try:
|
23
|
+
raw_data = self.client.fetch_realtime_quote(self.symbol)
|
24
|
+
|
25
|
+
if raw_data.get("rc") != 0:
|
26
|
+
raise ValueError(f"API returned error: {raw_data.get('msg')}")
|
27
|
+
|
28
|
+
df = parse_realtime_data(raw_data)
|
29
|
+
|
30
|
+
# Ensure the output matches the base class definition
|
31
|
+
if self.symbol:
|
32
|
+
df = df[df["symbol"] == self.symbol].reset_index(drop=True)
|
33
|
+
|
34
|
+
return df
|
35
|
+
|
36
|
+
except Exception as e:
|
37
|
+
raise ValueError(f"Failed to get real-time data for {self.symbol}: {e}")
|
@@ -1,48 +1,48 @@
|
|
1
|
-
from .eastmoney import EastmoneyRealtime
|
2
|
-
from .xueqiu import XueQiuRealtime
|
3
|
-
from .base import RealtimeDataProvider
|
4
|
-
from .eastmoney_direct import EastMoneyDirectRealtime
|
5
|
-
|
6
|
-
|
7
|
-
class RealtimeDataFactory:
|
8
|
-
"""
|
9
|
-
Factory class for creating realtime data providers
|
10
|
-
"""
|
11
|
-
|
12
|
-
_providers = {
|
13
|
-
"eastmoney": EastmoneyRealtime,
|
14
|
-
"xueqiu": XueQiuRealtime,
|
15
|
-
"eastmoney_direct": EastMoneyDirectRealtime,
|
16
|
-
}
|
17
|
-
|
18
|
-
@classmethod
|
19
|
-
def get_provider(cls, provider_name: str, **kwargs) -> RealtimeDataProvider:
|
20
|
-
"""
|
21
|
-
Get a realtime data provider by name
|
22
|
-
|
23
|
-
Args:
|
24
|
-
provider_name: Name of the provider (e.g., 'eastmoney')
|
25
|
-
**kwargs: Additional arguments to pass to the provider's constructor
|
26
|
-
|
27
|
-
Returns:
|
28
|
-
RealtimeDataProvider: An instance of the requested provider
|
29
|
-
|
30
|
-
Raises:
|
31
|
-
ValueError: If the requested provider is not found
|
32
|
-
"""
|
33
|
-
provider_class = cls._providers.get(provider_name.lower())
|
34
|
-
if not provider_class:
|
35
|
-
raise ValueError(f"Unknown realtime data provider: {provider_name}")
|
36
|
-
|
37
|
-
return provider_class(**kwargs)
|
38
|
-
|
39
|
-
@classmethod
|
40
|
-
def register_provider(cls, name: str, provider_class: type):
|
41
|
-
"""
|
42
|
-
Register a new realtime data provider
|
43
|
-
|
44
|
-
Args:
|
45
|
-
name: Name to associate with this provider
|
46
|
-
provider_class: The provider class to register
|
47
|
-
"""
|
48
|
-
cls._providers[name.lower()] = provider_class
|
1
|
+
from .eastmoney import EastmoneyRealtime
|
2
|
+
from .xueqiu import XueQiuRealtime
|
3
|
+
from .base import RealtimeDataProvider
|
4
|
+
from .eastmoney_direct import EastMoneyDirectRealtime
|
5
|
+
|
6
|
+
|
7
|
+
class RealtimeDataFactory:
|
8
|
+
"""
|
9
|
+
Factory class for creating realtime data providers
|
10
|
+
"""
|
11
|
+
|
12
|
+
_providers = {
|
13
|
+
"eastmoney": EastmoneyRealtime,
|
14
|
+
"xueqiu": XueQiuRealtime,
|
15
|
+
"eastmoney_direct": EastMoneyDirectRealtime,
|
16
|
+
}
|
17
|
+
|
18
|
+
@classmethod
|
19
|
+
def get_provider(cls, provider_name: str, **kwargs) -> RealtimeDataProvider:
|
20
|
+
"""
|
21
|
+
Get a realtime data provider by name
|
22
|
+
|
23
|
+
Args:
|
24
|
+
provider_name: Name of the provider (e.g., 'eastmoney')
|
25
|
+
**kwargs: Additional arguments to pass to the provider's constructor
|
26
|
+
|
27
|
+
Returns:
|
28
|
+
RealtimeDataProvider: An instance of the requested provider
|
29
|
+
|
30
|
+
Raises:
|
31
|
+
ValueError: If the requested provider is not found
|
32
|
+
"""
|
33
|
+
provider_class = cls._providers.get(provider_name.lower())
|
34
|
+
if not provider_class:
|
35
|
+
raise ValueError(f"Unknown realtime data provider: {provider_name}")
|
36
|
+
|
37
|
+
return provider_class(**kwargs)
|
38
|
+
|
39
|
+
@classmethod
|
40
|
+
def register_provider(cls, name: str, provider_class: type):
|
41
|
+
"""
|
42
|
+
Register a new realtime data provider
|
43
|
+
|
44
|
+
Args:
|
45
|
+
name: Name to associate with this provider
|
46
|
+
provider_class: The provider class to register
|
47
|
+
"""
|
48
|
+
cls._providers[name.lower()] = provider_class
|
@@ -1,60 +1,60 @@
|
|
1
|
-
from cachetools import cached
|
2
|
-
import pandas as pd
|
3
|
-
import akshare as ak
|
4
|
-
from ..utils import convert_xieqiu_symbol
|
5
|
-
from ..cache import CACHE_CONFIG
|
6
|
-
from .base import RealtimeDataProvider
|
7
|
-
|
8
|
-
|
9
|
-
class XueQiuRealtime(RealtimeDataProvider):
|
10
|
-
@cached(
|
11
|
-
cache=CACHE_CONFIG["realtime_cache"],
|
12
|
-
key=lambda self, symbol=None: f"xueqiu_{symbol}",
|
13
|
-
)
|
14
|
-
def get_current_data(self) -> pd.DataFrame:
|
15
|
-
"""获取雪球实时行情数据
|
16
|
-
|
17
|
-
Args:
|
18
|
-
symbol: 股票代码 ("600000")
|
19
|
-
|
20
|
-
Returns:
|
21
|
-
pd.DataFrame with columns:
|
22
|
-
- symbol: 股票代码
|
23
|
-
- price: 最新价
|
24
|
-
- change: 涨跌额
|
25
|
-
- pct_change: 涨跌幅(%)
|
26
|
-
- timestamp: 时间戳
|
27
|
-
- volume: 成交量(手)
|
28
|
-
- amount: 成交额(元)
|
29
|
-
- open: 今开
|
30
|
-
- high: 最高
|
31
|
-
- low: 最低
|
32
|
-
- prev_close: 昨收
|
33
|
-
"""
|
34
|
-
raw_df = ak.stock_individual_spot_xq(symbol=convert_xieqiu_symbol(self.symbol))
|
35
|
-
|
36
|
-
# Transform to match standard format
|
37
|
-
data = {
|
38
|
-
"symbol": self.symbol,
|
39
|
-
"price": float(raw_df.loc[raw_df["item"] == "现价", "value"].values[0]),
|
40
|
-
"change": float(raw_df.loc[raw_df["item"] == "涨跌", "value"].values[0]),
|
41
|
-
"pct_change": float(
|
42
|
-
raw_df.loc[raw_df["item"] == "涨幅", "value"].values[0]
|
43
|
-
),
|
44
|
-
"timestamp": pd.to_datetime(
|
45
|
-
raw_df.loc[raw_df["item"] == "时间", "value"].values[0]
|
46
|
-
)
|
47
|
-
.tz_localize("Asia/Shanghai")
|
48
|
-
.tz_convert("UTC"),
|
49
|
-
"volume": int(raw_df.loc[raw_df["item"] == "成交量", "value"].values[0])
|
50
|
-
/ 100,
|
51
|
-
"amount": float(raw_df.loc[raw_df["item"] == "成交额", "value"].values[0]),
|
52
|
-
"open": float(raw_df.loc[raw_df["item"] == "今开", "value"].values[0]),
|
53
|
-
"high": float(raw_df.loc[raw_df["item"] == "最高", "value"].values[0]),
|
54
|
-
"low": float(raw_df.loc[raw_df["item"] == "最低", "value"].values[0]),
|
55
|
-
"prev_close": float(
|
56
|
-
raw_df.loc[raw_df["item"] == "昨收", "value"].values[0]
|
57
|
-
),
|
58
|
-
}
|
59
|
-
|
60
|
-
return pd.DataFrame([data])
|
1
|
+
from cachetools import cached
|
2
|
+
import pandas as pd
|
3
|
+
import akshare as ak
|
4
|
+
from ..utils import convert_xieqiu_symbol
|
5
|
+
from ..cache import CACHE_CONFIG
|
6
|
+
from .base import RealtimeDataProvider
|
7
|
+
|
8
|
+
|
9
|
+
class XueQiuRealtime(RealtimeDataProvider):
|
10
|
+
@cached(
|
11
|
+
cache=CACHE_CONFIG["realtime_cache"],
|
12
|
+
key=lambda self, symbol=None: f"xueqiu_{symbol}",
|
13
|
+
)
|
14
|
+
def get_current_data(self) -> pd.DataFrame:
|
15
|
+
"""获取雪球实时行情数据
|
16
|
+
|
17
|
+
Args:
|
18
|
+
symbol: 股票代码 ("600000")
|
19
|
+
|
20
|
+
Returns:
|
21
|
+
pd.DataFrame with columns:
|
22
|
+
- symbol: 股票代码
|
23
|
+
- price: 最新价
|
24
|
+
- change: 涨跌额
|
25
|
+
- pct_change: 涨跌幅(%)
|
26
|
+
- timestamp: 时间戳
|
27
|
+
- volume: 成交量(手)
|
28
|
+
- amount: 成交额(元)
|
29
|
+
- open: 今开
|
30
|
+
- high: 最高
|
31
|
+
- low: 最低
|
32
|
+
- prev_close: 昨收
|
33
|
+
"""
|
34
|
+
raw_df = ak.stock_individual_spot_xq(symbol=convert_xieqiu_symbol(self.symbol))
|
35
|
+
|
36
|
+
# Transform to match standard format
|
37
|
+
data = {
|
38
|
+
"symbol": self.symbol,
|
39
|
+
"price": float(raw_df.loc[raw_df["item"] == "现价", "value"].values[0]),
|
40
|
+
"change": float(raw_df.loc[raw_df["item"] == "涨跌", "value"].values[0]),
|
41
|
+
"pct_change": float(
|
42
|
+
raw_df.loc[raw_df["item"] == "涨幅", "value"].values[0]
|
43
|
+
),
|
44
|
+
"timestamp": pd.to_datetime(
|
45
|
+
raw_df.loc[raw_df["item"] == "时间", "value"].values[0]
|
46
|
+
)
|
47
|
+
.tz_localize("Asia/Shanghai")
|
48
|
+
.tz_convert("UTC"),
|
49
|
+
"volume": int(raw_df.loc[raw_df["item"] == "成交量", "value"].values[0])
|
50
|
+
/ 100,
|
51
|
+
"amount": float(raw_df.loc[raw_df["item"] == "成交额", "value"].values[0]),
|
52
|
+
"open": float(raw_df.loc[raw_df["item"] == "今开", "value"].values[0]),
|
53
|
+
"high": float(raw_df.loc[raw_df["item"] == "最高", "value"].values[0]),
|
54
|
+
"low": float(raw_df.loc[raw_df["item"] == "最低", "value"].values[0]),
|
55
|
+
"prev_close": float(
|
56
|
+
raw_df.loc[raw_df["item"] == "昨收", "value"].values[0]
|
57
|
+
),
|
58
|
+
}
|
59
|
+
|
60
|
+
return pd.DataFrame([data])
|
akshare_one/modules/utils.py
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
def convert_xieqiu_symbol(symbol: str) -> str:
|
2
|
-
"""
|
3
|
-
Convert Symbol (600000) to XueQiu Symbol (SH600000)
|
4
|
-
"""
|
5
|
-
if symbol.startswith("6"):
|
6
|
-
return f"SH{symbol}"
|
7
|
-
elif symbol.startswith("0") or symbol.startswith("3"):
|
8
|
-
return f"SZ{symbol}"
|
9
|
-
else: # TODO: add more cases
|
10
|
-
return symbol
|
1
|
+
def convert_xieqiu_symbol(symbol: str) -> str:
|
2
|
+
"""
|
3
|
+
Convert Symbol (600000) to XueQiu Symbol (SH600000)
|
4
|
+
"""
|
5
|
+
if symbol.startswith("6"):
|
6
|
+
return f"SH{symbol}"
|
7
|
+
elif symbol.startswith("0") or symbol.startswith("3"):
|
8
|
+
return f"SZ{symbol}"
|
9
|
+
else: # TODO: add more cases
|
10
|
+
return symbol
|
@@ -1,70 +1,70 @@
|
|
1
|
-
Metadata-Version: 2.4
|
2
|
-
Name: akshare-one
|
3
|
-
Version: 0.3.
|
4
|
-
Summary: Standardized interface for Chinese financial market data, built on AKShare with unified data formats and simplified APIs
|
5
|
-
License-Expression: MIT
|
6
|
-
Project-URL: Homepage, https://github.com/zwldarren/akshare-one
|
7
|
-
Project-URL: Repository, https://github.com/zwldarren/akshare-one.git
|
8
|
-
Keywords: akshare,financial-data,stock-data,quant
|
9
|
-
Requires-Python: >=3.
|
10
|
-
Description-Content-Type: text/markdown
|
11
|
-
License-File: LICENSE
|
12
|
-
Requires-Dist: akshare>=1.17.
|
13
|
-
Requires-Dist: cachetools>=
|
14
|
-
Provides-Extra: talib
|
15
|
-
Requires-Dist: ta-lib>=0.6.4; extra == "talib"
|
16
|
-
Dynamic: license-file
|
17
|
-
|
18
|
-
<div align="center">
|
19
|
-
<h1>AKShare One</h1>
|
20
|
-
<div>
|
21
|
-
<a href="README_zh.md">中文</a> | <strong>English</strong>
|
22
|
-
</div>
|
23
|
-
</div>
|
24
|
-
|
25
|
-
**AKShare One** is a data interface for obtaining Chinese A-shares, based on [AKShare](https://github.com/akfamily/akshare). It aims to simplify AKShare's usage and unify input/output formats from different data sources, making it easier to pass data to LLM.
|
26
|
-
|
27
|
-
## ✨ Features
|
28
|
-
|
29
|
-
- 📊 Unified stock code formats across data sources
|
30
|
-
- 🏗️ Standardized return data structures
|
31
|
-
- 🛠️ Simplified API parameter design
|
32
|
-
- ⏱️ Automatic timestamp and adjustment handling
|
33
|
-
|
34
|
-
## 🚀 Core Features
|
35
|
-
|
36
|
-
| Function | Interface |
|
37
|
-
|------|------|
|
38
|
-
| Historical data | `get_hist_data` |
|
39
|
-
| Real-time quotes | `get_realtime_data` |
|
40
|
-
| Stock news | `get_news_data` |
|
41
|
-
| Financial data | `get_balance_sheet`/`get_income_statement`/`get_cash_flow` |
|
42
|
-
| Internal transactions | `get_inner_trade_data` |
|
43
|
-
| Technical indicators | See [indicators.py](akshare_one/indicators.py) |
|
44
|
-
|
45
|
-
## 📦 Quick Installation
|
46
|
-
|
47
|
-
```bash
|
48
|
-
pip install akshare-one
|
49
|
-
```
|
50
|
-
|
51
|
-
## 💻 Usage Example
|
52
|
-
|
53
|
-
```python
|
54
|
-
from akshare_one import get_hist_data
|
55
|
-
from akshare_one.indicators import get_sma
|
56
|
-
|
57
|
-
# Get historical data
|
58
|
-
df = get_hist_data(
|
59
|
-
symbol="600000",
|
60
|
-
interval="day",
|
61
|
-
adjust="hfq"
|
62
|
-
)
|
63
|
-
|
64
|
-
# Calculate 20-day Simple Moving Average
|
65
|
-
df_sma = get_sma(df, window=20)
|
66
|
-
```
|
67
|
-
|
68
|
-
## 📚 Documentation
|
69
|
-
|
70
|
-
Detailed API reference: [docs/api.md](docs/api.md)
|
1
|
+
Metadata-Version: 2.4
|
2
|
+
Name: akshare-one
|
3
|
+
Version: 0.3.3
|
4
|
+
Summary: Standardized interface for Chinese financial market data, built on AKShare with unified data formats and simplified APIs
|
5
|
+
License-Expression: MIT
|
6
|
+
Project-URL: Homepage, https://github.com/zwldarren/akshare-one
|
7
|
+
Project-URL: Repository, https://github.com/zwldarren/akshare-one.git
|
8
|
+
Keywords: akshare,financial-data,stock-data,quant
|
9
|
+
Requires-Python: >=3.10
|
10
|
+
Description-Content-Type: text/markdown
|
11
|
+
License-File: LICENSE
|
12
|
+
Requires-Dist: akshare>=1.17.20
|
13
|
+
Requires-Dist: cachetools>=5.5.2
|
14
|
+
Provides-Extra: talib
|
15
|
+
Requires-Dist: ta-lib>=0.6.4; extra == "talib"
|
16
|
+
Dynamic: license-file
|
17
|
+
|
18
|
+
<div align="center">
|
19
|
+
<h1>AKShare One</h1>
|
20
|
+
<div>
|
21
|
+
<a href="README_zh.md">中文</a> | <strong>English</strong>
|
22
|
+
</div>
|
23
|
+
</div>
|
24
|
+
|
25
|
+
**AKShare One** is a data interface for obtaining Chinese A-shares, based on [AKShare](https://github.com/akfamily/akshare). It aims to simplify AKShare's usage and unify input/output formats from different data sources, making it easier to pass data to LLM.
|
26
|
+
|
27
|
+
## ✨ Features
|
28
|
+
|
29
|
+
- 📊 Unified stock code formats across data sources
|
30
|
+
- 🏗️ Standardized return data structures
|
31
|
+
- 🛠️ Simplified API parameter design
|
32
|
+
- ⏱️ Automatic timestamp and adjustment handling
|
33
|
+
|
34
|
+
## 🚀 Core Features
|
35
|
+
|
36
|
+
| Function | Interface |
|
37
|
+
|------|------|
|
38
|
+
| Historical data | `get_hist_data` |
|
39
|
+
| Real-time quotes | `get_realtime_data` |
|
40
|
+
| Stock news | `get_news_data` |
|
41
|
+
| Financial data | `get_balance_sheet`/`get_income_statement`/`get_cash_flow` |
|
42
|
+
| Internal transactions | `get_inner_trade_data` |
|
43
|
+
| Technical indicators | See [indicators.py](akshare_one/indicators.py) |
|
44
|
+
|
45
|
+
## 📦 Quick Installation
|
46
|
+
|
47
|
+
```bash
|
48
|
+
pip install akshare-one
|
49
|
+
```
|
50
|
+
|
51
|
+
## 💻 Usage Example
|
52
|
+
|
53
|
+
```python
|
54
|
+
from akshare_one import get_hist_data
|
55
|
+
from akshare_one.indicators import get_sma
|
56
|
+
|
57
|
+
# Get historical data
|
58
|
+
df = get_hist_data(
|
59
|
+
symbol="600000",
|
60
|
+
interval="day",
|
61
|
+
adjust="hfq"
|
62
|
+
)
|
63
|
+
|
64
|
+
# Calculate 20-day Simple Moving Average
|
65
|
+
df_sma = get_sma(df, window=20)
|
66
|
+
```
|
67
|
+
|
68
|
+
## 📚 Documentation
|
69
|
+
|
70
|
+
Detailed API reference: [docs/api.md](docs/api.md)
|
@@ -0,0 +1,39 @@
|
|
1
|
+
akshare_one/__init__.py,sha256=FskUp8Xpt9eN79AA2YZMLm53XGjYj2EYvuD0jkRLWsY,6504
|
2
|
+
akshare_one/indicators.py,sha256=x3Amff9CG_GvQpA-sqGfFwEAIvaaXlBxDfzTxD05taQ,12533
|
3
|
+
akshare_one/modules/cache.py,sha256=t8zaB9mvvskivBpuS2SjiR1q07CzRNJb2xtkjyZgBPk,465
|
4
|
+
akshare_one/modules/utils.py,sha256=msHqsjWSRULbX-3Bnit1p26a4a7MOEuNfkPSaECXr4k,333
|
5
|
+
akshare_one/modules/eastmoney/client.py,sha256=npxW6H8tfehDBAVAsUBOD0T4zpn7OnXfM-t2ZWr02hs,3206
|
6
|
+
akshare_one/modules/eastmoney/utils.py,sha256=0hs1kE51kZs3A9cOK448w5K8YKHaKZi0WWgtGZHVPGc,3000
|
7
|
+
akshare_one/modules/financial/base.py,sha256=TG3ncf3rXfgWCk4qUORN01uxT1SgLWiyjkt5Jb9eoxo,688
|
8
|
+
akshare_one/modules/financial/eastmoney.py,sha256=xVKJLT8kS8eZ_eQHkSMNDcMIi9CHwCIGwvuqj1cYBWw,6762
|
9
|
+
akshare_one/modules/financial/factory.py,sha256=UV6_ebqXGkmlfcfb39aX5hBjXyBLi29WbZ4AqxaPcXU,1442
|
10
|
+
akshare_one/modules/financial/sina.py,sha256=cclYraGz1O01fwYmY55VJCbyoT3kURCQTNENYNL7xRs,12948
|
11
|
+
akshare_one/modules/historical/base.py,sha256=4jdHW99-5U1mzv0WPopIkxeh20yYUDrNFzn7xazfwZU,1292
|
12
|
+
akshare_one/modules/historical/eastmoney.py,sha256=VbOaf0zXxuGmmm60x4FMh-9T5N9mYTUGmG1suMFUPfU,8489
|
13
|
+
akshare_one/modules/historical/eastmoney_direct.py,sha256=EF5AhViBwdNywqZnJYacRrdw4Up0gbuUr7RgssK7rpw,2893
|
14
|
+
akshare_one/modules/historical/factory.py,sha256=qfMod5HSV-itE-i1ludIp0w8Zq7Vjp2LPomajVd5Kjc,1548
|
15
|
+
akshare_one/modules/historical/sina.py,sha256=CI7eiXG7xo-2J6TEyq0Lr25vogAedbSa3mMHI9REgIQ,8939
|
16
|
+
akshare_one/modules/indicators/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
17
|
+
akshare_one/modules/indicators/base.py,sha256=DhFivpVIUIkdIv24U2WoOy1GCDySxsw0tD0-rBRe5Lc,4376
|
18
|
+
akshare_one/modules/indicators/factory.py,sha256=pKx57oej_L0Lz3kkXwzVievKpOYph0T_Y7fzSwO3Zd4,1021
|
19
|
+
akshare_one/modules/indicators/simple.py,sha256=vAqE3v9HYpW-Sy6KsG9oV5fppWchQTxtz1M_508sQtY,9342
|
20
|
+
akshare_one/modules/indicators/talib.py,sha256=w0KpV-BXVxU0LmWs_EbXJUFgo9dbMeUQijjJMkjtWtU,10773
|
21
|
+
akshare_one/modules/info/base.py,sha256=Kof-e1I2usx1VOc1d05kyL-8B_QEDOsbry4R3dV0zZE,697
|
22
|
+
akshare_one/modules/info/eastmoney.py,sha256=Ou4BTw_PC1tJcEpoRTqrR-hqjgcDjWHuX6InbYiCXLU,1663
|
23
|
+
akshare_one/modules/info/factory.py,sha256=xvwPrgce0p9U4qAQBJM7FFw3zJks6m2hLHwHf0t1rfU,1308
|
24
|
+
akshare_one/modules/insider/base.py,sha256=NE45w-B9sQ2AoUSSKNPU9U6wPHK4fiLV5Zgj_byrBMQ,977
|
25
|
+
akshare_one/modules/insider/factory.py,sha256=32bueJA3E8yCZc0v5EAen_48RZ23yojYzpzaZyQ6WnA,1324
|
26
|
+
akshare_one/modules/insider/xueqiu.py,sha256=6WKEvdE-8cjVQjTsJIkgnqhaQUS5sXZCyxKPLMLyers,4109
|
27
|
+
akshare_one/modules/news/base.py,sha256=D5BDtRQ9vdi1Gj-ikbtjAaCAbimW6mCEhRo_NJTmqN4,581
|
28
|
+
akshare_one/modules/news/eastmoney.py,sha256=2gPEnzQ347MJMXAUsxxu8MnizvCrfGPse9V83wfCsXE,1380
|
29
|
+
akshare_one/modules/news/factory.py,sha256=3FMkNBpYF7l-v2NHHR5TzbvklQNzJ-R_XzG8AlRjJcg,1308
|
30
|
+
akshare_one/modules/realtime/base.py,sha256=eYicSs7E4qmcpQ-8TnbfmJvsK0VQoezVK7Zobqh5xPk,729
|
31
|
+
akshare_one/modules/realtime/eastmoney.py,sha256=IRAPokCm_-aOn16w5_dkbKVjdYcqL-y7GSHrSgOjT2E,1707
|
32
|
+
akshare_one/modules/realtime/eastmoney_direct.py,sha256=HiHrhsTcDTswMg4b7JSUXHLtf-oYziWxLGXLhFJ2pYo,1275
|
33
|
+
akshare_one/modules/realtime/factory.py,sha256=_7jBDgqWqkt5xTTT1SpZoUHM9IpMRpcUQeyyCglM5z0,1528
|
34
|
+
akshare_one/modules/realtime/xueqiu.py,sha256=j_cjJZD0fTva_jgXKeQAJSFVHKJHb5zMu3Crf_8zLs0,2301
|
35
|
+
akshare_one-0.3.3.dist-info/licenses/LICENSE,sha256=3bqxoD7aU4QS7kpNtQmRd4MikxXe6Gtm_DrojyFHGAc,1087
|
36
|
+
akshare_one-0.3.3.dist-info/METADATA,sha256=a2RtfPXBTGrbQu4dlHfJs_NuvHyWKnOEX4pTXhtaWKk,2132
|
37
|
+
akshare_one-0.3.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
38
|
+
akshare_one-0.3.3.dist-info/top_level.txt,sha256=kNiucyLVAGa89wmUSpXbBLWD7pF_RuahuiaOfLHZSyw,12
|
39
|
+
akshare_one-0.3.3.dist-info/RECORD,,
|
@@ -1,21 +1,21 @@
|
|
1
|
-
MIT License
|
2
|
-
|
3
|
-
Copyright (c) 2025 zwldarren
|
4
|
-
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
7
|
-
in the Software without restriction, including without limitation the rights
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
10
|
-
furnished to do so, subject to the following conditions:
|
11
|
-
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
13
|
-
copies or substantial portions of the Software.
|
14
|
-
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
-
SOFTWARE.
|
1
|
+
MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2025 zwldarren
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|