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