根據缺口的模式選股買股票,python 學習代碼


# 根據缺口的模式選股買股票
'''
--------------------------------------------
1、總體回測前要做的事情
initialize(context)
1.1、設置策略參數 ----> 全局常量
1.2、設置中間變量 ----> 全局變量
1.3、設置回測條件 ----> JoinQuant額外需要的
2、每天開盤前選股策略 (下面策略,發現這種股,不容錯過)
2.1、設置手續費
2.2、設置可行股票池,比如過濾當日停牌股票
2.3、篩選上市滿一年的全部A股
2.4、篩選上市發生向上缺口的時點
定義為:今日最低價>昨日最高價,刪除漲停的個股
漲幅>5%
2.5、篩選前期盤整階段,比如20-30個交易日,最高價-最低價/最低價<15%或者標准差較少的
2.6、缺口當日成交量 > 前20個交易日平均成交量的50%,也就是15倍以上。
3、每天交易時
3.1、買入/賣出信號判斷
3.2、執行買入/賣出的操作
4、每天收盤

--------------------------------------------
關於什么時候賣?
策略有三,第一個就是設置止盈位。也就是不需要追求最高點賣出。
比如你設置一個從最近高點下滑3%(比例自調)的位置作為賣出點。
第二個就是利用技術分析,看重要的壓力位,一方面是均線系統的壓力,
要看的是日線,周線月線,周期越大,壓力越強,其次是前期的高點,
密集成交區,這個區域是深度套牢區,因此可以暫時止盈。
還有就是識技術指標的圖,比如看MACD頂背離,這個比較准,KDJ超賣等等。
建議多去分析大盤,80%的股票和大盤會保存一樣走勢,大盤觸頂,個股一般也好不到哪去。
第三就是關注基本面,同行對比,分析當前的股價的PE,以及與同行業的公司來看,
比如營業總收入排第幾,凈利潤排第幾,收入增速排第幾,它的總市值排在第幾。
如果基本面排在行業第10,但是市值排在第一,這就表示高估了。可以擇機止盈。

'''


#
import jqdata
import pandas as pd
import datetime as dt
import time

'''
================================================================================
總體回測前
================================================================================
'''
# 初始化函數,設定基准等等
def initialize(context):
print '初始化方法'
set_params() # 設置策略常量
set_variables() # 設置中間變量
set_backtest() # 設置回測條件
print '--------------------------------------'

#1
#設置策略參數
def set_params():
print '設置策略參數'
g.tc = 15 # 調倉天數
g.num_stocks = 10 # 每次調倉選取的最大股票數量

#2
#設置中間變量
def set_variables():
print '設置中間變量'
g.t = 0 # 記錄回測運行的天數
g.if_trade = False # 當天是否交易

#3
#設置回測條件
def set_backtest():
print '設置回測條件'

# 設定滬深300作為基准,就是基准收益
set_benchmark('000300.XSHG')


# 開啟動態復權模式(真實價格)
set_option('use_real_price', True)
# 輸出內容到日志 log.info()
log.info('初始函數開始運行且全局只運行一次')
# 過濾掉order系列API產生的比error級別低的log
# log.set_level('order', 'error')

### 股票相關設定 ###
# 股票類每筆交易時的手續費是:買入時佣金萬分之三,賣出時佣金萬分之三加千分之一印花稅, 每筆交易佣金最低扣5塊錢
set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')

## 運行函數(reference_security為運行時間的參考標的;傳入的標的只做種類區分,因此傳入'000300.XSHG'或'510300.XSHG'是一樣的)
# 開盤前運行
run_daily(before_market_open, time='before_open', reference_security='000300.XSHG')
# 開盤時運行
run_daily(market_open, time='every_bar', reference_security='000300.XSHG')
# 收盤后運行
run_daily(after_market_close, time='after_close', reference_security='000300.XSHG')

log.set_level('order','error') # 設置報錯等級

'''
================================================================================
每天開盤前
================================================================================
2、每天開盤前選股策略 (下面策略,發現這種股,不容錯過)
2.1、設置手續費
2.2、設置可行股票池,比如過濾當日停牌股票
2.3、篩選上市滿一年的全部A股
2.4、篩選上市發生向上缺口的時點
定義為:今日最低價>昨日最高價,刪除漲停的個股
漲幅>5%
2.5、篩選前期盤整階段,比如20-30個交易日,最高價-最低價/最低價<15%或者標准差較少的
2.6、缺口當日成交量 > 前20個交易日平均成交量的50%,也就是15倍以上。
'''
## 開盤前運行函數
def before_market_open(context):
# 輸出運行時間
log.info('函數運行時間(before_market_open):'+str(context.current_dt.time()))

print '----每天開盤前要做的事情----'

set_slip_fee(context) # 設置滑點與手續費
# g.stocks=get_index_stocks('000300.XSHG') # 設置滬深300為初始股票池
g.stocks=get_index_stocks('000002.XSHG') # 設置000002.XSHG全部上市A股
# 設置可行股票池
g.feasible_stocks = set_feasible_stocks(g.stocks,context)


# 給微信發送消息(添加模擬交易,並綁定微信生效)
# send_message('美好的一天~')

# 要操作的股票:平安銀行(g.為全局變量)
# g.security = '000001.XSHE'

#
# 設置可行股票池:過濾掉當日停牌的股票
# 輸入:initial_stocks為list類型,表示初始股票池; context(見API)
# 輸出:unsuspened_stocks為list類型,表示當日未停牌的股票池,即:可行股票池
def set_feasible_stocks(initial_stocks,context):
# 判斷初始股票池的股票是否停牌,返回list
# print '設置可行股票池:過濾掉當日停牌的股票',context.current_dt.day
# print '當前時期%10s' %(context.current_dt.strftime("%Y-%m-%d"))
paused_info = []# 存儲對應股票是否停牌的信息數組
liste_Date_info = []# 存儲對應的上市時間
# 在股票基本信息表 - STK_STOCKINFO能找到
stock_info = get_all_securities(['stock']);


# get_current_data ♠ - 獲取當前時間數據
current_data = get_current_data()
print '打印--',initial_stocks
print '再打印--當前時間數據對象返回是空的',current_data

for i in initial_stocks:
# i是遍歷出來的每個股票的代碼
# 然后paused是判斷這個股票是否停牌,False表示沒有停牌
paused_info.append(current_data[i].paused)

# print '獲取所有股票數據',stock_info[i].start_date
# 如何獲取上市滿一年的股票
# 先獲取所有股票數據 .start_data
# print '當前時期:%10s--股票上市時期:%10s' %(context.current_dt.strftime("%Y-%m-%d"),stock_info.at[i,'start_date'])
# print '當前時期:%10s--股票上市時期' %((stock_info.at[i,'start_date']-context.current_dt).days)
# 存儲上市時間是否滿一年,如果滿一年為YES
isGoPublicOneYear = calculate_goPublick_OneYear(context.current_dt.strftime("%Y-%m-%d"),str(stock_info.at[i,'start_date']))
liste_Date_info.append(isGoPublicOneYear)
if isGoPublicOneYear == False:
print '上市不滿一年的股票%10s:%10s' %(i,stock_info.at[i,'display_name'])


df_paused_public_info = pd.DataFrame({'paused_info':paused_info,'liste_Date_info':liste_Date_info},index = initial_stocks)
# print 'df_paused_public_info:\n',df_paused_public_info
unsuspened_stocks = list(df_paused_public_info.index[(df_paused_public_info.paused_info == False) and (df_paused_public_info.liste_Date_info == True)])

# print '最后獲得的index',unsuspened_stocks


return unsuspened_stocks

# 計算當天交易時間是否為上市時間滿一年
def calculate_goPublick_OneYear(currentTime,goPublicTime):
currentTimeDate = time.strptime(currentTime,"%Y-%m-%d")
y,m,d = currentTimeDate[0:3]

goPublicTimeDate = time.strptime(goPublicTime,"%Y-%m-%d")
y2,m2,d2 = goPublicTimeDate[0:3]

# print (dt.datetime(y,m,d)-dt.datetime(y2,m2,d2)).days

if ((dt.datetime(y,m,d)-dt.datetime(y2,m2,d2)).days)>366:
return True
else:
return False


#5
# 根據不同的時間段設置滑點與手續費
# 輸入:context(見API)
# 輸出:none
def set_slip_fee(context):
print '根據不同的時間段設置滑點與手續費'
# 將滑點設置為0
set_slippage(FixedSlippage(0))
# 根據不同的時間段設置手續費
print '根據不同的時間段設置手續費'
dt=context.current_dt
if dt>datetime.datetime(2013,1, 1):
set_commission(PerTrade(buy_cost=0.0003, sell_cost=0.0013, min_cost=5))

elif dt>datetime.datetime(2011,1, 1):
set_commission(PerTrade(buy_cost=0.001, sell_cost=0.002, min_cost=5))

elif dt>datetime.datetime(2009,1, 1):
set_commission(PerTrade(buy_cost=0.002, sell_cost=0.003, min_cost=5))
else:
set_commission(PerTrade(buy_cost=0.003, sell_cost=0.004, min_cost=5))


'''
================================================================================
每天交易時
================================================================================
'''
## 開盤時運行函數
def market_open(context):
log.info('函數運行時間(market_open):'+str(context.current_dt.time()))
security = g.security
# 獲取股票的收盤價
close_data = attribute_history(security, 5, '1d', ['close'])
# 取得過去五天的平均價格
MA5 = close_data['close'].mean()
# 取得上一時間點價格
current_price = close_data['close'][-1]
# 取得當前的現金
cash = context.portfolio.available_cash

# 如果上一時間點價格高出五天平均價1%, 則全倉買入
if current_price > 1.01*MA5:
# 記錄這次買入
log.info("價格高於均價 1%%, 買入 %s" % (security))
# 用所有 cash 買入股票
# order_value(security, cash)
# 如果上一時間點價格低於五天平均價, 則空倉賣出
elif current_price < MA5 and context.portfolio.positions[security].closeable_amount > 0:
# 記錄這次賣出
log.info("價格低於均價, 賣出 %s" % (security))
# 賣出所有股票,使這只股票的最終持有量為0
# order_target(security, 0)

'''
================================================================================
每天收盤后
================================================================================
'''

## 收盤后運行函數
def after_market_close(context):
log.info(str('函數運行時間(after_market_close):'+str(context.current_dt.time())))
#得到當天所有成交記錄
trades = get_trades()
for _trade in trades.values():
log.info('成交記錄:'+str(_trade))
log.info('一天結束')
log.info('##############################################################')


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM