首页 > 解决方案 > 需要使用 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)

标签: sqlpandaspyodbcta-lib

解决方案


我决定只写分组“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)

推荐阅读