Files
stock/stockapp/stat_sp500_adjust_kline.py
T
2024-10-09 11:46:30 +08:00

126 lines
4.3 KiB
Python

"""
Script Name:
Description: 根据yahoo提供的不复权数据,和分红及拆股数据,来计算前复权和后复权数据。
注意:
结果对不上!
按照yahoo规则,不复权数据已经处理了拆股,所以只要把分红加上去就行,但处理结果与它返回的前复权数据,仍然对不对上!
有些比如AAPL,差不多可以对得上;但对于KDP等,差异甚大,找不到原因。。
所以,这个程序暂时无法使用。。。
Author: [Your Name]
Created Date: YYYY-MM-DD
Last Modified: YYYY-MM-DD
Version: 1.0
Modification History:
- YYYY-MM-DD [Your Name]:
- YYYY-MM-DD [Your Name]:
- YYYY-MM-DD [Your Name]:
"""
import pymysql
import pandas as pd
import logging
import os
import time
import config
# 设置日志
filename = os.path.splitext(os.path.basename(__file__))[0]
config.setup_logging(f"./log/{filename}.log")
logger = logging.getLogger()
# 数据库连接函数
def connect_to_db():
return pymysql.connect(**config.db_config)
# 读取 sp500 表中的所有行,获取 code 和 name
def fetch_sp500_codes(connection):
query = "SELECT code, code_name as name FROM sp500 "
return pd.read_sql(query, connection)
# 读取 sp500_his_kline_none 表中的数据并按 time_key 降序排列
def fetch_sp500_his_kline_none(connection, code):
query = f"SELECT * FROM sp500_his_kline_none WHERE code = '{code}' ORDER BY time_key DESC"
return pd.read_sql(query, connection)
# 将计算结果插入到 sp500_ajust_kline_202410 表中
def insert_adjusted_kline_data(connection, data):
try:
with connection.cursor() as cursor:
insert_query = """
INSERT INTO sp500_ajust_kline_202410 (code, name, time_key, hfq_open, hfq_close, qfq_open, qfq_close, none_open, none_close)
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)
ON DUPLICATE KEY UPDATE
hfq_open = VALUES(hfq_open),
hfq_close = VALUES(hfq_close),
qfq_open = VALUES(qfq_open),
qfq_close = VALUES(qfq_close),
none_open = VALUES(none_open),
none_close = VALUES(none_close)
"""
cursor.executemany(insert_query, data)
connection.commit()
except Exception as e:
logger.error(f"Error inserting data: {e}")
# 计算前复权和后复权的价格,并插入到 sp500_ajust_kline_202410
def process_and_insert_adjusted_kline(connection, code, name, result_none):
dividends_qfq = 0
dividends_hfq = 0
dividends_total = result_none['dividends'].sum()
adjusted_data = []
for index, row in result_none.iterrows():
# 计算前复权和后复权的开盘价和收盘价
qfq_close = row['close'] - dividends_qfq
qfq_open = row['open'] - dividends_qfq
hfq_close = row['close'] + dividends_hfq
hfq_open = row['open'] + dividends_hfq
adjusted_data.append((
row['code'], row['name'], row['time_key'],
hfq_open, hfq_close, qfq_open, qfq_close,
row['open'], row['close']
))
dividends_qfq += row['dividends']
dividends_hfq = dividends_total - dividends_qfq
# 插入到 sp500_ajust_kline_202410 表中
insert_adjusted_kline_data(connection, adjusted_data)
logger.info(f"Successfully processed and inserted data for code {code}")
# 主函数
def main():
try:
connection = connect_to_db()
# 读取 sp500 表中的所有行,得到 code 和 name 字段
sp500_codes = fetch_sp500_codes(connection)
for index, row in sp500_codes.iterrows():
code = row['code']
name = row['name']
logger.info(f"Processing data for code: {code}, name: {name}")
# 读取 sp500_his_kline_none 表中的数据并按 time_key 降序排列
result_none = fetch_sp500_his_kline_none(connection, code)
if result_none.empty:
logger.warning(f"No data found for code: {code}")
continue
# 处理并插入调整后的 K 线数据
process_and_insert_adjusted_kline(connection, code, name, result_none)
except Exception as e:
logger.error(f"Error occurred: {e}")
finally:
if connection:
connection.close()
if __name__ == "__main__":
main()