问题描述
002367康力电梯
stock = "002367.XSHE"
ma600 = MA(stock, check_date="2023-03-01", timeperiod=600, unit = '1d', include_now = False, fq_ref_date = None)[stock]
ma600
8.136016666666693
炒股软件上显示的是8.19,代码打印的是8.13,相差不少,这个怎么才能让代码显示的和炒股软件一样的呢?还是复权问题吗?
补充,都有试过,设置include_now,fq_ref_date 影响不大,感觉还是复权的问题。官网API的MA均线在研究环境下是前复权的,好奇怎么计算的。。。其他参考评论区:
stock = "002367.XSHE"
date = "2023-03-01"
ma600 = MA(stock, check_date=date, timeperiod=600, unit = '1d', include_now = True, fq_ref_date =None )[stock]
ma600
8.13018333333336
stock = "002367.XSHE"
date = "2023-03-01"
ma600 = MA(stock, check_date=date, timeperiod=600, unit = '1d', include_now = True, fq_ref_date =date )[stock]
ma600
8.13018333333336
解决方案
你好!你遇到的这个问题确实是复权基准日导致的。
为什么会产生差异?
我们在同花顺、通达信等炒股软件上看到的“前复权”价格,默认是以**今天(即最新的交易日)**作为复权基准日的。这意味着,如果一只股票在历史某天到今天之间发生了分红派息,软件会把历史所有的价格都向下折算。
在你的代码中:
fq_ref_date = None:表示获取的是不复权的原始价格,算出来的均线自然和软件上的前复权均线不同。fq_ref_date = date(即2023-03-01):表示以2023-03-01为基准日进行前复权。但是,如果你今天在炒股软件上看2023-03-01的 600 日均线,软件是以今天为基准日复权的。康力电梯(002367)在 2023 年 3 月之后如果有分红,那么以2023-03-01为基准和以今天为基准算出来的历史价格序列是不一样的,均线结果自然也会有偏差。
如何让代码结果和炒股软件完全一致?
要和炒股软件当前看到的前复权均线一致,你需要将复权基准日(fq_ref_date)设置为今天(或者直接使用 get_price 默认的前复权机制)。
方法一:修改 MA 函数的 fq_ref_date
将 fq_ref_date 设置为当前日期(datetime.datetime.now()):
import datetime
from jqlib.technical_analysis import MA
stock = "002367.XSHE"
date = "2023-03-01"
# 将复权基准日设置为今天,模拟炒股软件的当前视角
ma600_dict = MA(stock, check_date=date, timeperiod=600, unit='1d', include_now=True, fq_ref_date=datetime.datetime.now())
ma600 = ma600_dict[stock]
print("MA600:", ma600)
方法二:使用 get_price 自己计算(推荐,更透明)
在研究环境中,直接使用 get_price 获取前复权数据(默认 fq='pre' 就是以当前最新日期为基准的前复权),然后用 pandas 计算均值,这样逻辑最清晰:
import pandas as pd
from jqdata import *
stock = "002367.XSHE"
end_date = "2023-03-01"
# 获取截止到 2023-03-01 的过去 600 个交易日的收盘价
# 默认 fq='pre',在研究环境中就是以今天为基准的前复权
df = get_price(stock, end_date=end_date, count=600, frequency='daily', fields=['close'], fq='pre')
# 计算均值
ma600 = df['close'].mean()
print("MA600:", ma600)
总结
- 炒股软件的前复权:永远以“你打开软件的今天”为基准。
- 量化回测的前复权:为了避免未来函数,回测引擎通常以“回测进行到的那一天(
context.current_dt)”为基准。 - 如果你只是想在研究环境中核对数据,把基准日设为今天即可;但在写策略回测时,千万不要把基准日设为今天,否则会引入未来函数,导致回测结果失真。回测中建议直接使用
attribute_history或history,系统会自动处理好基于当时视角的复权价格。