为何分钟级别策略,模拟交易不能输出数据?感谢解答

用户头像mx_***0176tk
2024-04-26 发布

大佬们,首先感谢回答。我附上了代码分享学习,为啥分钟级别的模拟交易,我约定的10:05执行策略,是不是因为平台数据的问题,在中午的时候才能输出数据结果,这样子就影响了交易,截图的日期是26号11点,当天的数据没有。25号数据是中午后才发现它更新了。十分感谢回答!

c5e57706967f774cd5499aab726acf1a.png

import pandas as pd
import numpy as np
import datetime
from pandas.tseries.offsets import BDay
import talib

初始化函数

def init(context):
context.n = 4 # 最大持股数
set_benchmark('000300.SH')
run_daily(trade, time_rule='after_open', hours=0, minutes=34)

def trade(context, bar_dict):
tdate = get_datetime().strftime("%Y%m%d") # 现在时间ymd
tdate1 = get_datetime().strftime("%Y%m%d %H:%M") # 现在时间 ymdhm
minute_earlier_1 = (get_datetime() - datetime.timedelta(minutes=1)).strftime("%Y%m%d %H:%M") # 现在时间前一分钟
current_date = pd.Timestamp(tdate)
previous_trading_day = current_date - BDay(1)
time = get_all_trade_days()
while previous_trading_day not in time:
previous_trading_day -= BDay(1)
last_date = previous_trading_day.strftime("%Y%m%d") # 上一个交易日时间
today_datetime = datetime.datetime.strptime(tdate, "%Y%m%d")

时间设定

stock_list = get_all_securities("stock", last_date) # 获取全部股票
stock_list = stock_list[(today_datetime - stock_list.start_date) > datetime.timedelta(250)].index.values # 上市日期大于250日
stock_list = list(set(stock_list))
stock_list = fun_remove_st(stock_list, tdate) # 去掉ST
stock_list = fun_shizhisx(stock_list, last_date, 6000000000, 800000000000) # 市值条件
stock_list = fun_remove_periodic_industry(stock_list, last_date) # 去除房地产行业
stock_list = fun_volume(stock_list, tdate) # 成交量前三分之一
a = 100
b = 0.005
stock_list = fun_dde_100(stock_list, tdate, last_date, a, b) # 大单净量降序前a,且dde除以流通市值大于b
print('大单净量降序前{0},且dde除以流通市值大于{1}:'.format(a ,b),stock_list)
stock_list = fun_jiangdiefu(stock_list, tdate, last_date)
print('符合全部条件:',stock_list)
context.stock_list = stock_list

去掉ST

def fun_remove_st(stock_list, tdate):

获取股票的is_paused信息

end_date = datetime.datetime.strptime(tdate + ' 09:31', '%Y%m%d %H:%M').strftime('%Y%m%d %H:%M')
stocks_data = get_price(stock_list, start_date=None, end_date=end_date, fre_step='1m', fields=['is_paused'],skip_paused=False, fq='pre', bar_count=1, is_panel=0)
non_paused_stocks = [stock for stock, data in stocks_data.items() if data['is_paused'].iloc[-1] == 0.0]
return non_paused_stocks

市值条件

def fun_shizhisx(stock_list, last_date, xiaxian, shangxian):
q = query(valuation.symbol, asharevalue.float_mv
).filter(asharevalue.float_mv >= xiaxian, asharevalue.float_mv <= shangxian
, valuation.symbol.in_(stock_list))
value = get_fundamentals(q, date=last_date)
return list(value['valuation_symbol'].values)

去除房地产行业

def fun_remove_periodic_industry(stock_list, last_date):
periodic_industry = ['T1801']
for industry in periodic_industry:
stocks = get_industry_stocks(industry, last_date)
stock_list = list(set(stock_list).difference(set(stocks)))
return stock_list

成交量前三分之一

def fun_volume(stock_list, tdate):
end_time = datetime.datetime.strptime(tdate + ' 10:00', '%Y%m%d %H:%M').strftime('%Y%m%d %H:%M')
start_time = datetime.datetime.strptime(tdate + ' 09:30', '%Y%m%d %H:%M').strftime('%Y%m%d %H:%M')

假设 get_price 返回的是一个字典

values = get_price(stock_list, start_date=start_time, end_date=end_time, fre_step='30m', fields=['volume'], skip_paused=False, fq='pre', bar_count=0, is_panel=False)

初始化一个空的 DataFrame 用于存储所有股票的成交量总和

volume_sum_df = pd.DataFrame(columns=['symbol', 'volume_sum'])

遍历字典,计算每个股票的成交量总和,并添加到 volume_sum_df

for symbol, data in values.items():
volume_sum = data['volume'].sum()
volume_sum_df = volume_sum_df.append({'symbol': symbol, 'volume_sum': volume_sum}, ignore_index=True)

对股票按成交量进行排序

sorted_stocks = volume_sum_df.sort_values(by='volume_sum', ascending=False)

选出成交量最高的前1/3的股票代码

top_third = int(len(sorted_stocks) / 3)
selected_stocks = sorted_stocks.head(top_third)['symbol'].tolist()
return selected_stocks

大单净量降序前n,且dde除以流通市值大于1%

def fun_dde_100(stock_list, tdate, last_date, shuliang, baifenbi):
end_time = datetime.datetime.strptime(tdate + ' 10:00', '%Y%m%d %H:%M').strftime('%Y%m%d %H:%M')
start_time = datetime.datetime.strptime(tdate + ' 09:30', '%Y%m%d %H:%M').strftime('%Y%m%d %H:%M')

获取资金流向信息

money_flow_data = get_money_flow_step(stock_list, start_date=start_time, end_date=end_time, fre_step='30m', fields=['l_net_value'], count=None, is_panel=False)

创建一个DataFrame来存储资金流向总和

money_flow_sum_df = pd.DataFrame(columns=['symbol', 'money_flow'])
for symbol, data in money_flow_data.items():
money_flow_sum = data['l_net_value'].sum()
money_flow_sum_df = money_flow_sum_df.append({'symbol': symbol, 'money_flow': money_flow_sum}, ignore_index=True)

对股票按资金流向进行排序,并选取前N名

sorted_stocks = money_flow_sum_df.sort_values(by='money_flow', ascending=False)
top_100_stocks = sorted_stocks.head(shuliang)

获取市值信息

valuation_data = pd.DataFrame()
for stock_code in top_100_stocks['symbol']:
q = query(valuation.symbol, asharevalue.float_mv).filter(valuation.symbol == stock_code)
stock_valuation_data = get_fundamentals(q, date=last_date)
valuation_data = pd.concat([valuation_data, stock_valuation_data])

合并资金流向和市值信息

merged_data = pd.merge(top_100_stocks, valuation_data, left_on='symbol', right_on='valuation_symbol')

计算 l_net_value 和 float_mv 的比例

merged_data['money_flow_ratio'] = merged_data['money_flow'] *100000000/ merged_data['asharevalue_float_mv']

筛选出比例大于N%的股票

selected_stocks = merged_data[merged_data['money_flow_ratio'] > baifenbi]

返回筛选后的股票代码列表

return selected_stocks['symbol'].tolist()

def fun_jiangdiefu(stock_list, tdate, last_date):
minute_earlier_1 = (get_datetime() - datetime.timedelta(minutes=1)).strftime("%Y%m%d %H:%M") # 现在时间前一分钟
start_time = datetime.datetime.strptime(tdate + ' 09:30', '%Y%m%d %H:%M').strftime('%Y%m%d %H:%M')
df = {'securities': [], 'last_date': [], 'date': [], 'change%': []}
for stock in stock_list:
price_data_last_date = get_price(stock, None, end_date=last_date, fre_step='1d', fields=['close'],skip_paused=False, fq='pre', bar_count=1, is_panel=0) # 昨日收盘价
price_data_tdate1 = get_price(stock, None, end_date=minute_earlier_1, fre_step='1m', fields=['close'], skip_paused=False,fq='pre', bar_count=1, is_panel=0) # 上一分钟收盘价
price_data_tdate2 = get_price(stock, start_date=start_time, end_date=minute_earlier_1, fre_step='1m', fields=['close','turnover','volume'], skip_paused=False,fq='pre', bar_count=0, is_panel=0) # 前3个半小时每分钟收盘
close_last_date = price_data_last_date['close'].iloc[-1] # 昨日收盘价
close_tdate1 = price_data_tdate1['close'].iloc[-1] # 上一分钟收盘价
close_tdate2 = price_data_tdate2['close'].max() # 当天最高
close_tdate3 = price_data_tdate2['close'].min() # 当天最低
close_tdate4 = price_data_tdate2['turnover'].sum()
close_tdate5 = price_data_tdate2['volume'].sum()
close_tdate6 = close_tdate4 / close_tdate5 # 当天均价

计算价格变化百分比

change_percent = (close_tdate2 / close_last_date) - 1 # 最高价涨幅
change_percent2 = (close_tdate2 / close_tdate1) - 1 # 最高价回撤
change_percent3 = abs((close_tdate6 / close_tdate1) - 1) # 均价和现价
if change_percent >= 0.01 and change_percent <= 0.06 and change_percent2 <= 0.015 and close_tdate3 >= close_last_date and change_percent3 <=0.015:
df['securities'].append(stock)
df['last_date'].append(close_last_date)
df['date'].append(close_tdate1)
df['change%'].append(change_percent)
stock_list = df['securities']
return stock_list

评论

用户头像
2024-04-30 16:07:53

直接策略分享拷贝啊,这样还得复制代码再去调缩进,浪费时间

评论