3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
你好!你遇到的这个问题确实是复权基准日导致的。
我们在同花顺、通达信等炒股软件上看到的“前复权”价格,默认是以**今天(即最新的交易日)**作为复权基准日的。这意味着,如果一只股票在历史某天到今天之间发生了分红派息,软件会把历史所有的价格都向下折算。
在你的代码中:
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 默认的前复权机制)。
将 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 获取前复权数据(默认 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,系统会自动处理好基于当时视角的复权价格。