是否有各大评级机构的评级信息
感谢作者大大,基金信息中是否有包含评级信息,比如晨星的
暂时无
每天晚上获取当天基金净值的时候会有数据更新不及时的情况 比如:xa.fundinfo("320007",priceonly=True).price 或者 xa.universal.get_daily("F320007") 清除缓存也不行 xa.universal.reset_cache()
每天晚上获取当天基金净值的时候会有数据更新不及时的情况
这个是 xalpha 的 designed feature。由于不同基金当日数据更新时间不同,日线数据同时出现不同日期时可能造成混乱,所以统一截断到昨天。想要获取最新的数据,可以使用 xa.get_rt("F123456") 单独获取当日数据。
谢谢大佬回复,还有个问题想问下,交易记录必须从csv文件中获取吗?可以从sql中获取不? 参考你的例子 read = xa.record(path) xa.mul(status=read.status) 不行的话我就从sql中导出为csv
好问题,这个记账单的读取,暂时只支持 csv 格式。数据缓存则是 csv 和 sql 两种后端都支持的。 这边最核心支持的记账单的 matrix 模式其实是和 sql 的表格设计不大兼容的,list 型的流水账单没问题。因此短期内可能也不考虑记账单的 sql 格式直接支持(还有一个考虑就是实盘账单原生在数据库里的情形比较少见)。
所以如果本来账单在数据库里的话,可以考虑通过 pandas 读出来对应表格作为 DataFrame,直接传入 record(path=df) 即可,也不需要额外生成 csv 用。
大佬,我的想法是在每天3点前根据策略自动买入卖出,但是我有些困惑: 基金策略回测是根据历史当天净值来回测,但实际情况是每天我能参考的只有估值,而且xa.get_rt()好像不能直接获取到每天估值 我应该怎么实施策略?
本来 get_rt 是可以获取实时估值的,但是天天基金页面好想修改了实时估值的获取逻辑,我看一下能否调整下代码 Update: 最新 commit,应该 get_rt 又可以获取到 estimate 属性了
大佬,我的想法是在每天3点前根据策略自动买入卖出,但是我有些困惑:
基金策略回测是根据历史当天净值来回测,但实际情况是每天我能参考的只有估值,而且xa.get_rt()好像不能直接获取到每天估值
我应该怎么实施策略?
你用什么接口实现自动化买卖啊
@willzhqiang 没有现成接口,但是可以从app入手。模拟点击或者hook
@refraction-ray fundinfo.price现在数据只到12-31了,怎么获取历史净值啊
现在数据只到12-31了,怎么获取历史净值啊
升级一下 xalpha 的版本就好了,老版本没有 2021 的交易日历
大佬,在尝试本地化的时候出现一个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原因还是因为我没建表的原因啊,如果需要建表的话字段怎么定义的,非常感谢
附上完整调用栈
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)
应该是不用自己建表的,本质上我也就是调了下 pandas 的 API df.to_sql("xa"+code, con=engine). 所以这个问题大概率是 sqlite 或 sqlalchemy 两者或者他们不匹配造成的?我记得 django 有自带的 orm,不知道会不会和 sqlalchemy 冲突啥的。
我的一些排查建议,直接调用 fundinfoobj.price.to_sql("xa00012", con=engine) 看看是否正常工作,然后在 django 框架下边调用这句看看是否正常工作。如果这两者会出问题,那大概率不是 xalpha 这边的问题。如果这样是正常的,我们可以在来看是不是 xalpha 哪里有点问题。
在Django里面调用fundinfoj.price.to_sql("xa320007", con=engine)这句是可以执行成功的
我仔细看了下报错信息,应该是去取数据的时候结果表里没有数据抛了异常
程序应该没表格会自动捕获异常然后初始化数据。你如果按照 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, 看是不是类似的问题,我也不太确定
有个异常没有处理到,我提个pr
大佬,我又遇到一个问题,算出来的不对啊,是那里的值被舍弃了吗

这个只能 sysopen.fundtradeobj[0].cftable 和 df 的账单比一下了,看看是不是哪一笔有什么问题
还是对不上
建议你可以把 cftable 和 df 逐行打印出来,不然我也无法给出建议,看到是哪里对不上
逐行对比了下,没有发现哪里不对
那比较奇怪,因为总申购就是像下边这样算的,其他基金或者以前有这个问题吗
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") 呢
还真是,那我应该怎么看呢? sysopen.summary(date=当前date)?
还真是,那我应该怎么看呢? sysopen.summary(date=当前date)?
是的,暂时只能这样。这确实是我程序最早写的有问题,导致默认的日期在导入 xalpha 时就确定了,其实也可以改,但 date 出现的地方有点多,至今还没改。
2月1号我卖出的怎么和sysopen对不上呢?
是不是卖出的份额超过持有份额了,一共就 5329 份
你看我df的最后一条,2.1号卖出应该是-6466元,但是cftable中2.1号卖出却是12531.04元,我也看不出哪里出了问题,难道被算成了份额?
账单 df 负数默认就是按份额计算的赎回,而不是金额
哦哦,明白了,那买入,也就是“+”应该默认算的是金额吧