sql - 需要使用 TA-LIB 和 python、pandas 从 SQL 中的原始数据计算每个股票代码的股票指标
问题描述
我在这里需要一些逻辑方面的帮助。我正在使用 pyodbc 在 SQL 中查询一个表并构建一个数据框,以便使用 ta-lib 来计算技术指标,但发生的是它根据所有股票的运行统计来计算指标,而不是为每个股票做股票代码。因此,对于表中的第一个代码,一切都很好(我将展示一个示例),但是当代码发生变化时,它不会再次开始重新计算。我首先查询该表以将唯一的股票代码列表放入一个数据框中,然后在我的“for”语句中使用该列表,认为它将为每个代码进行计算并在遇到新代码时重新开始。这是我的糟糕结果最终的样子:
你可以看到当它到达 APTV-PA 时,它没有重新开始。如果是,则第一天的 SMA 将超过 100。(从技术上讲,这将是一个空值,因为 SMA 是 30 天移动平均线,所以每个代码的前 29 天应该有空值。这是另一种简单的方法让我告诉它工作不正常。非常感谢任何帮助。谢谢
import pandas as pd
import pyodbc
import talib
from talib import (WILLR,SMA)
path = 'H:\\EOD_DATA_HISTORICAL\\INDICATORS\\MISC\\'
DB_READ = {'servername': 'XYZ\XYZ',
'database': 'olaptraderv4'}
conn = pyodbc.connect('DRIVER={SQL Server};SERVER=' + DB_READ['servername'] + ';DATABASE=' + DB_READ['database'] + ';Trusted_Connection=yes')
sql1 = """
SELECT distinct [Ticker] FROM olaptraderv4.dbo.MiscHistorical order by Ticker
"""
ticker_list = pd.read_sql(sql1, conn)
print(ticker_list)
sql2 = """
SELECT [Ticker], [Date], [Open], [High], [Low], [Close], [Volume] FROM olaptraderv4.dbo.MiscHistorical order by Ticker
"""
df1 = pd.read_sql(sql2, conn)
print(df1.tail(2))
for Ticker in ticker_list:
#df1['WILLR'] = WILLR(df1['High'], df1['Low'], df1['Close'], timeperiod=14).round(3)
df1['SMA'] = SMA(df1['Close'], timeperiod=30).round(3)
df1.to_csv('3.csv', index=False, header=True)
解决方案
我决定只写分组“groupby”子句,然后将 .csv 写入单个文件。这是代码。仅最后 5 行
for Ticker, df1 in df1.groupby('Ticker'):
df1['SMA'] = SMA(df1['Close'], timeperiod=30).round(3)
df1['WILLR'] = WILLR(df1['High'], df1['Low'], df1['Close'], timeperiod=14).round(3)
df1.to_csv(path+'{}.csv'.format(Ticker), mode='w', header=True, index=False, index_label=False)
推荐阅读
- r - 在 r 中另存为 jpeg 时,如何确保绘图不会被截断?
- python - 更新到 Mac OS Catalina、Spyder 3 错误
- java - 如何关闭在方法 JAVA 中打开的扫描仪
- gradle - 在 Gradle 中,api 配置暴露了依赖关系,而实现却没有,这到底意味着什么?
- c# - .net core COM 与 Excel 范围
- r - 使用字符串向量在 R 中循环自定义 ifelse 函数
- firebase - Google Firebase 的计划政策是“每个帐户”还是“每个项目”?
- r - 如何将此列表转换为每行都是单个实体的数据框
- c# - 在指定文化和源时区的同时将“Kind-less”日期时间转换为世界时间
- javascript - 多次调用函数但丢失过去的数据