【发布时间】:2021-01-19 22:38:54
【问题描述】:
我在这里需要一些逻辑方面的帮助。我正在使用 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)
【问题讨论】:
-
在代码循环通过ticker_list时将过滤器应用于sql2。