def test_short_compute5(): """ 做多场2,考虑异常情况下的卖出 """ busi_date = "2017-03-20" data = {} data["trade_id"] = "trade_id" data["secu_acc_id"] = "secu_acc_id" data["prd_no"] = "prd_no" data['open_date'] = "2017-03-10" data["busi_date"] = busi_date data['liab_qty'] = 0 data['mkt_val'] = 0. data["trd_detail"] = [] data['now_trd'] = [{ "trd_qty": 800, "trd_cash_flow": 4000, "timestamp": 1489626000 }, { "trd_qty": -150, "trd_cash_flow": -1200, "timestamp": 1489626001 }, { "trd_qty": 150, "trd_cash_flow": 1000, "timestamp": 1489626002 }] data["total_in"] = 0. data["total_out"] = 0. re = short_compute(data, busi_date) assert_equal(re['exception_label'], 1) assert_less(0.0 - float(re["trd_detail"][0]["return"]), 1e-4) assert_less(0.0 - float(re["trd_detail"][1]["return"]), 1e-4) assert_less(200.0 - float(re["trd_detail"][2]["return"]), 1e-4)
def test_short_compute(): """ 做空场景1,考虑正常情况下,在计算日无交易 """ busi_date = "2017-03-20" data = {} data["trade_id"] = "trade_id" data["secu_acc_id"] = "secu_acc_id" data["prd_no"] = "prd_no" data['open_date'] = "2017-03-10" data["busi_date"] = busi_date data['liab_qty'] = -950 data['mkt_val'] = -10000. data["trd_detail"] = [{ "trd_amt": "-8000", "trd_qty": "-800", "trd_date": "2017-03-10", "return": "0.0" }, { "trd_amt": "-2000", "trd_qty": "-150", "trd_date": "2017-03-12", "return": "0.0" }] data['now_trd'] = None data["total_in"] = 0. data["total_out"] = 0. re = short_compute(data, busi_date) assert_equal(re['total_in'], 0.) assert_equal(re['total_out'], 10000.) assert_equal(re['remain_val'], -10000.) assert_equal(re['remain_liab_qty'], -950)
def test_short_compute4(): """ 做多场2,考虑金额正常卖出 """ busi_date = "2017-03-20" data = {} data["trade_id"] = "trade_id" data["secu_acc_id"] = "secu_acc_id" data["prd_no"] = "prd_no" data['open_date'] = "2017-03-10" data["busi_date"] = busi_date data['liab_qty'] = 0 data['mkt_val'] = 0. data["trd_detail"] = [{ "trd_amt": "-8000", "trd_qty": "-800", "trd_date": "2017-03-10", "return": "0.0" }, { "trd_amt": "-2000", "trd_qty": "-150", "trd_date": "2017-03-12", "return": "0.0" }] data['now_trd'] = [{ "trd_qty": 800, "trd_cash_flow": 4000, "timestamp": 1489626002 }, { "trd_qty": 150, "trd_cash_flow": 1000, "timestamp": 1489626001 }] data["total_in"] = 0. data["total_out"] = 0. re = short_compute(data, busi_date) assert_equal(re['return_rate'], 1.) assert_equal(re['total_in'], 5000.) assert_equal(re['total_out'], 10000.) assert_equal(re['exception_label'], 0)
def daily_compute(self, busi_date): """ """ spark = self.spark yesterday = get_date(self.date_order, self.order_date, busi_date, -1) unclose = spark.sql("select * from %s.%s where busi_date='%s'" % (self.fdata, self.unclose_table, yesterday)) trd = spark.sql("select * from %s.%s where busi_date='%s'" % (self.odata, self.cash_flow_table, busi_date)) trd = trd.filter("trd_type='short_related' and prd_no!='0.0'") trd = trd.withColumn( "now_trd", func.struct("trd_qty", "trd_cash_flow", "timestamp")) trd = trd.groupBy("trade_id", "secu_acc_id", "prd_no") \ .agg(func.collect_list("now_trd").alias("now_trd")) trd.persist(StorageLevel.DISK_ONLY) trd.count() debt = spark.sql("select * from %s.%s where busi_date='%s'" % (self.odata, self.debt_table, busi_date)) debt = debt.select("trade_id", "secu_acc_id", "prd_no", "liab_qty", "mkt_val") debt = debt.filter("prd_no!='0.0'") df = full_outer_join(unclose, trd, ["trade_id", "secu_acc_id", "prd_no"]) df = full_outer_join(df, debt, ["trade_id", "secu_acc_id", "prd_no"]) df.persist(StorageLevel.DISK_ONLY) df.count() data = df.rdd.map(lambda x: Row(**short_compute( x.asDict(recursive=True), busi_date))) if data.count() > 0: data = data.toDF() close = data.filter("remain_liab_qty = 0") close = close.withColumn("close_date", close.busi_date) self.check_data(close) unclose = data.filter("remain_liab_qty != 0") self.save_close_data(close, busi_date) self.save_unclose_data(unclose, busi_date) else: print "清仓股票收益做空没有数据输出"