求教下,有个股票为什么选不出来呢。

用户头像Faustzwei
2024-09-09 发布

600027。

之前有一些股票选不出来,可以理解成上市时间晚于回测开始日期或者已经退市,600027我看了没停牌,上市时间也早于会,为什么也不行?

import pandas as pd
import numpy as np
from datetime import datetime
from scipy.ndimage import binary_dilation, binary_erosion

设置显示所有列

pd.set_option('display.max_columns', None)

加载交易日历,生成从2005年到2024年8月31日的所有交易日

def load_trading_calendar():
return pd.bdate_range(start='2005-01-01', end='2024-08-31')

准备数据,提取所有股票数据,并计算粘合度

def prepare_data(context):
log.info("Starting prepare_data")

获取所有股票的代码

all_instruments = get_all_securities('stock').index.tolist()
#all_instruments = get_all_securities(types=['stock']).index.tolist()

if not all_instruments:
log.error("无法获取任何股票代码")
else:
log.info(f"成功获取到 {len(all_instruments)} 支股票代码")

分批打印所有股票代码,每行打印10个

for i in range(0, len(all_instruments), 10):
log.info(f"Stocks {i+1}-{i+10}: {all_instruments[i:i+10]}")

检查是否包含特定股票代码,例如 000502

if '000502.XSHE' in all_instruments:
log.info("股票000502存在于数据中")
else:
log.info("股票000502不存在于数据中")
log.info(f"Total number of stocks: {len(all_instruments)}")

获取价格数据

df = get_price(securities=all_instruments, end_date='20240907', fre_step='1d',
fields=['close', 'low', 'high'], fq='pre',
bar_count=8500, is_panel=1, skip_paused=True)

数据处理

df = df.to_frame().reset_index().rename(columns={'major': 'date', 'minor': 'stock'})
df['date'] = pd.to_datetime(df['date'])

仅保留属于交易日历的日期数据

df = df[df['date'].isin(context.trading_calendar)]

检查是否包含000502股票

if '000502' in df['stock'].unique():
log.info("股票000502存在于数据中")
else:
log.info("股票000502不存在于数据中")

log.info(f"Data shape after initial processing: {df.shape}")

对每只股票应用移动平均线计算及粘合度计算

result = df.groupby('stock').apply(lambda x: ma_calculate(x, x['stock'].iloc[0], context.trading_calendar)).reset_index(drop=True)

if 'adhesiveness' not in result.columns:
log.error("'adhesiveness' column not found after ma_calculate")
else:
log.info("'adhesiveness' column successfully created")

log.info(f"Final data shape: {result.shape}")
return result

初始化函数,策略启动时调用

def init(context):
log.info("Starting initialization")

加载交易日历

context.trading_calendar = load_trading_calendar().normalize()
log.info(f"Trading calendar loaded. Sample dates: {context.trading_calendar[:5]}")

设置基准股票

set_benchmark('883421.TI')

打印策略启动信息

log.info('策略开始运行, 初始化函数全局只运行一次')

设置交易费用和滑点

set_commission(PerShare(type='stock', cost=0.0002))
set_slippage(PriceSlippage(0.005))

准备数据并进行分布分析

data = prepare_data(context)
log.info(f"Prepared data shape: {data.shape}")

每个交易日调用一次,用于执行交易策略

def handle_bar(context, bar_dict):

不再输出日志,保持清洁

pass

import pandas as pd
import numpy as np
from datetime import datetime
from scipy.ndimage import binary_dilation, binary_erosion

设置显示所有列

pd.set_option('display.max_columns', None)

加载交易日历,生成从2005年到2024年8月31日的所有交易日

def load_trading_calendar():
return pd.bdate_range(start='2005-01-01', end='2024-08-31')

准备数据,提取所有股票数据,并计算粘合度

def prepare_data(context):
log.info("Starting prepare_data")

获取所有股票的代码

all_instruments = get_all_securities('stock').index.tolist()
#all_instruments = get_all_securities(types=['stock']).index.tolist()

if not all_instruments:
log.error("无法获取任何股票代码")
else:
log.info(f"成功获取到 {len(all_instruments)} 支股票代码")

分批打印所有股票代码,每行打印10个

for i in range(0, len(all_instruments), 10):
log.info(f"Stocks {i+1}-{i+10}: {all_instruments[i:i+10]}")

检查是否包含特定股票代码,例如 000502

if '000502.XSHE' in all_instruments:
log.info("股票000502存在于数据中")
else:
log.info("股票000502不存在于数据中")
log.info(f"Total number of stocks: {len(all_instruments)}")

获取价格数据

df = get_price(securities=all_instruments, end_date='20240907', fre_step='1d',
fields=['close', 'low', 'high'], fq='pre',
bar_count=8500, is_panel=1, skip_paused=True)

数据处理

df = df.to_frame().reset_index().rename(columns={'major': 'date', 'minor': 'stock'})
df['date'] = pd.to_datetime(df['date'])

仅保留属于交易日历的日期数据

df = df[df['date'].isin(context.trading_calendar)]

检查是否包含000502股票

if '000502' in df['stock'].unique():
log.info("股票000502存在于数据中")
else:
log.info("股票000502不存在于数据中")

log.info(f"Data shape after initial processing: {df.shape}")

对每只股票应用移动平均线计算及粘合度计算

result = df.groupby('stock').apply(lambda x: ma_calculate(x, x['stock'].iloc[0], context.trading_calendar)).reset_index(drop=True)

if 'adhesiveness' not in result.columns:
log.error("'adhesiveness' column not found after ma_calculate")
else:
log.info("'adhesiveness' column successfully created")

log.info(f"Final data shape: {result.shape}")
return result

初始化函数,策略启动时调用

def init(context):
log.info("Starting initialization")

加载交易日历

context.trading_calendar = load_trading_calendar().normalize()
log.info(f"Trading calendar loaded. Sample dates: {context.trading_calendar[:5]}")

设置基准股票

set_benchmark('883421.TI')

打印策略启动信息

log.info('策略开始运行, 初始化函数全局只运行一次')

设置交易费用和滑点

set_commission(PerShare(type='stock', cost=0.0002))
set_slippage(PriceSlippage(0.005))

准备数据并进行分布分析

data = prepare_data(context)
log.info(f"Prepared data shape: {data.shape}")

每个交易日调用一次,用于执行交易策略

def handle_bar(context, bar_dict):

不再输出日志,保持清洁

pass

评论

用户头像
2024-09-10 00:41:29

👍

评论
用户头像
2024-09-10 10:01:09

👍

评论
用户头像
mx_****10257回复:Faustzwei
2024-09-10 11:16:48

👍

评论