efinance icon indicating copy to clipboard operation
efinance copied to clipboard

新特性收集区

Open Micro-sheep opened this issue 2 years ago • 64 comments

这是 efinance 的新特性收集区,欢迎需要添加新特性的人来提建议,我会认真地看大家的反馈和建议,并且会考虑把它添加到 efinance 中。

其中,新特性包括下面几个方面

  • 优化数据获取速度
  • 增加更多可获取的数据
  • 集成量化算法

还有其他方面的新特性我可能没有考虑到,也欢迎大家来探讨。

Micro-sheep avatar Jul 31 '21 01:07 Micro-sheep

都准备做量化算法了,大佬能否增加下回测功能

cz9874308 avatar Aug 05 '21 06:08 cz9874308

都准备做量化算法了,大佬能否增加下回测功能

正在做,耗时会比较久,成熟之后再发布。

Micro-sheep avatar Aug 05 '21 06:08 Micro-sheep

都准备做量化算法了,大佬能否增加下回测功能

正在做,耗时会比较久,成熟之后再发布。

建议参考下backtraer

cz9874308 avatar Aug 05 '21 06:08 cz9874308

都准备做量化算法了,大佬能否增加下回测功能

正在做,耗时会比较久,成熟之后再发布。

建议参考下backtraer

好。

Micro-sheep avatar Aug 05 '21 06:08 Micro-sheep

能否增加指数成分股和板块成分股获取

vensentzhou avatar Aug 13 '21 08:08 vensentzhou

能否增加指数成分股和板块成分股获取

Micro-sheep avatar Aug 13 '21 08:08 Micro-sheep

能否增加指数成分股和板块成分股获取

获取指数成分股示例代码如下(目前还没有集成到 efinance 里面)

from typing import List
import pandas as pd
from urllib.parse import urlencode


def get_children(indexid: str) -> pd.DataFrame:
    """
    获取指数成分股信息

    Parameters
    ----------
    indexid : str
        指数代码
        例如
        - `"000001"` : 上证指数
        - `"000300"` : 沪深 300

    Returns
    -------
    DataFrame
        指数成分股
    """
    page = 1
    dfs: List[pd.DataFrame] = []
    while 1:
        print(f'current page: {page}', end='\r')
        params = (
            ('page', f'{page}'),
            ('indexid', indexid),
        )
        base_url = 'http://vip.stock.finance.sina.com.cn/corp/view/vII_NewestComponent.php'
        url = base_url+'?'+urlencode(params)
        tables = pd.read_html(url,header=1)
        if len(tables) < 4:
            break
        df = tables[3]
        dfs.append(df)
        page += 1
    df = pd.concat(dfs)[df.columns[:3]]
    df['品种代码'] = df['品种代码'].apply(lambda x:str(x).rjust(6,'0'))
    return df
indexid = '000300'
df = get_children(indexid)
df

image

Micro-sheep avatar Aug 13 '21 13:08 Micro-sheep

中正800指数成份股有重复,是数据源问题,还是程序问题: indexid = '000906' df = get_children(indexid) index_code=df['品种代码'].to_list()

from collections import Counter #引入Counter

a = [29,36,57,12,79,43,23,56,28,11,14,15,16,37,24,35,17,24,33,15,39,46,52,13]

b = dict(Counter(index_code)) print ([key for key,value in b.items()if value > 1]) #只展示重复元素 print ({key:value for key,value in b.items()if value > 1}) #展现重复元素和重复次数

{'603517': 2, '003035': 2, '300037': 2, '688036': 2, '300699': 2, '002985': 2, '603290': 2, '603195': 2, '002966': 2, '688321': 2, '600872': 2, '600556': 2, '002049': 2, '002458': 2, '000708': 2, '002157': 2, '000046': 2, '300628': 2, '300271': 2, '002156': 2, '300618': 2, '002429': 2, '001914': 2, '002396': 2, '300630': 2, '002013': 2, '001872': 2, '600989': 2, '000825': 2, '601236': 2, '601233': 2, '601799': 2, '002203': 2, '603338': 2, '601698': 2, '603379': 2, '603019': 2, '603501': 2, '601699': 2, '000869': 2, '600733': 2, '600903': 2, '600845': 2, '600745': 2, '600299': 2, '600985': 2, '600707': 2, '002372': 2, '002311': 2, '300316': 2, '000932': 2, '002032': 2, '600782': 2, '600027': 2, '601231': 2, '601869': 2, '603156': 2, '300296': 2, '601106': 2, '002110': 2, '300408': 2, '601360': 2, '000553': 2, '600350': 2, '600809': 2, '002916': 2, '600258': 2, '600867': 2, '601801': 2, '002085': 2, '002302': 2, '002925': 2, '601179': 2, '601969': 2, '601228': 2, '000807': 2, '601878': 2, '000887': 2, '600875': 2, '000990': 2, '601128': 2, '600598': 2, '600155': 2, '000898': 2, '601992': 2, '603888': 2, '603160': 2, '002424': 2, '002572': 2, '002602': 2, '300001': 2, '300010': 2, '300113': 2, '300166': 2, '600958': 2, '601021': 2, '601788': 2, '600967': 2, '601012': 2, '600886': 2, '601608': 2, '601800': 2, '603000': 2, '600436': 2, '600859': 2, '601377': 2, '601717': 2, '600881': 2, '600884': 2, '600895': 2, '600900': 2, '000778': 3, '000786': 3, '000858': 3, '000937': 3, '000983': 3, '000031': 2, '000039': 2, '000060': 2, '000061': 2, '000063': 2, '000066': 2, '000069': 2, '000157': 2, '000401': 2, '000402': 2, '000425': 2, '000488': 2, '000528': 2, '000568': 2, '000581': 2, '000625': 2, '000630': 2, '000651': 2, '000709': 2, '000758': 2, '000768': 2}

vensentzhou avatar Aug 17 '21 02:08 vensentzhou

沪深 300 为例,我测试了一下,数据源本身是有重复的,比如股票代码 688012 在第 1 和第 2 页均有出现。

Micro-sheep avatar Aug 17 '21 06:08 Micro-sheep

那是不靠谱,000300,取了300条记录,去重后剩下273条,数据不完整

vensentzhou avatar Aug 17 '21 16:08 vensentzhou

那是不靠谱,000300,取了300条记录,去重后剩下273条,数据不完整

确实如此。

Micro-sheep avatar Aug 17 '21 16:08 Micro-sheep

有没有 龙虎榜 数据?

huntergd avatar Aug 29 '21 07:08 huntergd

有没有 龙虎榜 数据?

目前没有 下过版本考虑加上。

Micro-sheep avatar Aug 29 '21 08:08 Micro-sheep

有没有 龙虎榜 数据?

刚更新到 v0.3.7 现在支持获取龙虎榜详情数据。具体示例详见 README.md 里面的 Examples 的 Stock 部分,或者 API 文档。

Micro-sheep avatar Aug 30 '21 06:08 Micro-sheep

大神你好,有没有考虑做一个基金收益计算功能,例如买入一只或几只基金后,持有一段时间的本息及收益率。(并非定投,当然如果还有定投的回测就更好了。)

mars-ko avatar Sep 07 '21 05:09 mars-ko

大神你好,有没有考虑做一个基金收益计算功能,例如买入一只或几只基金后,持有一段时间的本息及收益率。(并非定投,当然如果还有定投的回测就更好了。)

在做中,完善后再放出。

Micro-sheep avatar Sep 07 '21 06:09 Micro-sheep

大神你好,有没有考虑做一个基金收益计算功能,例如买入一只或几只基金后,持有一段时间的本息及收益率。(并非定投,当然如果还有定投的回测就更好了。)

在做中,完善后再放出。

这么及时的回复,非常感谢。这个功能之后可以再考虑增加基金组合方面的需求,例如组合回测、穿透持仓等。(当然这是后话了)。 希望越来越好~

mars-ko avatar Sep 07 '21 06:09 mars-ko

大神你好,有没有考虑做一个基金收益计算功能,例如买入一只或几只基金后,持有一段时间的本息及收益率。(并非定投,当然如果还有定投的回测就更好了。)

在做中,完善后再放出。

这么及时的回复,非常感谢。这个功能之后可以再考虑增加基金组合方面的需求,例如组合回测、穿透持仓等。(当然这是后话了)。

希望越来越好~

好。

Micro-sheep avatar Sep 07 '21 07:09 Micro-sheep

有没有实时行情的 分时 数据 (非分钟级K线),看分时图的。

huntergd avatar Oct 27 '21 03:10 huntergd

有没有实时行情的 分时 数据 (非分钟级K线),看分时图的。

目前没有。

Micro-sheep avatar Oct 27 '21 04:10 Micro-sheep

请问作者: 1.如何获取某股票每日收盘自由流通市值? 2.如何获取某股票所属行业板块和概念板块?

Tinyrat avatar Nov 18 '21 14:11 Tinyrat

请问作者: 1.如何获取某股票每日收盘自由流通市值? 2.如何获取某股票所属行业板块和概念板块?

  1. 如果你说的是某只股票在每一个历史交易日的收盘时的流通市值,那么现在暂时无法获取,如果你只是想获取股票的最新流通市值,则可以这么做
import efinance as ef
quotes = ef.stock.get_realtime_quotes()
print(quotes.columns)
quotes

image

以上演示如何获取多只股票的最新流通市值,如需取指定股票的流通市值,详情可查阅 pandas 的文档,了解如何定位指定单元格即可。 2. 获取行业板块和概念板块示例如下

import efinance as ef
import pandas as pd
from efinance.common import get_realtime_quotes_by_fs
# 如果是概念板块 就把下面的 行业板块 改为 概念板块
key = '行业板块'
# 获取行业板块成员信息
industries = ef.stock.get_realtime_quotes(key)
dfs = []
# 获取每一个行业板块的成员的成分股信息
for industry in industries.iloc:
    bk_id = industry['股票代码']
    members = get_realtime_quotes_by_fs(f'b:{bk_id}')
    members.insert(2, key, industry['股票名称'])
    dfs.append(members)
df = pd.concat(dfs, axis=0, ignore_index=True).rename(
    columns={'代码': '股票代码', '名称': '股票名称'})
df

运行结果

image

如需取某只股票的板块信息,同样需要参考 pandas 里面的定位单元格的方法。

Micro-sheep avatar Nov 19 '21 04:11 Micro-sheep

目前大多都是沪深的数据,建议加入港股和美股数据。

mikezh avatar Dec 21 '21 06:12 mikezh

目前大多都是沪深的数据,建议加入港股和美股数据。

例子中大部分展示的是沪深例子,不过的大部分也是支持港股美股的,例如行情信息等。

Micro-sheep avatar Dec 21 '21 07:12 Micro-sheep

大佬新年好,请问有实现获取每天的筹码分布的功能吗?

dhKwang avatar Feb 05 '22 16:02 dhKwang

大佬新年好,请问有实现获取每天的筹码分布的功能吗?

筹码分布可以直接获取吗?我印象中好像是通过一些成交数据算筹码分布。

Micro-sheep avatar Feb 05 '22 17:02 Micro-sheep

能否加入获取美股盘前功能

Calanosay avatar Feb 27 '22 03:02 Calanosay

能否获取A股的业绩预披露时间?

todaygood avatar Apr 20 '22 10:04 todaygood

get_belong_board 能否区分是行业板块还是概念板块?

xiaoxiaodetian avatar May 05 '22 06:05 xiaoxiaodetian

get_belong_board 能否区分是行业板块还是概念板块?

可以根据板块代码来做区分,例如 浙江建投,股票代码为 002761,行业板块代码为 BK0405,其中一个概念板块代码为 BK1076。以 BK04 开头的为行业板块,以BK01开头的为地区板块,其他的,可以自行选几只票,结合东方财富app来看,即可总结出板块编号规律,进而知道板块类型。

Micro-sheep avatar May 05 '22 07:05 Micro-sheep