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

126 lines
4.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
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()