使用Tushare統計收盤價中位數

使用Tushare統計收盤價中位數

獲取交易數據

tushare只能獲取一隻股票的一段時間成交數據或某一天全部股票成交數據,我選擇獲取一隻股票的歷史數據然後存起來再計算

#coding:utf8
import tushare as ts

tushare_token = 'xxxxxxxxxxxxxxxxxxxx'
ts.set_token(tushare_token)
pro = ts.pro_api()

def getStockDaily(ts_code, start_date, end_date):
    '''
    input:
        ts_code str N   股票代碼(二選一)
        trade_date  str N   交易日期(二選一)
        start_date  str N   開始日期(YYYYMMDD)
        end_date    str N   結束日期(YYYYMMDD)

    output:
        ts_code str 股票代碼
        trade_date  str 交易日期
        open    float   開盤價
        high    float   最高價
        low float   最低價
        close   float   收盤價
        pre_close   float   昨收價
        change  float   漲跌額
        pct_change  float   漲跌幅
        vol float   成交量 (手)
        amount  float   成交額 (千元)
    '''
    return pro.daily(ts_code=ts_code, start_date=start_date, end_date=end_date, fields="ts_code,trade_date,close,vol,amount") #get one stock daily history

保存數據

數據保存在mysql中

class TradeDaily(Base):
    __tablename__ = 'trade_daily'
    DATE_DELIMITER = ","

    id = Column(Integer, Sequence('tradeDaily_id_seq'), primary_key=True)
    ts_code = Column(String(16), nullable=False)
    date = Column(Date, nullable=False)
    closes = Column(String(256))
    vols = Column(String(360))
    amounts = Column(String(400))

    __table_args__ = (
        UniqueConstraint('ts_code', 'date', name='ts_code_date_idx'),
    )
    
class DailyStats(Base):
    __tablename__ = 'daily_stats'

    date = Column(Date, primary_key=True)
    median_close = Column(Float(precision=4), nullable=False)

計算和保存收盤價中位數

def calc_median_close():
    with session_scope() as session:
        ds = session.query(DailyStats).order_by(DailyStats.date.desc()).first()
        if ds is not None:
            from_date = ds.date
        else:
            from_date = datetime(2000, 1, 1).date()
        today = datetime.now().date()
        for year in range(from_date.year, today.year + 1):
            m_f = 1
            m_t = 13
            if from_date.year == today.year:
                m_f = from_date.month
                m_to = today.month + 1
            for m in range(m_f, m_t):
                d = datetime(year, m, 1).date()
                if d > today:
                    print("calc median done")
                    return
                tradeCal = session.query(TradeCal).filter_by(date=d).first()
                if tradeCal is None:
                    print("trade cal %s not found" % d)
                    continue
                month_closes = []
                for tradeDaily in session.query(TradeDaily).filter_by(date=d):
                    prices = [ float(x) if x != '-' else np.nan for x in tradeDaily.closes.split(',') ]
                    month_closes.append(prices)
                if len(month_closes) < 1:
                    print('trade daily %s not found' % d)
                    continue
                df  = pd.DataFrame(np.array(month_closes), columns=tradeCal.getCals())
                median = df.median()
                for col in tradeCal.getCals():
                    close_d = datetime(year, m, int(col)).date()
                    if np.isnan(median[col]) or median[col] < 0.01:
                        print('median %s is unexists' % close_d)
                        continue
                    ds = session.query(DailyStats).filter_by(date=close_d).first()
                    if ds is None:
                        ds = DailyStats(date=close_d)
                    ds.median_close = median[col]
                    session.add(ds)
                session.commit()

畫圖

最後用matplot畫圖

def plot_median_close(start_date=None):
    import matplotlib.pyplot as plt
    lst = []
    with session_scope() as session:
        if start_date is not None:
            dss = session.query(DailyStats).filter(DailyStats.date > start_date).order_by(DailyStats.date).all()
        else:
            dss = session.query(DailyStats).order_by(DailyStats.date).all()
        for ds in dss:
            lst.append([ds.date, ds.median_close])
        df = pd.DataFrame(np.array(lst), columns=['date', 'close'])

    df.plot(x = 'date', y = 'close', kind="line", title="median close", grid=True)
    plt.show()

效果展示
在這裏插入圖片描述
覺得有意思的可以通過下面網址註冊一個玩玩
https://tushare.pro/register?reg=136270

ps. 上面策略只是我觀察市場的衆多工具中的一種,不能作爲投資唯一參考。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章