多週期股價創高營收成長

										
												
# 策略說明:基本面及技術面多因子選股策略,以下是策略的主要條件:
# 一、今日股價創X日新高
# 二、近Y日發生股價創Y日新高
# 三、近Z日發生股價創Z日新高
# 四、近3月平均營收大於A月平均營收
# 五、近5日平均成交量大於近20日平均成交量
# 六、股池為上市 且 剔除KY
# 七、選擇滿足條件下:成交量較大的B個。
# 八、在每個月的最後營收公告截止日換股。
# 九、手續費為C折 ,各個股票張數金額不超過D萬

import numpy as np
import pandas as pd
import kgisuperpy as kgi

person_id = 'A123456789'
person_pwd = '0000'
#simulation可輸入參數True:連線至測試環境;Fales:連線至正式環境
simulation = True

api = kgi.login(person_id ,person_pwd ,simulation)

msmp = api.MSMP
msmp_to_dic = api.MSMP.msmp_to_dic


x=20
y=60
z=120
a=12
b=10
c=3
d=20

BM='0050'
adjclose= msmp.日_K.adj_Close
adjopen= msmp.日_K.adj_Open
adjhigh= msmp.日_K.adj_High
adjlow= msmp.日_K.adj_Low
Open = msmp.日_K.Open
list_STC = msmp.list['tse']
list_KY  = msmp.list['KY']
rev = msmp.月_營收.金額_千
vol = msmp.日_K.Volume

#股數
qty = np.floor(d*10000/(Open*1000))*1000
# 近一日收盤價創近20日新高
con1 = adjclose == adjclose.rolling(x).max()
# 近一季度創最高點的股票
con2 = (adjclose==adjclose.rolling(y).max()).rolling(y).sum()>0
# 近半創最高點的股票
con3 = (adjclose==adjclose.rolling(z).max()).rolling(z).sum()>0
#近3月平均營收大於12月平均營收
con4 = rev.rolling(3).mean() > rev.rolling(a).mean()
# 近5日平均成交量大於近20日平均成交量
con5 = vol.rolling(5).mean() > vol.rolling(20).mean()
# 隔天沒有鎖漲停
con6 = ~((adjlow.shift(-1)>adjclose*1.0947)&(adjhigh.shift(-1)==adjlow.shift(-1)))
buy=con1&con2&con3&con4&con5&con6& (qty!=0)

#標的範圍
buy=buy[buy.columns[buy.columns.isin(list_STC)]]
buy=buy[buy.columns[~buy.columns.isin(list_KY)]]
#取10大
buy=buy*vol
buy=buy.apply(lambda row: row[row!=0].nlargest(b), axis=1).notna().ne(0)
# 回測周期
setday=rev.index_str_to_date().index
buy=buy[buy.index.isin(setday)]
#轉換回測格式
dfX = msmp_to_dic(['qty','sig'],qty , buy)

benchmark= api.Data.get('還原日K(個股、ETF、大盤)-單股單期' ,BM).set_index('日期')['收盤價']
rp=api.backtest(data=dfX,
        symbol='id',
        date='date',
        sig_value='adjclose',
        open_value='adjopen',  open_shift=True,   
        close_value='adjopen', close_shift=True,  
        qty='qty',
        longsig='sig',
        fee = c*0.0001425,
        force_exit= msmp.list['delist'],
        benchmark=benchmark,
        )

										
									
加入我的收藏 複製程式
  • 年化報酬

      +29.5%
  • 夏普值

      1.5
  • 最大虧損

      -20.95%
  • 勝率

      +51.0%
基本面 技術面
看更多

營收成長與PEG低波動篩選策略

										
												
# 策略說明:基本面及技術面多因子選股策略,以下是策略的主要條件:
# 一、近一季月營收均值 > 近一年月營收均值*(1+X%)
# 二、這月營收 > 上月營收*(1+X%)
# 三、融資使用率 < Y%
# 四、entry_volatility < Z% ,entry_volatility = atr/adjclose
# 五、業外營收/營業收入 占比 < A%
# 六、選擇滿足條件下:peg較大的B個,peg =pe/營業利益成長率 。
# 七、在每個月的最後營收公告截止日換股。
# 八、手續費為C折 ,各個股票張數金額不超過D萬

import numpy as np
import pandas as pd
import kgisuperpy as kgi

person_id = 'A123456789'
person_pwd = '0000'
#simulation可輸入參數True:連線至測試環境;Fales:連線至正式環境
simulation = True

api = kgi.login(person_id ,person_pwd ,simulation)

msmp = api.MSMP
msmp_to_dic = api.MSMP.msmp_to_dic


x=10
y=80
z=10
a=50
b=10
c=3
d=20
BM='0050'

adjclose= msmp.日_K.adj_Close
adjopen= msmp.日_K.adj_Open
adjhigh= msmp.日_K.adj_High
adjlow= msmp.日_K.adj_Low
Open = msmp.日_K.Open
list_STC = msmp.list['tse']
rev = msmp.月_營收.金額_千
融資使用率 =msmp.日_融資券.融資使用率

def calculate(window=14 ,high=None, low=None, close=None):
    high = msmp.日_K.adj_High if high is None else high
    low = msmp.日_K.adj_Low if low is None else low
    close = msmp.日_K.adj_Close if close is None else close    
    plus_dm = high.diff()
    minus_dm = low.diff()
    plus_dm = plus_dm.where((plus_dm > minus_dm) & (plus_dm > 0), 0)
    minus_dm = minus_dm.where((minus_dm > plus_dm) & (minus_dm > 0), 0)
    tr = np.maximum.reduce([high - low, abs(high - close.shift()), abs(low - close.shift())])
    tr = pd.DataFrame(tr,columns=adjclose.columns ,index = adjclose.index)
    atr = tr.rolling(window=window).mean()
    plus_di = 100 * (plus_dm.rolling(window=window).mean() / atr)
    minus_di = 100 * (minus_dm.rolling(window=window).mean() / atr)
    dx = 100 * abs(plus_di - minus_di) / (plus_di + minus_di)
    adx = dx.rolling(window=window).mean()
    plus_di.name = "DMI"  
    minus_di.name = "Minus DI"
    return atr ,adx ,plus_di ,minus_di

atr= calculate(10)[0]
entry_volatility = atr/adjclose
業外收支營收率= msmp.季財報_財務指標.業外收支營收率
pe= msmp.日_指標.本益比
營業利益成長率 = msmp.季財報_財務指標.營業利益成長率
peg =pe/營業利益成長率 
setday=rev.index_str_to_date().index

#股數
qty = np.floor(d*10000/(Open*1000))*1000
con1 = rev.rolling(3).mean()/rev.rolling(12).mean()> (1+0.01*x)
con2 = rev/rev.shift(1) > (1+0.01*x)
con3 = 融資使用率<= y
con4 = entry_volatility <= 0.01*z
con5 = 業外收支營收率< a
# 隔天沒有鎖漲停
con6 = ~((adjlow.shift(-1)>adjclose*1.0947)&(adjhigh.shift(-1)==adjlow.shift(-1)))
buy=con1&con2&con3&con4&con5&con6&(qty!=0)

buy=buy[buy.columns[buy.columns.isin(list_STC)]]
buy=(buy*peg).fillna(0).apply(lambda row: row[row > 0].nsmallest(b), axis=1).notna().ne(0)
buy=buy[buy.index.isin(setday)]
#轉換回測格式
dfX = msmp_to_dic(['qty','sig'] ,qty , buy)

benchmark= api.Data.get('還原日K(個股、ETF、大盤)-單股單期' ,BM).set_index('日期')['收盤價']
rp=api.backtest(data=dfX,
        symbol='id',
        date='date',
        sig_value='adjclose',
        open_value='adjopen',  open_shift=True,   
        close_value='adjopen', close_shift=True,  
        qty='qty',
        longsig='sig',
        fee = c*0.0001425,
        force_exit= msmp.list['delist'],
        benchmark=benchmark,
        )

										
									
加入我的收藏 複製程式
  • 年化報酬

      +28.22%
  • 夏普值

      1.8
  • 最大虧損

      -12.99%
  • 勝率

      +52.0%
基本面 技術面
看更多

基本面優良小型成長股

										
												# 策略說明:基本面多因子選股策略,以下是策略的主要條件:
# 一、市值 < X億
# 二、自由現金流 > 0
# 三、股東權益報酬率 > 0
# 四、營業利益成長率 > 0
# 五、交易量 > Z張
# 六、選擇滿足條件下:以A為周期的rsv,選擇rsv較大的B個。
# 七、在每個月的最後營收公告截止日換股。
# 八、手續費為C折 ,各個股票張數金額不超過D萬

import numpy as np
import pandas as pd
import kgisuperpy as kgi

person_id = 'A123456789'
person_pwd = '0000'
#simulation可輸入參數True:連線至測試環境;Fales:連線至正式環境
simulation = True

api = kgi.login(person_id ,person_pwd ,simulation)

msmp = api.MSMP
msmp_to_dic = api.MSMP.msmp_to_dic


x=50
z=300
a=60
b=10
c=3
d=20
BM='0050'

adjclose= msmp.日_K.adj_Close
adjopen= msmp.日_K.adj_Open
adjhigh= msmp.日_K.adj_High
adjlow= msmp.日_K.adj_Low
Open = msmp.日_K.Open
list_STC = msmp.list['tse']
list_KY  = msmp.list['KY']
自由現金流 = msmp.季財報_現金流表_千.自由現金流
股東權益報酬率 = msmp.季財報_財務指標.ROE_稅後權益報酬率
營業利益成長率 = msmp.季財報_財務指標.營業利益成長率

#股數
qty = np.floor(d*10000/(Open*1000))*1000
#市值<p
市值 = msmp.日_K.市值_百萬/100  
con1 = 市值 < x
#自由現金流>0
con2 = 自由現金流 > 0
#股東權益報酬率 > 0
con3 = 股東權益報酬率 > 0
#營業利益成長率 > 0
con4 = 營業利益成長率 > 0
#交易量 > p
vol = msmp.日_K.adj_Volume
con5 =vol > z
# 隔天沒有鎖漲停
con6 = ~((adjlow.shift(-1)>adjclose*1.0947)&(adjhigh.shift(-1)==adjlow.shift(-1)))
buy=con1&con2&con3&con4&con5&con6&(qty!=0)

buy=buy[buy.columns[buy.columns.isin(list_STC)]]
buy=buy[buy.columns[~buy.columns.isin(list_KY)]]
rsv = (adjclose  - adjclose .rolling(a).min()) / (adjclose .rolling(a).max() - adjclose .rolling(a).min())
buy=buy*rsv
buy=buy.apply(lambda row: row[row > 0].nlargest(b), axis=1).notna().ne(0)
rev = msmp.月_營收.金額_千
setday=rev.index_str_to_date().index
buy=buy[buy.index.isin(setday)]
#轉換回測格式
dfX = msmp_to_dic(['qty','sig'],qty , buy)

benchmark= api.Data.get('還原日K(個股、ETF、大盤)-單股單期' ,BM).set_index('日期')['收盤價']
rp=api.backtest(data=dfX,
        symbol='id',
        date='date',
        sig_value='adjclose',
        open_value='adjopen',  open_shift=True,   
        close_value='adjopen', close_shift=True,  
        qty='qty',
        longsig='sig',
        fee = c*0.0001425,
        force_exit= msmp.list['delist'],
        benchmark=benchmark,
        )

										
									
加入我的收藏 複製程式
  • 年化報酬

      +21.58%
  • 夏普值

      1.0
  • 最大虧損

      -32.17%
  • 勝率

      +41.0%
基本面
看更多

營收回升與股價創高

										
												
# 策略說明:基本面及技術面多因子選股策略,以下是策略的主要條件:
# 一、股價創X日新高。
# 二、排除月營收連3月衰退10%
# 三、排除近一年月營收增長50%發生8次以上。
# 四、近月營收脫離近年谷底,達連續Y次。
# 五、連續3月近月營收MOM > Z%
# 六、10日均交易量 > A張
# 七、股池為上市
# 八、選擇滿足條件下:10日均交易量較大的B個。
# 九、在每個月的最後營收公告截止日換股。
# 十、手續費為C折 ,各個股票張數金額不超過D萬

import numpy as np
import pandas as pd
import kgisuperpy as kgi

person_id = 'A123456789'
person_pwd = '0000'
#simulation可輸入參數True:連線至測試環境;Fales:連線至正式環境
simulation = True

api = kgi.login(person_id ,person_pwd ,simulation)

msmp = api.MSMP
msmp_to_dic = api.MSMP.msmp_to_dic


x=60
y=3
z=-40
a=200
b=10
c=3
d=20
BM='0050'

adjclose =msmp.日_K.adj_Close
adjopen =msmp.日_K.adj_Open
adjhigh= msmp.日_K.adj_High
adjlow= msmp.日_K.adj_Low
Open   = msmp.日_K.Open
vol = msmp.日_K.adj_Volume
vol_ma= vol.rolling(10).mean()
rev = msmp.月_營收.金額_千
rev_month_growth = msmp.月_營收.MoM
rev_year_growth = msmp.月_營收.YoY
list_STC = msmp.list['tse']

#股數
qty = np.floor(d*10000/(Open*1000))*1000
# 股價創年新高
con1 = (adjclose == adjclose.rolling(x, min_periods=20).max())
# 排除月營收連3月衰退10%以上&排除近一年漲太多
con2 = ~((rev_year_growth < -10).rolling(3).sum()==3)
con3 = ~((rev_year_growth> 50).rolling(12).sum()>=8)
# 確認營收底部,近月營收脫離近年谷底(連續3月的"單月營收近12月最小值/近月營收" < 0.8)
con4 = ((rev.rolling(12).min()/rev) < 0.8).rolling(y).sum()==y
# 單月營收月增率連續3月大於-40%
con5 = (rev_month_growth > z).rolling(3).sum()==3
# 流動性條件
con6 = vol_ma > a
# 隔天沒有鎖漲停
con7 = ~((adjlow.shift(-1)>adjclose*1.0947)&(adjhigh.shift(-1)==adjlow.shift(-1)))
buy = con1 & con2  & con3 & con4 & con5 & con6 & con7 &(qty!=0)

buy=buy[buy.columns[buy.columns.isin(list_STC)]]
#換股
buy = vol_ma*buy
buy = buy.apply(lambda row: row[row > 0].nsmallest(b), axis=1).notna().ne(0)
#周期
setday=rev.index_str_to_date().index
buy=buy[buy.index.isin(setday)]
#轉換回測格式
dfX = msmp_to_dic(['qty','sig'],qty , buy)

benchmark= api.Data.get('還原日K(個股、ETF、大盤)-單股單期' ,BM).set_index('日期')['收盤價']
rp=api.backtest(data=dfX,
        symbol='id',
        date='date',
        sig_value='adjclose',
        open_value='adjopen',  open_shift=True,   
        close_value='adjopen', close_shift=True,  
        qty='qty',
        longsig='sig',
        fee = c*0.0001425,
        force_exit= msmp.list['delist'],
        benchmark=benchmark,
        )

										
									
加入我的收藏 複製程式
  • 年化報酬

      +19.37%
  • 夏普值

      1.2
  • 最大虧損

      -22.18%
  • 勝率

      +47.0%
基本面 技術面
看更多

上櫃營收短期動能換股策略

										
												
# 策略說明:基本面及技術面多因子選股策略,以下是策略的主要條件:
# 一、近5日内,有發生過還原收盤價創X日新高
# 二、近Y日内高低點振幅在30%以上
# 三、收盤價低於quantile的80%*1.9
# 四、還原收盤價< Z元
# 五、5日均交易量 > A張
# 六、波動率 < B
# 七、營收短期動能大於長期動能
# 八、股池為非上市、非KY、非金融股  
# 九、選擇滿足條件下:價格較低的10檔
# 十、在每個月的最後營收公告截止日換股
# 十一、手續費為C折 ,各個股票張數金額不超過D萬

import numpy as np
import pandas as pd
import kgisuperpy as kgi

person_id = 'A123456789'
person_pwd = '0000'
#simulation可輸入參數True:連線至測試環境;Fales:連線至正式環境
simulation = True

api = kgi.login(person_id ,person_pwd ,simulation)

msmp = api.MSMP
msmp_to_dic = api.MSMP.msmp_to_dic


x=102
y=75
z=100
a=500
b=12
c=3
d=20
BM='0050'

Close= msmp.日_K.Close
adjclose= msmp.日_K.adj_Close
adjopen= msmp.日_K.adj_Open
adjhigh= msmp.日_K.adj_High
adjlow= msmp.日_K.adj_Low
vol=msmp.日_K.Volume
Wadjclose = msmp.週_K.adj_Close

Open   = msmp.日_K.Open
list_STC = msmp.list['tse']
list_KY = msmp.list['KY']
info=api.Data.get('台股產業對照表')
list_金融= info[info.產業名稱.str.contains('金融', na=False)].股票代號
rev= msmp.月_營收.金額_千

bullish_candle = adjclose.diff() >=0
#如果漲
bullish_volatility = abs(adjclose.shift() - adjopen) + abs(adjopen- adjlow) + abs(adjlow - adjhigh) + abs(adjhigh - adjclose)
#如果跌
bearish_volatility = abs(adjclose.shift() - adjopen) + abs(adjopen - adjhigh) + abs(adjhigh -adjlow) + abs(adjlow - adjclose)
#創表格
candle_volatility = adjclose[adjclose<0]
candle_volatility[bullish_candle] = bullish_volatility
candle_volatility[~bullish_candle] = bearish_volatility

if Wadjclose.index[-1].dayofweek==4:
    setday = Wadjclose.index
else:
    setday = Wadjclose.index[:-1]

#股數
qty = np.floor(d*10000/(Open*1000))*1000
# 收盤價近5日至少有1日創收盤價近100日創新
con1 = (adjclose == adjclose.rolling(x).max()).rolling(5).sum()>=1
# 近60日股價高低區間在30%內
con2 = adjlow.rolling(y).min()*1.3 < adjhigh.rolling(y).max()
# 收盤價低於整體市場分級的90%
標準價= Wadjclose.rolling(1000,min_periods=1).quantile(0.8)
con3= adjclose <標準價*1.9
# 收盤價低於100元
con4 = adjclose <= z
# 5日均大於500張
con5 = vol.rolling(5).mean() > a
# k線波動率濾網
volatility = candle_volatility.rolling(20).mean() / adjclose.rolling(20).mean() * 100
con6 = volatility <= b
# 營收短期動能大於長期動能
con7 = rev.rolling(2).mean() > rev.rolling(12).mean()
# 隔天沒有鎖漲停
con8 = ~((adjlow.shift(-1)>adjclose*1.0947)&(adjhigh.shift(-1)==adjlow.shift(-1)))
buy = con1&con2&con3&con4&con5&con6&con7&con8&(qty!=0)


#清單
buy=buy[buy.columns[~buy.columns.isin(list_STC)]]
buy=buy[buy.columns[~buy.columns.isin(list_KY)]]
buy=buy[buy.columns[~buy.columns.isin(list_金融)]]
#換股
buy=buy*adjclose
buy=buy.apply(lambda row: row[row > 0].nsmallest(10), axis=1).notna().ne(0)
#轉換回測格式
buy=buy[buy.index.isin(setday)]
dfX = msmp_to_dic(['qty','sig'],qty , buy)

benchmark= api.Data.get('還原日K(個股、ETF、大盤)-單股單期' ,BM).set_index('日期')['收盤價']
rp=api.backtest(data=dfX,
        symbol='id',
        date='date',
        sig_value='adjclose',
        open_value='adjopen',  open_shift=True,   
        close_value='adjopen', close_shift=True,  
        qty='qty',
        longsig='sig',
        force_exit= msmp.list['delist'],
        benchmark=benchmark,
        fee = c*0.0001425,
        )

										
									
加入我的收藏 複製程式
  • 年化報酬

      +30.26%
  • 夏普值

      1.7
  • 最大虧損

      -22.94%
  • 勝率

      +43.0%
基本面 技術面
看更多

營收成長多因子換股策略

										
												
# 策略說明:多因子選股策略,以下是策略的主要條件:
# 一、短期和中期趨勢都向上的股票
# 二、X個月短期平均營收 > Y個月長期平均營收 
# 三、營業利益率 > Z%
# 四、董監持股比率 > A%
# 五、B張 <交易量 <10000張
# 六、股池為上市 且 剔除KY
# 七、選擇滿足條件下:月營收年增率較大的20個。
# 八、在每個月的最後營收公告截止日換股。
# 九、手續費為C折 ,各個股票張數金額不超過D萬


import numpy as np
import pandas as pd
import kgisuperpy as kgi

person_id = 'A123456789'
person_pwd = '0000'
#simulation可輸入參數True:連線至測試環境;Fales:連線至正式環境
simulation = True

api = kgi.login(person_id ,person_pwd ,simulation)

msmp = api.MSMP
msmp_to_dic = api.MSMP.msmp_to_dic


x=3
y=12
z=1
a=20
b=50
c=3
d=20

BM='0050'
rev_growth_rate = msmp.月_營收.YoY
adjclose= msmp.日_K.adj_Close
adjopen= msmp.日_K.adj_Open
adjhigh= msmp.日_K.adj_High
adjlow= msmp.日_K.adj_Low
Open = msmp.日_K.Open
list_STC = msmp.list['tse']
list_KY  = msmp.list['KY']

#股數
qty = np.floor(d*10000/(Open*1000))*1000
#短期和中期趨勢都向上的股票
sma20 = adjclose.rolling(20).mean()
sma60 = adjclose.rolling(60).mean()
con1= (adjclose > sma20) & (adjclose> sma60)
#x短期營收均量 > y長期營收均量
rev = msmp.月_營收.金額_千
con2= rev.rolling(x).mean() > rev.rolling(y).mean()
#營業利益率 > p
ope_earn = msmp.季財報_財務指標.營業利益率
con3 = ope_earn >= z
#董監持股比率 > p%
boss_hold = msmp.日_三大法人.持股張數_董監/msmp.日_三大法人.發行總張數
con4 = boss_hold >= a*0.01
#成交量 <> p張
vol = msmp.日_K.Volume
con5 = vol > b
con6 = vol < 10000
# 隔天沒有鎖漲停
con7 = ~((adjlow.shift(-1)>adjclose*1.0947)&(adjhigh.shift(-1)==adjlow.shift(-1)))
buy =  con1 & con2 & con3 & con4 & con5 & con6 & con7 & (qty!=0)

#標的範圍
buy=buy[buy.columns[buy.columns.isin(list_STC)]]
buy=buy[buy.columns[~buy.columns.isin(list_KY)]]
#大小,取完為True False
buy=buy*rev_growth_rate
buy=buy.apply(lambda row: row[row>0].nlargest(20), axis=1).notna().ne(0)
#因爲是換股策略,只留下要換股的日期
setday=rev_growth_rate.index_str_to_date().index
buy=buy[buy.index.isin(setday)]
#轉換回測格式
dfX = msmp_to_dic(['qty','sig'],qty , buy)

benchmark= api.Data.get('還原日K(個股、ETF、大盤)-單股單期' ,BM).set_index('日期')['收盤價']
rp=api.backtest(data=dfX,
        symbol='id',
        date='date',
        sig_value='adjclose',
        open_value='adjopen',  open_shift=True,   
        close_value='adjopen', close_shift=True,  
        qty='qty',
        longsig='sig',
        fee = c*0.0001425,
        force_exit= msmp.list['delist'],
        benchmark=benchmark,
        )

										
									
加入我的收藏 複製程式
  • 年化報酬

      +21.02%
  • 夏普值

      1.4
  • 最大虧損

      -21.76%
  • 勝率

      +45.0%
基本面 技術面
看更多

價值成長+股東結構策略

										
												
# 一、score為 2*yoy -1*小股東增加比例
# 二、收盤價 >每股價值 ,且收盤價> X
# 三、本益比 < Y
# 四、yoy前Z (例0.8為前20%) 
# 五、股持為上市 剔除KY,選擇滿足以上條件 ,score前A大的。
# 六、在每個月營收最後公告日進行換股
# 七、每支股票最大開倉金額不多於B萬,手續為C折

import numpy as np
import pandas as pd
import kgisuperpy as kgi

person_id = 'A123456789'
person_pwd = '0000'
#simulation可輸入參數True:連線至測試環境;Fales:連線至正式環境
simulation = True

api = kgi.login(person_id ,person_pwd ,simulation)

msmp = api.MSMP
msmp_to_dic = api.MSMP.msmp_to_dic


x=20
y=20
z=0.8
a=20
b=20
c=3
BM='0050'

股東權益 = 1000*msmp.季財報_資產負債表_千.股東權益_總額
股數 =  1000*msmp.季財報_資產負債表_千.股本/10
adjclose = msmp.日_K.adj_Close
adjhigh = msmp.日_K.adj_High
adjlow = msmp.日_K.adj_Low
Open =msmp.日_K.Open
每股價值 =股東權益/股數
Close =msmp.日_K.Close
yoy =msmp.月_營收.YoY
ls_stc = msmp.list['tse']  
ls_KY = msmp.list['KY']  
pool = sorted([item for item in (ls_stc) if item not in set(ls_KY)])

qty = np.floor(b*10000/(Open*1000))*1000
con1 = Close >每股價值
con2 =  ~((adjlow.shift(-1)>adjclose*1.0947)&(adjhigh.shift(-1)==adjlow.shift(-1)))
con3 = qty != 0
con4 = Close>x
con5 = msmp.日_指標.本益比 < y
con6 = yoy.ge(yoy.quantile(q=z, axis=1), axis=0)
long = con1 &con2 &con3 &con4 &con5 &con6
long = long.loc[:,long.columns.isin(pool)]

score = (
    2 * yoy.rank(axis=1, pct=True) +
    1 * (-msmp.週_大小股東持股.張數1到5_比例.diff()).rank(axis=1, pct=True)
)
pos = score * long
pos = pos.apply(lambda row: row.nlargest(a), axis=1).notna()

index = msmp.INDEX['M']
pos = pos.loc[pos.index.isin(index)]
dic =msmp_to_dic(['qty' ,'pos'],qty ,pos)

benchmark= api.Data.get('還原日K(個股、ETF、大盤)-單股單期' ,BM).set_index('日期')['收盤價']
rp = api.backtest(dic ,symbol ='id',
        date ='date' ,qty ='qty',
        sig_value = 'adjclose',
        open_value = 'adjopen' , open_shift=True,
        close_value = 'adjopen' , close_shift=True,
        longsig = 'pos', 
        benchmark= benchmark,
        fee = 0.0001425*c  )











										
									
加入我的收藏 複製程式
  • 年化報酬

      +20.3%
  • 夏普值

      1.3
  • 最大虧損

      -21.97%
  • 勝率

      +51.0%
基本面 技術面
看更多

穩健盈利優選策略

										
												
# 一、制訂評分為ROE +盈餘報酬率
# 二、條件為近一年ROE標準差<5
# 三、選擇滿足條件,評分前 X大者
# 四、手續費為Y折,各個股票張數金額不超過Z萬

import numpy as np
import pandas as pd
import kgisuperpy as kgi

person_id = 'A123456789'
person_pwd = '0000'
#simulation可輸入參數True:連線至測試環境;Fales:連線至正式環境
simulation = True

api = kgi.login(person_id ,person_pwd ,simulation)

msmp = api.MSMP
msmp_to_dic = api.MSMP.msmp_to_dic


x=50
y=3
z=20

BM='0050'
adjclose = msmp.日_K.adj_Close
adjhigh = msmp.日_K.adj_High
adjlow = msmp.日_K.adj_Low
Open = msmp.日_K.Open
index = msmp.INDEX['Q']
pool = msmp.list['tse']
ROE = msmp.季財報_財務指標.ROE_稅後權益報酬率
adjclose = msmp.日_K.adj_Close
eps =msmp.季財報_損益表_千.eps

qty = np.floor(z*10000/(Open*1000))*1000
盈餘報酬率 = eps.rolling(4).sum()/adjclose *10
隔天沒鎖漲停 = ~((adjlow.shift(-1)>adjclose*1.0947)&(adjhigh.shift(-1)==adjlow.shift(-1)))
ROE_stable = ROE.rolling(4).std() <5
con = (ROE+盈餘報酬率)*(隔天沒鎖漲停&(qty!=0)& ROE_stable)
con = con.loc[con.index.isin(index), con.columns.isin(pool)]
long = con.apply(lambda row: row[row > 0].nlargest(x), axis=1).notna().ne(0)

dic = msmp_to_dic(['qty','longin'], qty, long  )
benchmark= api.Data.get('還原日K(個股、ETF、大盤)-單股單期' ,BM).set_index('日期')['收盤價']
rp = api.backtest(dic, date='date', qty='qty',
            sig_value='adjclose',
            open_value='adjopen' ,open_shift=True,
            close_value ='adjopen',close_shift = True,
            longsig='longin' ,#longout='longout',
            fee = y*0.0001425,
            force_exit= msmp.list['delist'],
            benchmark=benchmark)




										
									
加入我的收藏 複製程式
  • 年化報酬

      +17.61%
  • 夏普值

      1.1
  • 最大虧損

      -21.22%
  • 勝率

      +52.0%
基本面
看更多

低PEG短期營收增長策略

										
												
# 一、短期均營收(X月) > 長期均營收(Y月)*(1+Z%)
# 二、本月營收/上月營收 > A 
# 三、股池為上市,排除KY
# 四、選擇滿足條件下:peg較小的前B個,peg為 本益比/營業利益成長率
# 五、在每個月的最後營收公告截止日換股。
# 六、手續費為C折 ,各個股票張數金額不超過D萬

import numpy as np
import pandas as pd
import kgisuperpy as kgi

person_id = 'A123456789'
person_pwd = '0000'
#simulation可輸入參數True:連線至測試環境;Fales:連線至正式環境
simulation = True

api = kgi.login(person_id ,person_pwd ,simulation)

msmp = api.MSMP
msmp_to_dic = api.MSMP.msmp_to_dic


x=3
y=12
z=10
a=0.9
b=10
c=3
d=20
BM='0050'

adjclose =msmp.日_K.adj_Close
adjopen =msmp.日_K.adj_Open
adjhigh= msmp.日_K.adj_High
adjlow= msmp.日_K.adj_Low
Open   = msmp.日_K.Open
rev=  msmp.月_營收.金額_千
peg =msmp.日_指標.本益比 / msmp.季財報_財務指標.營業利益成長率
list_STC = msmp.list['tse']
list_KY = msmp.list['KY']

#股數
qty = np.floor(d*10000/(Open*1000))*1000
con1= rev.rolling(x).mean()/rev.rolling(y).mean()>(1+0.01*z)
con2= rev/rev.shift()> a
# 隔天沒有鎖漲停
con3 = ~((adjlow.shift(-1)>adjclose*1.0947)&(adjhigh.shift(-1)==adjlow.shift(-1)))
position= con1 &con2 &con3 &(qty!=0)

position=position[position.columns[position.columns.isin(list_STC)]]
position=position[position.columns[~position.columns.isin(list_KY)]]
#換股
position=position*peg
position=position.apply(lambda row: row[row>0].nsmallest(b), axis=1).notna().ne(0)
#周期
setday=rev.index_str_to_date().index
position=position[position.index.isin(setday)]
#轉換回測格式
dfX = msmp_to_dic(['qty','sig'],qty , position)

benchmark= api.Data.get('還原日K(個股、ETF、大盤)-單股單期' ,BM).set_index('日期')['收盤價']
rp=api.backtest(data=dfX,
        symbol='id',
        date='date',
        sig_value='adjclose',
        open_value='adjopen',  open_shift=True,   
        close_value='adjopen', close_shift=True,  
        qty='qty',
        longsig='sig',
        fee = c*0.0001425,
        force_exit= msmp.list['delist'],
        benchmark=benchmark,
        )

										
									
加入我的收藏 複製程式
  • 年化報酬

      +21.83%
  • 夏普值

      1.7
  • 最大虧損

      -17.84%
  • 勝率

      +52.0%
基本面 技術面
看更多

財務保守型選股策略

										
												
# 一、條件為:季新增負債 > 股本*X
# 二、評分score為 新增負債/股本
# 三、股池為上市+上櫃
# 四、選擇滿足條件中,score較小的Y個
# 五、每支股票最大開倉金額不多於A萬,手續為Z折
# 六、止盈為B%

import numpy as np
import pandas as pd
import kgisuperpy as kgi

person_id = 'A123456789'
person_pwd = '0000'
#simulation可輸入參數True:連線至測試環境;Fales:連線至正式環境
simulation = True

api = kgi.login(person_id ,person_pwd ,simulation)

msmp = api.MSMP
msmp_to_dic = api.MSMP.msmp_to_dic


x=0.5
y=20
z=3
a=20
b=30

BM='0050'
debt = msmp.季財報_資產負債表_千.股東權益_總額 
capital = msmp.季財報_資產負債表_千.股本
adjclose = msmp.日_K.adj_Close
adjhigh = msmp.日_K.adj_High
adjlow = msmp.日_K.adj_Low
Open = msmp.日_K.Open
stocklist = msmp.list['otc']+msmp.list['tse']

con1 =(debt - debt.shift(1)) > capital*x
con2 = ~((adjlow.shift(-1)>adjclose*1.0947)&(adjhigh.shift(-1)==adjlow.shift(-1)))
con3 = capital!=0
qty = np.floor(a*10000/(Open*1000))*1000
position=con1&con2&con3&(qty!=0)
position=position.loc[:,position.columns.isin(stocklist)]
position=position.loc[position.index.isin(debt.index_str_to_date().index)]

score = position*debt.diff(1)/capital
position=score.apply(lambda row: row[row > 0].nsmallest(y), axis=1).notna().ne(0)
position = position.loc[:, position.any()]
dic =msmp_to_dic(['qty' ,'pos'],qty ,position)
benchmark= api.Data.get('還原日K(個股、ETF、大盤)-單股單期' ,BM).set_index('日期')['收盤價']
rp = api.backtest(dic ,symbol ='id',date ='date' ,qty ='qty',
            sig_value = 'adjclose',
            open_value = 'adjopen' , open_shift=True,
            close_value = 'adjopen' , close_shift=True,
            longsig = 'pos',
            force_exit= msmp.list['delist'],
            benchmark= benchmark,
            earn=b,
            fee = 0.0001425*z  )



										
									
加入我的收藏 複製程式
  • 年化報酬

      +15.42%
  • 夏普值

      1.2
  • 最大虧損

      -20.30%
  • 勝率

      +55.0%
基本面
看更多

ETF 均線收斂突破策略

										
												
def max_df(*dfs):
    arr = np.stack([df.values for df in dfs])
    result = np.max(arr, axis=0)
    result_df = pd.DataFrame(result, index=dfs[0].index, columns=dfs[0].columns)
    return msmp.DataFrame(result_df)

def min_df(*dfs):
    arr = np.stack([df.values for df in dfs])
    result = np.min(arr, axis=0)
    result_df = pd.DataFrame(result, index=dfs[0].index, columns=dfs[0].columns)
    return msmp.DataFrame(result_df)

# 一、股池為所有 ETF
# 二、前一日的五線最大值(含收盤價、10MA、20MA、50MA、60MA) < 五線最小值的 X% 範圍內
# 三、當日收盤價向上突破昨日五線最大值
# 四、淨利/淨值的排名小於等於 Y
# 五、以上為入場條件,出場條件為: 收盤價已連續 Z日未創Z日新高
# 六、手續費為 B 折 ,股票最大開倉金額不超過 A 萬

import numpy as np
import pandas as pd
import kgisuperpy as kgi

person_id = 'A123456789'
person_pwd = '0000'
#simulation可輸入參數True:連線至測試環境;Fales:連線至正式環境
simulation = True

api = kgi.login(person_id ,person_pwd ,simulation)

msmp = api.MSMP
msmp_to_dic = api.MSMP.msmp_to_dic


x=4
y=50
z=7
a=20
b=3
BM='0050'

info = msmp.INFO
pool = info[info.ETF==1].股票代號.tolist()

Open = msmp.日_K.Open
data = msmp.日_指標.淨利 /msmp.日_指標.淨值
adjclose = msmp.日_K.adj_Close
adjhigh = msmp.日_K.adj_High
adjlow = msmp.日_K.adj_Low
ma1 = adjclose.rolling(10).mean()
ma2 = adjclose.rolling(20).mean()
ma3 = adjclose.rolling(50).mean()
ma4 = adjclose.rolling(60).mean()

df_max = max_df(adjclose ,ma1 ,ma2, ma3 ,ma4)
df_min = min_df(adjclose ,ma1 ,ma2, ma3 ,ma4)

qty = np.floor(a * 10000 / (Open * 1000)) * 1000
con1 = df_max.shift(1) < df_min.shift(1)*(1+0.01*x)
con2 = adjclose >df_max.shift(1)
con3 = ~((adjlow.shift(-1)>adjclose*1.0947)&(adjhigh.shift(-1)==adjlow.shift(-1)))
con4 = data.loc[:,data.columns.isin(pool)].rank(axis=1) <= y
pos = con1 &con2&con3&con4&(qty!=0)
pos = pos.mask(pos==False)
pos = pos.loc[: , pos.columns.isin(pool)]

out = (adjclose > adjclose.shift(1).rolling(z).max()).rolling(z).sum()==0

dic = msmp_to_dic(['qty', 'long' ,'longout'], qty, pos ,out)
benchmark= api.Data.get('還原日K(個股、ETF、大盤)-單股單期' ,BM).set_index('日期')['收盤價']
rp = api.backtest(dic ,
    symbol='id',date='date',qty='qty', sig_value='adjclose',
    open_value='adjopen', open_shift=True,
    close_value='adjopen', close_shift=True,
    longsig='long', longout='longout',
    force_exit= msmp.list['delist'],
    benchmark=benchmark,    fee=0.0001425 * b)


										
									
加入我的收藏 複製程式
  • 年化報酬

      +12.3%
  • 夏普值

      1.8
  • 最大虧損

      -7.29%
  • 勝率

      +52.0%
技術面
看更多

投信加碼買入策略

										
												
# 一、近10天,收盤價下跌10%
# 二、投信比例相比昨日增加 0.1%
# 三、投信持股張數 > X張
# 四、收盤價> Y
# 五、股持為上市 剔除KY
# 六、以上為進場條件,出場條件為:投信比例創10日低點
# 七、移動止損為Z ,手續費為A折 ,每支股票最大開倉金額不多於B萬

import numpy as np
import pandas as pd
import kgisuperpy as kgi

person_id = 'A123456789'
person_pwd = '0000'
#simulation可輸入參數True:連線至測試環境;Fales:連線至正式環境
simulation = True

api = kgi.login(person_id ,person_pwd ,simulation)

msmp = api.MSMP
msmp_to_dic = api.MSMP.msmp_to_dic


x=500
y=20
z=15
a=3
b=100

BM='0050'
adjclose = msmp.日_K.adj_Close
adjhigh = msmp.日_K.adj_High
adjlow = msmp.日_K.adj_Low
Open =msmp.日_K.Open
Close = msmp.日_K.Close
投信持股成本 =msmp.日_三大法人.投信持股成本.ffill()
投信買賣超張數 = msmp.日_三大法人.投信買賣超張數.fillna(0)
投信持股張數 = msmp.日_三大法人.持股張數_投信.ffill()
總張數 = msmp.日_三大法人.發行總張數.ffill()
投信比例 = 100*投信持股張數/總張數

ls_stc = msmp.list['tse'] 
ls_KY = msmp.list['KY']  
pool = sorted([item for item in (ls_stc) if item not in set(ls_KY)])

qty = np.floor(b*10000/(Open*1000))*1000
con1 = adjclose.shift(1)< adjclose.shift(10)*0.9
con2 = 投信比例.diff()>0.1
con3 = 投信持股張數>x
con4 = ~((adjlow.shift(-1)>adjclose*1.0947)&(adjhigh.shift(-1)==adjlow.shift(-1)))
con5 = Close >y 

long = con1 &con2 &con3 &con4 &con5 &(qty!=0)
long = long.loc[:,long.columns.isin(pool)]
long = long.mask(long==False)

longout = 投信比例<投信比例.shift(1).rolling(10).min()
dic =msmp_to_dic(['qty' ,'long' ,'longout'],qty ,long ,longout)
benchmark= api.Data.get('還原日K(個股、ETF、大盤)-單股單期' ,BM).set_index('日期')['收盤價']
rp = api.backtest(dic ,symbol ='id',
        date ='date' ,qty ='qty',
        sig_value = 'adjclose',
        open_value = 'adjopen' , open_shift=True,
        close_value = 'adjopen' , close_shift=True,
        longsig = 'long', 
        moveloss= z,
        force_exit= msmp.list['delist'],
        benchmark= benchmark ,
        fee = 0.0001425*a  )


















										
									
加入我的收藏 複製程式
  • 年化報酬

      +15.57%
  • 夏普值

      1.1
  • 最大虧損

      -17.17%
  • 勝率

      +44.0%
籌碼面
看更多

0050成分股營收虧轉盈

										
												

# 一、股池為0050成分股。
# 二、yoy為月營收年成長,對應日期為下個月10號的最近交易日。
# 三、近Y月至少發生一次 ,yoy > 0 且 上期yoy < 0
# 四、選擇滿足條件YOY較大的X檔股票
# 五、止損為Z% ,各個股票張數金額不超過A萬

import numpy as np
import pandas as pd
import kgisuperpy as kgi

person_id = 'A123456789'
person_pwd = '0000'
#simulation可輸入參數True:連線至測試環境;Fales:連線至正式環境
simulation = True

api = kgi.login(person_id ,person_pwd ,simulation)

msmp = api.MSMP
msmp_to_dic = api.MSMP.msmp_to_dic


x=8
y=3
z=15
a=100
BM='0050'

table=api.Data.get('ETF持股清單','0050')
ls = table[table.標的類型=='股票'].股票代號.tolist()
dic={}
for symbol in ls:
    table1=api.Data.get('日K/技術指標/價量資料-個股多期',symbol)
    df1=table1.set_index('日期')[['開盤價','收盤價','最高價','最低價','成交量']]
    df1.columns=['Open','Close','High','Low','Volume']
    table2 = api.Data.get('還原日K(個股、ETF、大盤)-單股單期',symbol)
    df2 = table2.set_index('日期')[['開盤價','收盤價','最高價','最低價']]
    df2.columns=['adjopen','adjclose','adjhigh','adjlow']
    dic[symbol]= df1.sort_index().join(df2, how='inner')

def convert_to_datetime(date_str):
    year, month = map(int, date_str.split('-M'))
    day = 10
    if month == 12:
        year += 1
        month = 1
    else:
        month += 1
    return pd.Timestamp(year, month, day)

_yoy={}
for symbol in ls:
    table = api.Data.get('月營收/月增率/年增率-個股多期',symbol)
    df= table.set_index('年月')['單月合併營收年成長(%)']
    _yoy[symbol]=df
yoy = pd.DataFrame(_yoy)
yoy.index = [convert_to_datetime(idx) for idx in yoy.index]
benchmark= api.Data.get('還原日K(個股、ETF、大盤)-單股單期' ,BM).set_index('日期')['收盤價']

index_ls = yoy.index
loaded_indices = benchmark.index
insert_indices = np.searchsorted(loaded_indices, index_ls)
yoy.index  = [   loaded_indices[insert_indices[i]] if loaded_indices.min() <= index_ls[i] <= loaded_indices.max()
                else index_ls[i]    for i in range(len(index_ls))]

con = (yoy>0) & (yoy.shift(1)<0)
pos = con.rolling(y).sum()>=1
pos = pos*yoy
map_yoy = pos.where(pos > 0).rank(axis=1, ascending=False, method='first') <= x

dicX = {}
for stockid in dic.keys():
    df = dic[stockid].copy()
    df['sig'] = df.index.map(map_yoy[stockid])
    df['qty'] = np.floor(a*10000/(df.Open*1000))*1000 
    if df.sig.any()!=True:
        continue
    dicX[stockid] = df.reset_index()
    
rp = api.backtest(data=dicX ,
            date='日期',
            sig_value='adjclose',
            open_value='adjopen',    open_shift=True,
            close_value='adjopen',   close_shift=True, 
            qty='qty',
            longsig='sig',
            loss= z,
            benchmark=benchmark,
            )

										
									
加入我的收藏 複製程式
  • 年化報酬

      +18.08%
  • 夏普值

      1.6
  • 最大虧損

      -11.73%
  • 勝率

      +61.0%
技術面
看更多

低估財務成長策略

										
												
# 策略說明:基本面選股策略,以下是策略的主要條件:
# 一、股價淨值比 < X
# 二、稅後權益報酬率 > Y
# 三、資本支出/營運現金流量 <-0.2
# 四、營運現金流量 > A*百萬
# 五、月營收增長率 > Z
# 六、股池為上市、排除KY
# 七、選擇滿足條件下:震蕩幅度較大的B個 
# 八、在每個月的最後營收公告截止日換股。
# 九、手續費為C折 ,各個股票張數金額不超過D萬

import numpy as np
import pandas as pd
import kgisuperpy as kgi

person_id = 'A123456789'
person_pwd = '0000'
#simulation可輸入參數True:連線至測試環境;Fales:連線至正式環境
simulation = True

api = kgi.login(person_id ,person_pwd ,simulation)

msmp = api.MSMP
msmp_to_dic = api.MSMP.msmp_to_dic


x=1.1
y=1
z=0
a=20
b=10
c=3
d=20
BM='0050'

adjclose = msmp.日_K.adj_Close
adjopen = msmp.日_K.adj_Open
adjhigh= msmp.日_K.adj_High
adjlow= msmp.日_K.adj_Low
Open  = msmp.日_K.Open
list_STC = msmp.list['tse']
list_KY = msmp.list['KY']
流動性= msmp.日_K.adj_High/msmp.日_K.adj_Low
股價淨值比 = msmp.日_指標.股價淨值比
roe = msmp.季財報_財務指標.ROE_稅後權益報酬率
資本支出 =msmp.季財報_現金流表_千.資本支出 #負數
營運現金流量 =msmp.季財報_現金流表_千.營運現金流
mom =msmp.月_營收.MoM

#股數
qty = np.floor(d*10000/(Open*1000))*1000
con1=股價淨值比<=x
con2=roe>y
con3= 資本支出/營運現金流量 <-0.2
con4= 營運現金流量*1000 > a*1000000
con5= mom> z
# 隔天沒有鎖漲停
con6 = ~((adjlow.shift(-1)>adjclose*1.0947)&(adjhigh.shift(-1)==adjlow.shift(-1)))
buy=con1&con2&con3&con4&con5&con6&(qty!=0)

buy=buy[buy.columns[buy.columns.isin(list_STC)]]
buy=buy[buy.columns[~buy.columns.isin(list_KY)]]
buy=(buy*流動性).apply(lambda x : x[x>0].nlargest(b) , axis=1).notna().ne(0)
setday=mom.index_str_to_date().index
buy=buy[buy.index.isin(setday)]
#轉換回測格式
dfX = msmp_to_dic(['qty','sig'],qty ,buy)

benchmark= api.Data.get('還原日K(個股、ETF、大盤)-單股單期' ,BM).set_index('日期')['收盤價']
rp=api.backtest(data=dfX,
        symbol='id',
        date='date',
        sig_value='adjclose',
        open_value='adjopen',  open_shift=True,   
        close_value='adjopen', close_shift=True,  
        qty='qty',
        longsig='sig',
        fee = c*0.0001425,
        force_exit= msmp.list['delist'],
        benchmark=benchmark,
        )

										
									
加入我的收藏 複製程式
  • 年化報酬

      +11.09%
  • 夏普值

      0.7
  • 最大虧損

      -15.90%
  • 勝率

      +51.0%
基本面 技術面
看更多

利用ADX篩選強勢股

										
												
# 策略說明:本策略專門追蹤市場中的強勢股票。
# 一、追蹤近幾日的平均成交量,交易量 > X日交易量 *Y倍 。
# 二、股價創 Z日新高。
# 三、今日最低價高於昨日最低價。
# 四、14日的ADX > A。
# 五、大盤或櫃買指數,連續 B日在均線之上。
# 六、股池為上市 且 剔除KY
# 七、止盈為50%止損為10%,以信號隔天的開盤價,開倉及平倉。
# 八、手續費為C折 ,各個股票張數金額不超過D萬

import numpy as np
import pandas as pd
import kgisuperpy as kgi

person_id = 'A123456789'
person_pwd = '0000'
#simulation可輸入參數True:連線至測試環境;Fales:連線至正式環境
simulation = True

api = kgi.login(person_id ,person_pwd ,simulation)

msmp = api.MSMP
msmp_to_dic = api.MSMP.msmp_to_dic


def _calculate(window=14):
    high = msmp.日_K.adj_High 
    low = msmp.日_K.adj_Low 
    close = msmp.日_K.adj_Close 
    plus_dm = high.diff()
    minus_dm = low.diff()
    plus_dm = plus_dm.where((plus_dm > minus_dm) & (plus_dm > 0), 0)
    minus_dm = minus_dm.where((minus_dm > plus_dm) & (minus_dm > 0), 0)
    tr = np.maximum.reduce([high - low, abs(high - close.shift()), abs(low - close.shift())])
    tr = pd.DataFrame(tr,columns=adjclose.columns ,index = adjclose.index)
    atr = tr.rolling(window=window).mean()
    plus_di = 100 * (plus_dm.rolling(window=window).mean() / atr)
    minus_di = 100 * (minus_dm.rolling(window=window).mean() / atr)
    dx = 100 * abs(plus_di - minus_di) / (plus_di + minus_di)
    adx = dx.rolling(window=window).mean()
    plus_di.name = "DMI"  
    minus_di.name = "Minus DI"
    return atr ,adx ,plus_di ,minus_di

x=5
y=2
z=10
a=30
b=3
c=3
d=20
BM='0050'

adjclose= msmp.日_K.adj_Close
adjopen= msmp.日_K.adj_Open
adjhigh= msmp.日_K.adj_High
adjlow= msmp.日_K.adj_Low
Open = msmp.日_K.Open
liststc = msmp.list['tse']
listky  = msmp.list['KY']

#股數
qty = np.floor(d*10000/(Open*1000))*1000
#交易量 > period均 *n
volume =msmp.日_K.Volume
con1= volume > y*volume.rolling(x).mean().shift(1)
#股價 > period max 
con2=  adjclose > adjclose.rolling(z).max().shift(1)
#今日最低價>昨日最低價
con3= adjlow>adjlow.shift(1)
#adx > n
adx = _calculate(14)[1]
con4= adx> a
#大盤或櫃買指數站穩(連續n期)均線之上
stc = msmp.TSE.adj_Close
otc = msmp.OTC.adj_Close
conx= (stc>stc.rolling(5).mean()).rolling(b).sum()==b
cony= (otc>otc.rolling(5).mean()).rolling(b).sum()==b
cony.columns=['TSE']
con5= conx|cony
# 隔天沒有鎖漲停
con6 = ~((adjlow.shift(-1)>adjclose*1.0947)&(adjhigh.shift(-1)==adjlow.shift(-1)))
position = con1&con2&con3&con4&con5&con6&(qty!=0)

#出場
position=position.mask(position==False)
#清單
position= position[position.columns[position.columns.isin(liststc)]]
position= position[position.columns[~position.columns.isin(listky)]]
#轉換回測格式
dfX = msmp_to_dic(['qty','sig'],qty ,position)

benchmark= api.Data.get('還原日K(個股、ETF、大盤)-單股單期' ,BM).set_index('日期')['收盤價']
rp= api.backtest(data=dfX,
        symbol='id',
        date='date',
        sig_value='adjclose',
        open_value='adjopen',  open_shift=True,   
        close_value='adjopen', close_shift=True,  
        qty='qty',
        longsig='sig',
        earn=50,loss=15,
        fee = c*0.0001425,
        force_exit= msmp.list['delist'],
        benchmark=benchmark,
        )



										
									
加入我的收藏 複製程式
  • 年化報酬

      +10.25%
  • 夏普值

      0.9
  • 最大虧損

      -15.75%
  • 勝率

      +37.0%
技術面
看更多
  • 1
  • 2
  • 3
  • 4

使用聲明

1.網站內容係用戶自行操作程式邏輯,統計公開一般性財經數據之結果,所有回測皆為歷史資料模擬教學,不代表未來實際績效,純屬參考性質,請勿視為買賣金融商品或其他投資之建議或邀約。

2.本平台以上資料整理僅供參考僅提供作為輔助參考,不代表標的推薦,使用者不應以此作為投資或交易行為之唯一依據。對於使用者因採用本系統所做之任何投資行為所導致之直接或間接損失,均不負任何損害賠償及法律上之責任。

3. 使用者應知悉任何投資工具及投資行為皆有風險,進行任何投資行為所產生之風險及盈虧,均須自行承擔,並就投資結果自行負責