老是报错,不知道是什么原因,用AI改也改不了一直报错
由bq4e1737创建,最终由bq4e1737 被浏览 2 用户
import dai import pandas as pd import numpy as np
# -----------------------财务指标----------------------- # A3:=FINANCE(7)<1600000000; 总股本(股) < 16亿 def filter_a3(total_market_cap): return total_market_cap < 1600000000
# A4:=FINANCE(25)>-160000000; 股东权益 > -1.6亿 def filter_a4(bps_lf): return bps_lf > -160000000
# A5:=FINANCE(9)<47; 流通股比例 < 47% def filter_a5(float_market_cap, total_market_cap): return (float_market_cap / total_market_cap) < 0.47
# A6:=FINANCE(34)>0; 主营收入增长率>0 def filter_a6(operating_revenue_yoy_lf): return operating_revenue_yoy_lf > 0
# A7:=BARSCOUNT(C)>90; 上市时间>90天 def filter_a7(current_date, list_date): return (current_date - list_date).days > 90
# A8:=FINANCE(7)/10000>5000 AND FINANCE(7)/10000<130000; 总股本(万股)在5000万到1.3亿之间 def filter_a8(total_market_cap): total_market_cap_in_wan = total_market_cap / 10000 return (total_market_cap_in_wan > 5000) & (total_market_cap_in_wan < 130000)
# A9:=FINANCE(9)>10; 流通市值>10亿 def filter_a9(float_market_cap): return float_market_cap > 1000000000
# A10:=FINANCE(41)/100000000>50; 总资产>50亿 def filter_a10(total_assets_lf): return (total_assets_lf / 100000000) > 50
# A11:=FINANCE(40)/100000000>10; 净资产>10亿 def filter_a11(bps_lf): return (bps_lf / 100000000) > 10
# ROE:=FINANCE(30)/FINANCE(19)>0.03; ROE>0.03 # roe_avg_lf: 净资产收益率(平均)(最新一期) def filter_roe(roe_avg_lf): return roe_avg_lf > 0.03
# -----------------------资金流指标----------------------- # A1:=DYNAINFO(39)>=10 AND DYNAINFO(39)<=130; 量比>=10 AND 量比<=130 def filter_a1(turn): return (turn >= 10) & (turn <= 130)
# A2:=DYNAINFO(37)>=0.02; 涨速>=0.02 def filter_a2(change_ratio): return change_ratio >= 0.02
# B2:=SUM(DYNAINFO(37),20)/20>0.02; 20日平均涨速>0.02 def filter_b2(change_ratio_list): return np.mean(change_ratio_list) > 0.02
# -----------------------K线指标----------------------- # B1:=C/REF(C,1)>0.985 AND C/REF(C,1) <1.04; 当日涨幅在-1.5%到4%之间 def filter_b1(close, ref_close): return (close / ref_close > 0.985) & (close / ref_close < 1.04)
# B6:=REF(C,1)/REF(C,2)>0.980 AND REF(C,1)/REF(C,2)<1.05; 前一日涨幅在-2%到5%之间 def filter_b6(ref_close_1, ref_close_2): return (ref_close_1 / ref_close_2 > 0.980) & (ref_close_1 / ref_close_2 < 1.05)
# DIFF:=EMA(CLOSE,12)-EMA(CLOSE,26); # DEA:=EMA(DIFF,9); # MACD:=2*(DIFF-DEA); # M4:=REF(DEA,1)-REF(DIFF,1)>0.01; 昨日DEA - 昨日DIFF > 0.01 def filter_m4(dea_yesterday, diff_yesterday): return (dea_yesterday - diff_yesterday) > 0.01
# -----------------------最终筛选----------------------- def final_filter(data, context): # 财务指标 data['total_market_cap'] = data['total_market_cap'].fillna(0) a3_mask = filter_a3(data['total_market_cap']) a4_mask = filter_a4(data['bps_lf']) a5_mask = filter_a5(data['float_market_cap'], data['total_market_cap']) a6_mask = filter_a6(data['operating_revenue_yoy_lf']) # a7_mask = filter_a7(context.current_date, data['list_date']) # 上市时间>90天, 无法直接在SQL实现,在策略中实现 a8_mask = filter_a8(data['total_market_cap']) a9_mask = filter_a9(data['float_market_cap']) a10_mask = filter_a10(data['total_assets_lf']) a11_mask = filter_a11(data['bps_lf']) roe_mask = filter_roe(data['roe_avg_lf'])
# 资金流指标
a1_mask = filter_a1(data\['turn'\])
a2_mask = filter_a2(data\['change_ratio'\])
# b2_mask = filter_b2(data\['change_ratio_list'\]) # 20日平均涨速>0.02 无法直接在SQL实现,在策略中实现
# K线指标
b1_mask = filter_b1(data\['close'\], data\['ref_close'\])
b6_mask = filter_b6(data\['ref_close_1'\], data\['ref_close_2'\])
m4_mask = filter_m4(data\['dea_yesterday'\], data\['diff_yesterday'\])
# 最终筛选
return a1_mask & a2_mask & a3_mask & a4_mask & a5_mask & a6_mask & a8_mask & a9_mask & a10_mask & a11_mask & roe_mask & b1_mask & b6_mask & m4_mask
# -----------------------获取数据----------------------- # 选取需要用到的表,字段 fields = [ 'a.date', 'a.instrument', 'a.close', 'a.turn', 'a.change_ratio', 'b.float_market_cap', 'b.total_market_cap', 'c.bps_lf', 'c.total_assets_lf', 'c.operating_revenue_yoy_lf', 'c.roe_avg_lf' ]
# cn_stock_bar1d a LEFT JOIN cn_stock_valuation b ON a.instrument = b.instrument and a.date = b.date # LEFT JOIN cn_stock_factors_financial_indicators c ON a.instrument = c.instrument and a.date = c.date # 表连接 query = f""" SELECT {",".join(fields)} FROM cn_stock_bar1d a LEFT JOIN cn_stock_valuation b ON a.instrument = b.instrument and a.date = b.date LEFT JOIN cn_stock_factors_financial_indicators c ON a.instrument = c.instrument and a.date = c.date WHERE a.date>='2023-01-01' and a.date<='2023-01-31' """ # 获取数据 data = dai.query(query).df()
# -----------------------计算中间变量----------------------- # 历史数据,用于计算B1, B6, M4 data['ref_close'] = data.groupby('instrument')['close'].shift(1) data['ref_close_1'] = data.groupby('instrument')['close'].shift(1) data['ref_close_2'] = data.groupby('instrument')['close'].shift(2)
# DIFF:=EMA(CLOSE,12)-EMA(CLOSE,26); def calculate_diff(close): ema_12 = close.ewm(span=12, adjust=False).mean() ema_26 = close.ewm(span=26, adjust=False).mean() return ema_12 - ema_26 data['diff'] = data.groupby('instrument')['close'].transform(calculate_diff) # DEA:=EMA(DIFF,9); def calculate_dea(diff): return diff.ewm(span=9, adjust=False).mean() data['dea'] = data.groupby('instrument')['diff'].transform(calculate_dea)
# M4:=REF(DEA,1)-REF(DIFF,1)>0.01; 昨日DEA - 昨日DIFF > 0.01 data['diff_yesterday'] = data.groupby('instrument')['diff'].shift(1) data['dea_yesterday'] = data.groupby('instrument')['dea'].shift(1)
# -----------------------上市时间>90天----------------------- # 获取股票上市时间 list_date_query = """ SELECT instrument, list_date FROM cn_stock_basic_info """ list_date_df = dai.query(list_date_query).df() # 合并到data data = pd.merge(data, list_date_df, on='instrument', how='left') # 上市时间>90天 data['list_date'] = pd.to_datetime(data['list_date']) data['date'] = pd.to_datetime(data['date']) data['is_valid_list_date'] = (data['date'] - data['list_date']).dt.days > 90
# -----------------------最终筛选----------------------- # 传入dataframe, context # 假设context 包含 current_date # from datetime import datetime # context ={"current_date": datetime.now()}
# 使用 final_filter 函数进行筛选 # filtered_data = data[final_filter(data, context)] # print(filtered_data)
print(data)
日志 1 条 ▼
- 您可以去社区论坛问答交流板块反馈咨询 去发帖>> -
- -------------------------------------------------------------------------- InvalidInputException Traceback (most recent call last) Cell In[4], line 134 126 query = f""" 127 SELECT {",".join(fields)} 128 FROM cn_stock_bar1d a (...) 131 WHERE a.date>='2023-01-01' and a.date<='2023-01-31' 132 """ 133 # 获取数据 --> 134 data = dai.query(query).df() 136 # -----------------------计算中间变量----------------------- 137 # 历史数据,用于计算B1, B6, M4 138 data['ref_close'] = data.groupby('instrument')['close'].shift(1) File /var/app/enabled/dai/_telemetry.py:128, in wrapper(*args, **kwargs) File /var/app/enabled/dai/_functions.py:152, in df(self) InvalidInputException: Invalid Input Error: Attempting to execute an unsuccessful or closed pending query result Error: Binder Error: Values list "c" does not have a column named "total_assets_lf" LINE 1: ..., a.change_ratio, b.float_market_cap, b.total_market_cap, c.bps_lf, c.total_assets_lf, c.operating_revenue_yoy_lf,...
\