xalpha icon indicating copy to clipboard operation
xalpha copied to clipboard

是否有各大评级机构的评级信息

Open Rico358097990 opened this issue 5 years ago • 30 comments

感谢作者大大,基金信息中是否有包含评级信息,比如晨星的

Rico358097990 avatar Nov 19 '20 05:11 Rico358097990

暂时无

refraction-ray avatar Nov 19 '20 06:11 refraction-ray

每天晚上获取当天基金净值的时候会有数据更新不及时的情况 比如:xa.fundinfo("320007",priceonly=True).price 或者 xa.universal.get_daily("F320007") 清除缓存也不行 xa.universal.reset_cache()

Rico358097990 avatar Dec 08 '20 15:12 Rico358097990

每天晚上获取当天基金净值的时候会有数据更新不及时的情况

这个是 xalpha 的 designed feature。由于不同基金当日数据更新时间不同,日线数据同时出现不同日期时可能造成混乱,所以统一截断到昨天。想要获取最新的数据,可以使用 xa.get_rt("F123456") 单独获取当日数据。

refraction-ray avatar Dec 09 '20 01:12 refraction-ray

谢谢大佬回复,还有个问题想问下,交易记录必须从csv文件中获取吗?可以从sql中获取不? 参考你的例子 read = xa.record(path) xa.mul(status=read.status) 不行的话我就从sql中导出为csv

Rico358097990 avatar Dec 09 '20 10:12 Rico358097990

好问题,这个记账单的读取,暂时只支持 csv 格式。数据缓存则是 csv 和 sql 两种后端都支持的。 这边最核心支持的记账单的 matrix 模式其实是和 sql 的表格设计不大兼容的,list 型的流水账单没问题。因此短期内可能也不考虑记账单的 sql 格式直接支持(还有一个考虑就是实盘账单原生在数据库里的情形比较少见)。

所以如果本来账单在数据库里的话,可以考虑通过 pandas 读出来对应表格作为 DataFrame,直接传入 record(path=df) 即可,也不需要额外生成 csv 用。

refraction-ray avatar Dec 09 '20 10:12 refraction-ray

大佬,我的想法是在每天3点前根据策略自动买入卖出,但是我有些困惑: 基金策略回测是根据历史当天净值来回测,但实际情况是每天我能参考的只有估值,而且xa.get_rt()好像不能直接获取到每天估值 我应该怎么实施策略?

Rico358097990 avatar Dec 14 '20 13:12 Rico358097990

本来 get_rt 是可以获取实时估值的,但是天天基金页面好想修改了实时估值的获取逻辑,我看一下能否调整下代码 Update: 最新 commit,应该 get_rt 又可以获取到 estimate 属性了

refraction-ray avatar Dec 16 '20 11:12 refraction-ray

大佬,我的想法是在每天3点前根据策略自动买入卖出,但是我有些困惑:

基金策略回测是根据历史当天净值来回测,但实际情况是每天我能参考的只有估值,而且xa.get_rt()好像不能直接获取到每天估值

我应该怎么实施策略?

你用什么接口实现自动化买卖啊

willzhqiang avatar Dec 20 '20 02:12 willzhqiang

@willzhqiang 没有现成接口,但是可以从app入手。模拟点击或者hook

Rico358097990 avatar Dec 20 '20 08:12 Rico358097990

@refraction-ray fundinfo.price现在数据只到12-31了,怎么获取历史净值啊

Rico358097990 avatar Jan 06 '21 15:01 Rico358097990

现在数据只到12-31了,怎么获取历史净值啊

升级一下 xalpha 的版本就好了,老版本没有 2021 的交易日历

refraction-ray avatar Jan 07 '21 01:01 refraction-ray

大佬,在尝试本地化的时候出现一个error,这个sqlite是django生成的

            basedir = os.path.abspath(os.getcwd())
            sqlPath ='sqlite:////' + os.path.join(basedir, 'db.sqlite3')
            engine = create_engine(sqlPath)
            io = {"save": True, "fetch": True, "form": "sql", "path": engine}
            sysopen = xa.mul(status=read.status, **io) 

运行时报了

sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) near "xa000294": syntax error
[SQL: xa000294]

是因为Django原因还是因为我没建表的原因啊,如果需要建表的话字段怎么定义的,非常感谢

Rico358097990 avatar Jan 14 '21 11:01 Rico358097990

附上完整调用栈

Traceback (most recent call last):
  File "/Users/mac/opt/anaconda3/envs/django/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1276, in _execute_context
    self.dialect.do_execute(
  File "/Users/mac/opt/anaconda3/envs/django/lib/python3.8/site-packages/sqlalchemy/engine/default.py", line 609, in do_execute
    cursor.execute(statement, parameters)
sqlite3.OperationalError: near "xa000294": syntax error

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/Users/mac/opt/anaconda3/envs/django/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/Users/mac/opt/anaconda3/envs/django/lib/python3.8/site-packages/django/core/handlers/base.py", line 179, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/mac/opt/anaconda3/envs/django/lib/python3.8/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "/Users/mac/opt/anaconda3/envs/django/lib/python3.8/site-packages/django/views/generic/base.py", line 70, in view
    return self.dispatch(request, *args, **kwargs)
  File "/Users/mac/opt/anaconda3/envs/django/lib/python3.8/site-packages/rest_framework/views.py", line 509, in dispatch
    response = self.handle_exception(exc)
  File "/Users/mac/opt/anaconda3/envs/django/lib/python3.8/site-packages/rest_framework/views.py", line 469, in handle_exception
    self.raise_uncaught_exception(exc)
  File "/Users/mac/opt/anaconda3/envs/django/lib/python3.8/site-packages/rest_framework/views.py", line 480, in raise_uncaught_exception
    raise exc
  File "/Users/mac/opt/anaconda3/envs/django/lib/python3.8/site-packages/rest_framework/views.py", line 506, in dispatch
    response = handler(request, *args, **kwargs)
  File "/Users/mac/FundAdmin/finance/views.py", line 130, in get
    dataDict['data'] = fromDB2DataFrame(user)
  File "/Users/mac/FundAdmin/finance/views.py", line 110, in fromDB2DataFrame
    sysopen = xa.mul(status=read.status, **io)
  File "/Users/mac/opt/anaconda3/envs/django/lib/python3.8/site-packages/xalpha/multiple.py", line 95, in __init__
    fundinfo(
  File "/Users/mac/opt/anaconda3/envs/django/lib/python3.8/site-packages/xalpha/info.py", line 551, in __init__
    super().__init__(
  File "/Users/mac/opt/anaconda3/envs/django/lib/python3.8/site-packages/xalpha/info.py", line 345, in __init__
    self.fetch(path, self.format)
  File "/Users/mac/opt/anaconda3/envs/django/lib/python3.8/site-packages/xalpha/info.py", line 494, in fetch
    self._fetch_sql(path)
  File "/Users/mac/opt/anaconda3/envs/django/lib/python3.8/site-packages/xalpha/info.py", line 887, in _fetch_sql
    content = pd.read_sql("xa" + self.code, path)
  File "/Users/mac/opt/anaconda3/envs/django/lib/python3.8/site-packages/pandas/io/sql.py", line 510, in read_sql
    return pandas_sql.read_query(
  File "/Users/mac/opt/anaconda3/envs/django/lib/python3.8/site-packages/pandas/io/sql.py", line 1294, in read_query
    result = self.execute(*args)
  File "/Users/mac/opt/anaconda3/envs/django/lib/python3.8/site-packages/pandas/io/sql.py", line 1162, in execute
    return self.connectable.execution_options().execute(*args, **kwargs)
  File "/Users/mac/opt/anaconda3/envs/django/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 2235, in execute
    return connection.execute(statement, *multiparams, **params)
  File "/Users/mac/opt/anaconda3/envs/django/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1003, in execute
    return self._execute_text(object_, multiparams, params)
  File "/Users/mac/opt/anaconda3/envs/django/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1172, in _execute_text
    ret = self._execute_context(
  File "/Users/mac/opt/anaconda3/envs/django/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1316, in _execute_context
    self._handle_dbapi_exception(
  File "/Users/mac/opt/anaconda3/envs/django/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1510, in _handle_dbapi_exception
    util.raise_(
  File "/Users/mac/opt/anaconda3/envs/django/lib/python3.8/site-packages/sqlalchemy/util/compat.py", line 182, in raise_
    raise exception
  File "/Users/mac/opt/anaconda3/envs/django/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1276, in _execute_context
    self.dialect.do_execute(
  File "/Users/mac/opt/anaconda3/envs/django/lib/python3.8/site-packages/sqlalchemy/engine/default.py", line 609, in do_execute
    cursor.execute(statement, parameters)
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) near "xa000294": syntax error
[SQL: xa000294]
(Background on this error at: http://sqlalche.me/e/13/e3q8)

Rico358097990 avatar Jan 14 '21 11:01 Rico358097990

应该是不用自己建表的,本质上我也就是调了下 pandas 的 API df.to_sql("xa"+code, con=engine). 所以这个问题大概率是 sqlite 或 sqlalchemy 两者或者他们不匹配造成的?我记得 django 有自带的 orm,不知道会不会和 sqlalchemy 冲突啥的。 我的一些排查建议,直接调用 fundinfoobj.price.to_sql("xa00012", con=engine) 看看是否正常工作,然后在 django 框架下边调用这句看看是否正常工作。如果这两者会出问题,那大概率不是 xalpha 这边的问题。如果这样是正常的,我们可以在来看是不是 xalpha 哪里有点问题。

refraction-ray avatar Jan 14 '21 11:01 refraction-ray

在Django里面调用fundinfoj.price.to_sql("xa320007", con=engine)这句是可以执行成功的 image 我仔细看了下报错信息,应该是去取数据的时候结果表里没有数据抛了异常

Rico358097990 avatar Jan 14 '21 13:01 Rico358097990

程序应该没表格会自动捕获异常然后初始化数据。你如果按照 df.to_sql("xa123456") 测试后,记得把对应的表从 sqlite 删掉,因为这个和 123456 基金 xalpha 自动去存的表格式还是有区别,但是名字相同了。所以做过这个 to_sql 的测试后,再 xa.fundinfo(**io) 会报获取数据有问题的错误。

不过如果直接调用 to_sql 是好的,那确实很奇怪。因为这个本地化部分的代码很简单,就在 https://github.com/refraction-ray/xalpha/blob/master/xalpha/info.py#L855-L877 ,基本上就是一个 to_sql. 另外我一直在用 mysql 的数据库,也是没遇到问题的。不知道会不会和 sqlite 某些表头和数据类型的约定限制有关系。也许你可以参考下 https://github.com/refraction-ray/xalpha/issues/38, 看是不是类似的问题,我也不太确定

refraction-ray avatar Jan 14 '21 14:01 refraction-ray

有个异常没有处理到,我提个pr

Rico358097990 avatar Jan 15 '21 01:01 Rico358097990

大佬,我又遇到一个问题,算出来的不对啊,是那里的值被舍弃了吗 image

Rico358097990 avatar Jan 26 '21 05:01 Rico358097990

这个只能 sysopen.fundtradeobj[0].cftable 和 df 的账单比一下了,看看是不是哪一笔有什么问题

refraction-ray avatar Jan 26 '21 06:01 refraction-ray

image 还是对不上

Rico358097990 avatar Jan 26 '21 06:01 Rico358097990

建议你可以把 cftable 和 df 逐行打印出来,不然我也无法给出建议,看到是哪里对不上

refraction-ray avatar Jan 26 '21 06:01 refraction-ray

image image 逐行对比了下,没有发现哪里不对

Rico358097990 avatar Jan 26 '21 07:01 Rico358097990

那比较奇怪,因为总申购就是像下边这样算的,其他基金或者以前有这个问题吗

partcftb = self.cftable[self.cftable["date"] <= date]
totinput = myround(
            -sum([row["cash"] for _, row in partcftb.iterrows() if row["cash"] < 0])
        )

我想到的一个可能性,你这个程序是不是一直是 running 的状态(比如 web 服务或者 jupyter 里边),导致默认的日期没有刷新,你看到的 summary 其实是 0119 之前的 summary,你试试 sysopen.summary(date="2021-01-25")

refraction-ray avatar Jan 26 '21 07:01 refraction-ray

还真是,那我应该怎么看呢? sysopen.summary(date=当前date)?

Rico358097990 avatar Jan 26 '21 07:01 Rico358097990

还真是,那我应该怎么看呢? sysopen.summary(date=当前date)?

是的,暂时只能这样。这确实是我程序最早写的有问题,导致默认的日期在导入 xalpha 时就确定了,其实也可以改,但 date 出现的地方有点多,至今还没改。

refraction-ray avatar Jan 26 '21 09:01 refraction-ray

image 2月1号我卖出的怎么和sysopen对不上呢?

Rico358097990 avatar Feb 03 '21 02:02 Rico358097990

是不是卖出的份额超过持有份额了,一共就 5329 份

refraction-ray avatar Feb 03 '21 05:02 refraction-ray

你看我df的最后一条,2.1号卖出应该是-6466元,但是cftable中2.1号卖出却是12531.04元,我也看不出哪里出了问题,难道被算成了份额?

Rico358097990 avatar Feb 03 '21 05:02 Rico358097990

账单 df 负数默认就是按份额计算的赎回,而不是金额

refraction-ray avatar Feb 03 '21 06:02 refraction-ray

哦哦,明白了,那买入,也就是“+”应该默认算的是金额吧

Rico358097990 avatar Feb 03 '21 06:02 Rico358097990