差不多是去年中旬,京东上线了一个股票量化平台,当然现在有很多这样的平台了(joinquant,uqer 等等),京东比他们多的一个优势就是,多提供了京东平台的大数据,这些销售数据可以间接反映出部分企业的市场数据。
最近,一行三会联手金融反腐,试图把投资者逼回价值投资的轨道,那么什么是价值投资呢,大多数人对企业的财务信息不甚了了,没兴趣也看不懂企业那些财务报表(大多数都是造假的数据),怎么在几千只股票中寻找到有价值的企业呢?
下面这段程序是一个小市值的选股策略,开发语言是python,京东也提供了java的支持,不过我还是较喜欢python的简洁,基本思路是,选取中小板中市现率为正的股票,若rsi 指数出现 向上穿插则买入,若上证50指数和中正指数同时回落,则平仓,交易时间为收盘前10分钟。
文章仅提供一个思路,我已添加注释,若对文章中出现的财务指标,技术指标,函数不清楚的,请自行学习,不要问我,因为我没时间回答你。。。
量化策略交易,不可证伪,客官请自重。
import numpy as np
import pandas as pd
import talib
#初始化函数
def init(context):
#滑点默认值为2‰
context.set_slippage(0.002)
#交易费默认值为0.25‰
context.set_commission(0.00025)
context.t=1.01
#000985.SH 中证全指 中证全指指数 由剔除掉ST、*ST、暂停上市股票,以及上市时间不足3个月等股票后的剩余沪深A股股票构成样本股。
context.zzind='000985.SH'
# 000016.SH 上证50 上证50指数 挑选沪市规模大、流动性好的最具代表性的50只股票组成样本股,以综合反映沪市最具市场影响力的一批龙头企业的整体状况。
context.szind = '000016.SH'
#399333.SZ 中小板R 中小板指数(收益) 指数样本与中小板100P相同
context.zxind = '399333.SZ'
task.daily(handle, time_rule=market_close(minute=10))
#选股函数
def stockSelsel(date):
# pcf_ratio_ocfttm 市现率(PCF,经营现金流TTM) 每股市价为过去12个月每股经营性现金流的倍数 市现率(PCF,经营现金流TTM)= (在指定交易日期的最新收盘价*当日人民币外汇牌价×截至当日公司总股本)/经营活动产生的现金流量(TTM) =总市值/连续四个季度的经营现金流;连续四季度:当期+(上年年报-上年同期)
p = query(
fundamentals.equity_valuation_indicator.pcf_ratio_ocfttm
).filter(
fundamentals.equity_valuation_indicator.pcf_ratio_ocfttm > 0
).order_by(
fundamentals.equity_valuation_indicator.market_cap_2.asc()
).limit(20)
# get_fundamentals 财务数据选股 返回DataFrame对象
# dropna 返回一个仅含非空数据和索引值的 Series
df = get_fundamentals(p , date); df=df.dropna(axis=1)
return df.columns.values
def rsi(s,date):
#返回30天的股票价格散列数据
d = get_history(30, '1d', 'close')[s]
d = d.values;
#计算RSi值
rsi6 = talib.RSI(d, timeperiod=6);rsi12=talib.RSI(d, timeperiod=12);rsi24=talib.RSI(d, timeperiod=24)
return [rsi6[-1],rsi12[-1],rsi24[-1]]
def handle(context, data_dict):
date = context.now
#get_index_constituents 获取指数成份股
sl = get_index_constituents(context.zzind)
#取指标成分股过去20天的收盘价格
ds1 = get_history(20,'1d','close')[context.zzind].values
ds2 = get_history(20,'1d','close')[context.zxind].values
#data_dict 存储了所选股票TradeData对象的属性 股票实时行情数据信息都存储在该参数中
ps1 = data_dict[context.zzind].last/ds1[0]
ps2 = data_dict[context.zxind].last/ds2[0]
if ps1 < context.t and ps2 < context.t :
for i in context.portfolio.positions.keys():
# 调整持仓到期望的市值,0 即为清仓
order_target_value(i,0)
else:
l = stockSelsel(date)
x=[];xl=[]
for i in l:
if i in sl:
r=rsi(i,date)
try:
if not(r[0]<r[1]<r[2]):
xl.append(i)
except:continue
s=xl
#portfolio_value 当前持仓投资组合的总共价值,包含剩余现金与市场价值
mv = context.portfolio.portfolio_value
ss=[]
for i in s:
if i not in context.portfolio.positions.keys():
ss.append(i)
for i in ss:
order_target_value(i,mv/len(ss))