量化投资学习

金融

什么是金融?
金融:就是对现有资源进行重新整合之后,实现价值和利润的等效流通。
通俗来说,金融就是你有钱,但对创业没有想法,将钱融给需要做大做强的公司,等到上市,市值翻倍,从中获利。
金融工具:在金融市场中可交易的金融资产(股票、期货、黄金、外汇、基金等),就是将钱融给别人的方式。

  • 期货相当于现货,两人对货物的未来价格趋势的一种约定。
  • 黄金稳定,当需要保值的时候一种投资。
  • 外汇:跟汇率有关,波动太小,一般大公司操作
  • 基金:基金经理,个人将钱交给基金经理,基金公司会吸纳各个散户的钱,基金公司通过各种投资,赚钱后分给投资者,风险小,收益不如股票
  • 股票: 股份公司发给出资人的一种凭证,股票的持有者就是股份公司的股东。股票的作用是出资证明、证明股东身份、对公司经营发表意见。通过公司分红以及交易(卖掉一部分股份套现)获利。

上市/IPO:企业通过证券交易所公开向社会增发股票以募集资金。公司去证监会申请上市,证监会审核以规避所有风险,在证券交易所公开。
股票的分类:

  • 股票按业绩分类:
    蓝筹股:资本雄厚、信誉优良的公司的股票
    绩优股:业绩优良的公司的股票
    ST股:特别处理股票,连续两年亏损或者每股净资产低于股票面值
  • 股票按上市地区分类:
    A股:中国大陆上市(上海或者深圳证券交易所),人民币认购买卖(T+1,涨跌幅10%),股票波动不能大于10%,为了保护股民,有涨停跌停之说;T就代表交割日,今天买出去,明天才可以卖出去
    B股:中国大陆上市,外币认购买卖(T+1,T+3),T+3交收日,三天之后到账。
    H股:中国香港上市(T+0,涨跌幅不设限制)
    N股:美国纽约上市
    S股:新加坡上市

股票市场的构成

  • 上市公司
  • 投资者
  • 证监会(决定能否上市)
  • 证券业协会
  • 交易所:处理各种各样的信息
  • 证券中介机构:不向小股民小散户发售股票,证券交易所需要有席位,证券中介机构帮小股民代买股票,赚取席位费
  • 交易所:
    上海证券交易所:只有一个主板(沪指)
    指数反映了大盘整体的趋势,整个市场假如有一万亿,七八千亿都在涨,通过趋势分析,大盘总体在涨。
    深圳证券交易所:
    主板:大型成熟企业(深成指)
    中小板:经营规模较小
    创业板:尚处于成长期的创业企业

影响股价的因素:公司自身因素、行业因素(最近人工智能发展的不错,很多公司会涨)、市场因素(是影响股价的最根本的因素)、心理因素、经济因素(国家的政策,利率 )、政治因素

股票买卖(A股)
委托买卖股票:个人不能直接买卖,需要在券商开户,进行委托购买
股票交易日:周一到周五(非法定节假日)
交易时间:

  1. 9:00-9:15 开门但不做竞价
  2. 9:15-9:25 开盘集合竞价,让成交量最大
  3. 9:30-11:30 前市,连续竞价时间
  4. 13:00-15:00 后市,连续竞价
  5. 14:58-15:00 深交所收盘集合竞价时间

金融分析:

  1. 基本面分析
    宏观经济面分析:国家的财政政策、货币政策
    行业分析
    公司分析:财务数据、业绩报告等
  2. 技术面分析:各项技术指标
    K线:
    量化投资学习_第1张图片
    阳线:代表股票在今天一天内是涨的,低开高走
    阴线:代表股票在今天一天内是跌的,高开低走
    MA(均线):前若干天收盘的平均值
    KDJ(随机指标)
    MACD(指数平滑移动平均线)

金融量化投资

量化投资:利用计算机技术并且采用一定的数学模型去实践投资理念,实现投资策略的过程。
量化投资的优势

  • 避免主观情绪、人性弱点和认知偏差
  • 选择更加客观 能同时包括多角度的观察和多层次的模型
  • 即使跟踪市场变化,不断发现新的统计模型,寻找交易机会
  • 在决定投资策略后,能通过回测验证其效果

量化策略
量化策略:通过一套固定的逻辑来分析、判断和决策,自动化地进行股票交易。
量化投资学习_第2张图片
策略的周期:

  • 产生想法、学习知识
  • 实现策略:Python
  • 检验策略:回测/模拟交易
  • 实盘交易
  • 优化策略/放弃策略

量化投资的方式:
自己编写:Numpy+pandas+Matplotlib
在线平台:聚宽、优矿、米筐、Quantopian
开源框架:RQAlpha、QUANTAXIS

简单策略编写

1、双均线策略

# 导入函数库
from jqdata import *

# 初始化函数,设定基准等等
def initialize(context):
    #g.security = '601318.XSHG'
    set_benchmark('000300.XSHG')
    set_option('use_real_price',True)
    #print(g.security)
    # 股票类每笔交易时的手续费是:买入时佣金万分之三,卖出时佣金万分之三加千分之一印花税, 每笔交易佣金最低扣5块钱
    set_order_cost(OrderCost(open_tax=0, close_tax=0.001, open_commission=0.0003, close_commission=0.0003, close_today_commission=0, min_commission=5), type='stock')
    
    g.security = ['601318.XSHG']
    g.p1 = 5 
    g.p2 = 30

def handle_data(context, data):
    for stock in g.security:
        #金叉 :如果5日均线大于10日均线并且不持仓
        #死叉: 如果5日均线小于10日均线并且持仓股票
        df = attribute_history(stock, g.p2) 
        ma10 = df['close'].mean()
        ma5 = df['close'][-5].mean()
        
        if ma10 > ma5 and stock  in context.portfolio.positions :
            #死叉
            order_target(stock,0)
        
        if ma10 < ma5 and stock not in context.portfolio.positions:
            #金叉
            order(stock,context.portfolio.available_cash * 0.8)
        

2、小市值策略

# 导入函数库
from jqdata import *

# 初始化函数,设定基准等等
def initialize(context):
    # 设定沪深300作为基准
    set_benchmark('000002.XSHG')
    # 开启动态复权模式(真实价格)
    set_option('use_real_price', True)
    # 输出内容到日志 log.info()

    ### 股票相关设定 ###
    # 股票类每笔交易时的手续费是:买入时佣金万分之三,卖出时佣金万分之三加千分之一印花税, 每笔交易佣金最低扣5块钱
    set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')
    g.security = get_index_stocks('000002.XSHG')
    
    g.q = query(valuation,indicator).filter(valuation.code.in_(g.security))
    
    g.N = 20
    run_monthly(handle, 1)
 
def handle(context):
    df = get_fundamentals(g.q)[['code','market_cap','roe']]
    #df = df.sort_values('market_cap').iloc[:g.N,:]
    #print(df)
    df['market_cap'] = (df['market_cap'] - df['market_cap'].min()) / (df['market_cap'].max() - df['market_cap'].min())
    df['roe'] = (df['market_cap'] - df['market_cap'].min()) / (df['market_cap'].max() - df['market_cap'].min())
    
    df['score'] = df['roe'] - df['market_cap']
    
    df = df.sort_values('score').iloc[-g.N:,:]
    
    to_hold = list(df['code'])
    to_hold = filter_paused_stock(to_hold)

        
    
    #print(current_data) 

    for stock in context.portfolio.positions:
        if stock not in to_hold:
            order_target(stock,0)
    
    tobuy = [stock for stock in to_hold if stock not in context.portfolio.positions]
    
    if len(tobuy) > 0 :
        cash_per_stock = context.portfolio.available_cash / len(tobuy)
        for stock in tobuy :
            order_value(stock,cash_per_stock)
            
# 过滤停牌股票
def filter_paused_stock(stock_list):
    current_data = get_current_data()
    return [stock for stock in stock_list if not current_data[stock].paused]

3、均线回归策略

# 导入函数库
from jqdata import *

# 初始化函数,设定基准等等
def initialize(context):
    # 设定沪深300作为基准
    set_benchmark('000300.XSHG')
    # 开启动态复权模式(真实价格)
    set_option('use_real_price', True)
    ### 股票相关设定 ###
    # 股票类每笔交易时的手续费是:买入时佣金万分之三,卖出时佣金万分之三加千分之一印花税, 每笔交易佣金最低扣5块钱
    set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')
    g.security = get_index_stocks('000300.XSHG')
    
    g.ma_days = 30    #30日均线
    g.stock_num = 10  #选股数量20
    g.stock_num_t = 20  #筛选后选股数量10
    
    ## 运行函数(reference_security为运行时间的参考标的;传入的标的只做种类区分,因此传入'000300.XSHG'或'510300.XSHG'是一样的)
    run_monthly(handle,1)

## 运行函数
def handle(context):
    sr = pd.Series(index = g.security)
    
    for stock in sr.index :
        ma = attribute_history(stock,g.ma_days)['close'].mean()
        p = get_current_data()[stock].day_open
        ratio = (ma - p) / ma #偏离程度
        sr[stock] = ratio
    #print(sr.index)
    to_hold = sr.nlargest(g.stock_num.t).index.values
    to_hold = skip_paused_stock(to_hold)
    to_hold = to_hold[-g.stock_num:]
    #print(to_hold)
    
    #卖出股票
    for stock in context.portfolio.positions:
        if stock not in to_hold:
            order(stock,0)
    
    #买入股票        
    to_buy = [stock for stock in to_hold if stock not in context.portfolio.positions]
    
    if len(to_buy) > 0:
        cash = context.portfolio.available_cash
        cash_per_stock = cash / len(to_buy)
        
        for stock in to_buy:
            order_value(stock,cash_per_stock)

# 跳过停牌股票
def skip_paused_stock(tobuy_list):
    current_data = get_current_data()
    return [stock for stock in tobuy_list if not current_data[stock].paused]

4、布林带策略
布林线:由三条轨道线组成,其中上下两条线为价格的压力线、支撑线,在两条线之间为均线
计算公式:
中间线=20日均线
up线=20日均线+N×SD(20日收盘价标准差)
down线=20日均线-N×SD(20日收盘价标准差)
如果涨到压力线,会跌,卖出
如果跌到支撑线,会涨,买入

你可能感兴趣的:(量化交易,金融)