首页 > 编程语言 >小市值选股策略代码分享(附python源码)

小市值选股策略代码分享(附python源码)

时间:2023-12-01 20:12:06浏览次数:62  
标签:api python m6 源码 context 选股 import data today

小市值选股策略的核心在于通过综合分析公司的基本面、行业定位、财务健康状况以及市场趋势,

来寻找那些被市场低估但具备显著成长潜力的股票,同时也要重视风险管理和投资组合的多样化。

 

今天来给大家分享下小市值策略代码如下:

# 显式导入 BigQuant 相关 SDK 模块
from bigdatasource.api import DataSource
from bigdata.api.datareader import D
from biglearning.api import M
from biglearning.api import tools as T
from biglearning.module2.common.data import Outputs

import pandas as pd
import numpy as np
import math
import warnings
import datetime

from zipline.finance.commission import PerOrder
from zipline.api import get_open_orders
from zipline.api import symbol

from bigtrader.sdk import *
from bigtrader.utils.my_collections import NumPyDeque
from bigtrader.constant import OrderType
from bigtrader.constant import Direction

# <aistudiograph>

# @param(id="m6", name="initialize")
# 交易引擎:初始化函数,只执行一次
def m6_initialize_bigquant_run(context):
#读取数据
context.ranker_prediction = context.options['data'].read_df()
context.ranker_prediction.set_index('date',inplace=True)

#print(context.ranker_prediction)
# @param(id="m6", name="before_trading_start")
# 交易引擎:每个单位时间开盘前调用一次。
def m6_before_trading_start_bigquant_run(context, data):
# 盘前处理,订阅行情等
pass

# @param(id="m6", name="handle_tick")
# 交易引擎:tick数据处理函数,每个tick执行一次
def m6_handle_tick_bigquant_run(context, tick):
pass

# @param(id="m6", name="handle_data")
# 交易引擎:bar数据处理函数,每个时间单位执行一次
def m6_handle_data_bigquant_run(context, data):


#context = 回测引擎
#context内部 会有一些功能~ 是通过 context.xxx 来使用的
#data

#调仓期的控制
remainder = context.trading_day_index % 5
#如果没到调仓期直接结束运行
if remainder !=0:
return

import datetime
#初始化
buy_list = [] #买入列表
sell_list = [] #卖出列表

#==================== 数据准备
today = data.current_dt.strftime('%Y-%m-%d') #读取当天日期
time = data.current_dt

account_pos = context.get_account_positions()
holding_list = list({key: value for key, value in account_pos.items() if value.avail_qty > 0}.keys())
holding_num = len(holding_list)

#读取当日数据
try:
today_data = context.ranker_prediction.loc[today,:]
today_data.reset_index(inplace=True)
except:
return

#策略
today_data=today_data[today_data['上市时间'] >= 365] #上市时间的过滤
today_data=today_data[today_data['市盈率ttm'] >= 0] #财务数据过滤
today_data=today_data[today_data['换手排名'] <= 0.4]
today_data.sort_values(by='市值',ascending=True,inplace=True) #市值排序

#构建目标列表
target_list = today_data.instrument.to_list()[:10]

#构建卖出列表
for ins in holding_list:
if ins not in target_list:
sell_list.append(ins)

#构建买入列表
for ins in target_list:
if ins not in holding_list:
buy_list.append(ins)

#先卖
for ins in sell_list:
context.order_target(ins,0)

#等权买
for ins in buy_list:
context.order_target_percent(ins,0.025)

# @param(id="m6", name="handle_trade")
# 交易引擎:成交回报处理函数,每个成交发生时执行一次
def m6_handle_trade_bigquant_run(context, trade):
pass

# @param(id="m6", name="handle_order")
# 交易引擎:委托回报处理函数,每个委托变化时执行一次
def m6_handle_order_bigquant_run(context, order):
pass

# @param(id="m6", name="after_trading")
# 交易引擎:盘后处理函数,每日盘后执行一次
def m6_after_trading_bigquant_run(context, data):
pass


# @module(position="-85,-19", comment='', comment_collapsed=True)
m1 = M.instruments.v2(
start_date=T.live_run_param('trading_date', '2023-01-01'),
end_date=T.live_run_param('trading_date', '2023-11-20'),
market='CN_STOCK_A',
instrument_list='',
max_count=0
)

# @module(position="450,-27", comment='', comment_collapsed=True)
m2 = M.input_features.v1(
features="""
#构建一个因子。 open-close的绝对值
市值=market_cap_0
市盈率ttm=pe_ttm_0
上市时间=list_days_0
换手排名=rank_turn_0
净利润=fs_net_income_0
每股收益=fs_eps_0
净利润=fs_net_income_0"""
)

# @module(position="212,97", comment='', comment_collapsed=True)
m3 = M.general_feature_extractor.v7(
instruments=m1.data,
features=m2.data,
start_date='',
end_date='',
before_start_days=90
)

# @module(position="228,205", comment='', comment_collapsed=True)
m4 = M.derived_feature_extractor.v3(
input_data=m3.data,
features=m2.data,
date_col='date',
instrument_col='instrument',
drop_na=True,
remove_extra_columns=True,
user_functions={}
)

# @module(position="189,315", comment='', comment_collapsed=True)
m5 = M.chinaa_stock_filter.v1(
input_data=m4.data,
index_constituent_cond=['全部'],
board_cond=['上证主板', '深证主板', '创业板', '科创板'],
industry_cond=['全部'],
st_cond=['正常'],
delist_cond=['非退市'],
output_left_data=False
)

# @module(position="82,446", comment='', comment_collapsed=True)
m6 = M.hftrade.v2(
instruments=m1.data,
options_data=m5.data,
start_date='',
end_date='',
initialize=m6_initialize_bigquant_run,
before_trading_start=m6_before_trading_start_bigquant_run,
handle_tick=m6_handle_tick_bigquant_run,
handle_data=m6_handle_data_bigquant_run,
handle_trade=m6_handle_trade_bigquant_run,
handle_order=m6_handle_order_bigquant_run,
after_trading=m6_after_trading_bigquant_run,
capital_base=1000000,
frequency='daily',
price_type='真实价格',
product_type='股票',
before_start_days='0',
volume_limit=1,
order_price_field_buy='close',
order_price_field_sell='open',
benchmark='000300.HIX',
plot_charts=True,
disable_cache=False,
replay_bdb=False,
show_debug_info=False,
backtest_only=False
)
# </aistudiograph>

 

以上是一个简洁的小市值策略代码模板,您可以根据需求自行调整参数,以实现更高的收益。 另外,您还可以前往BigQuant量化平台进行策略回测和效果评估。    小市值选股策略不仅仅是寻找被低估的股票,更是一个综合考虑公司潜力、财务健康状况、市场估值和宏观经济因素的过程, 同时需要投资者具备敏锐的市场洞察力、稳健的风险管理能力和长期的投资视角。    

标签:api,python,m6,源码,context,选股,import,data,today
From: https://www.cnblogs.com/bigquant/p/17870423.html

相关文章

  • 无涯教程-Python - 时间序列(Time)
    时间序列(TimeSeries)是一系列数据点,其中每个数据点都与时间戳关联,一个简单的示例是在给定的一天中,股票在不同时间点的价格,另一个示例是该地区一年中不同月份的降雨量。在下面的示例中,无涯教程以特定股票代码每天四分之一的股价价格为示例,将这些值捕获为一个csv文件,然后使用pan......
  • ESP32简单实现新版HC-SR04超声波模块(MicroPython+Thonny)
    一、新版HC-SR04简介新版HC-SR04,性能远超老版HC-SR04,US-015;在测距精度高于老版HC-SR04和US-015的情况下,测距范围更远,可达6米,远超一般超声波测距模块。采用CS-100A超声波测距SOC芯片,高性能,工业级,宽电压、低价格,成本击穿底价,只有普通超声波测距模块一半的价格,而性能远超普通超声波......
  • python循环与字符串
    循环与字符串循环for循环与范围defsumfromton(m,n):total=0forxinrange(m,n+1):#注意:range(x,y)是左闭右开区间,包含x,不包含ytotal+=xreturntotaldefsumfromton(m,n):returnsum(range(m,n+1))结果相同range(m,n,k)第一个参数m指起始范围第二个参数n指终......
  • kprobes源码走读
    粗略看了下kernel/kprobes.c下的register_kprobe方法。逻辑:调用kprobe_addr方法来根据symbol或者addr+offset来获取需要劫持的地址,symbol和addr不能同时设置,symbol是利用kprobe_lookup_name->kallsyms_lookup_name来查找内核中的符号地址。检查这个kprobe是否重注册了?......
  • 供应链安全情报 | 恶意py包伪装代理SDK进行后门攻击,目标锁定python开发者
    概述2023年11月28号,悬镜供应链安全实验室在Pypi官方仓库(https://pypi.org)监测到两起伪装成http和socks5代理SDK的开源组件投毒事件。python开发者一旦下载安装这些投毒Py包(libproxy、libsocks5),会触发执行Py包中的恶意代码,最终将导致开发者系统被投毒者植入恶意后门。这些恶意Py......
  • python开发之个微机器人的二次开发
    简要描述:登录E云平台请求URL:http://域名地址/member/login域名地址+开发者账号密码:后台系统自助开通请求方式:POST请求头Headers:Content-Type:application/json参数:参数名必选类型说明account是string开发者账号password是string开发者密码返......
  • python开发之个微机器人开发
    简要描述:取消消息接收请求URL:http://域名地址/cancelHttpCallbackUrl请求方式:POST请求头Headers:Authorization:login接口返回Content-Type:application/json无参数返回数据:参数名类型说明codestring1000成功,1001失败msgstring反馈信息成功返回示例{"message":"成功","code......
  • Python中的惰性导入/懒导入/动态导入(Lazy Import)
    参考资料:https://cloud.tencent.com/developer/article/2204701https://github.com/huggingface/diffusers想研究这个lazyimport的起因是:我想学习一下高级的算法工程师是如何构建一个pip包的,然后我发现在diffusers这个广泛使用的huggingface包的组织方式中出......
  • python--循环和字符串
    Task5和6循环和字符串for循环和循环范围for循环的特点基于特定的范围,重复执行规定次数的操作deff(m,n):total=0foriinrange(m,n+1):total+=ireturntotalf(5,10)计算机会计算5+6+7+8+9+10最后输出计算结果range()函数需要注意的是这个范围是......
  • Python日志库Loguru教程
    标题Python日志库Loguru教程(最人性化的Python日志模块)1.What:我们需要一个什么样的日志库可以区分不同类型的日志:正常,警告,错误,严重。可以配置指定的日志文件名称。可以配置指定的日志格式。可以把不同的日志类型写到不同的文件中。可以配置按照时间,文件大小等条件对日志文......